/ Hex Artifact Content
Login

Artifact ef69833cdf0e19a91ec1b305b506d100ac3f648f:


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 34  : where.c,v 1.34
0340: 33 20 32 30 30 38 2f 31 32 2f 32 33 20 32 33 3a  3 2008/12/23 23:
0350: 35 36 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a  56:22 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: 31 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  1.# 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 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1660: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1670: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  s */.  int nSlot
1680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
16a0: 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  ries in a[] */. 
16b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20   WhereTerm *a;  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
16d0: 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20  h a[] describes 
16e0: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  a term of the WH
16f0: 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20  ERE cluase */.  
1700: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1710: 63 5b 34 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[4];    /* Init
1720: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1730: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a   for a[] */.};..
1740: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
1750: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
1760: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
1770: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
1780: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
1790: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
17a0: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
17b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
17c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
17d0: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
17e0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
17f0: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
1800: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
1810: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
1820: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
1830: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
1840: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
1850: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
1860: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
1870: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1880: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1890: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
18a0: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
18b0: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
18c0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
18d0: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
18e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
18f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1900: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
1910: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1920: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1930: 2f 2a 20 54 68 65 20 4f 52 20 73 75 62 65 78 70  /* The OR subexp
1940: 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f  ression broken o
1950: 75 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ut */.  Index *p
1960: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1970: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1980: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
1990: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
19a0: 2a 20 43 6f 73 74 20 6f 66 20 65 76 61 6c 75 61  * Cost of evalua
19b0: 74 69 6e 67 20 74 68 69 73 20 4f 52 20 73 75 62  ting this OR sub
19c0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b  expression */.};
19d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
19e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
19f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  wing structure k
1a00: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20  eeps track of a 
1a10: 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65  mapping.** betwe
1a20: 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  en VDBE cursor n
1a30: 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20  umbers and bits 
1a40: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20  of the bitmasks 
1a50: 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  in WhereTerm..**
1a60: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72  .** The VDBE cur
1a70: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
1a80: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63  small integers c
1a90: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20  ontained in .** 
1aa0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75  SrcList_item.iCu
1ab0: 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54  rsor and Expr.iT
1ac0: 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f  able fields.  Fo
1ad0: 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52  r any given WHER
1ae0: 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68  E .** clause, th
1af0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1b00: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e   might not begin
1b10: 20 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79   with 0 and they
1b20: 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69   might.** contai
1b30: 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75  n gaps in the nu
1b40: 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65  mbering sequence
1b50: 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74  .  But we want t
1b60: 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a  o make maximum.*
1b70: 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74  * use of the bit
1b80: 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b  s in our bitmask
1b90: 73 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  s.  This structu
1ba0: 72 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61  re provides a ma
1bb0: 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68  pping.** from th
1bc0: 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20  e sparse cursor 
1bd0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e  numbers into con
1be0: 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72  secutive integer
1bf0: 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77  s beginning.** w
1c00: 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ith 0..**.** If 
1c10: 57 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b  WhereMaskSet.ix[
1c20: 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74  A]==B it means t
1c30: 68 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74  hat The A-th bit
1c40: 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a   of a Bitmask.**
1c50: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42   corresponds VDB
1c60: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1c70: 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74  B.  The A-th bit
1c80: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73   of a bitmask is
1c90: 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   1<<A..**.** For
1ca0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1cb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1cc0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68  pression used th
1cd0: 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73  ese VDBE.** curs
1ce0: 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32  ors:  4, 5, 8, 2
1cf0: 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e  9, 57, 73.  Then
1d00: 20 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53   the  WhereMaskS
1d10: 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  et structure.** 
1d20: 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20  would map those 
1d30: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
1d40: 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75  nto bits 0 throu
1d50: 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  gh 5..**.** Note
1d60: 20 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e   that the mappin
1d70: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
1d80: 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49  rily ordered.  I
1d90: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a  n the example.**
1da0: 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70   above, the mapp
1db0: 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b  ing might go lik
1dc0: 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35  e this:  4->3, 5
1dd0: 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30  ->1, 8->2, 29->0
1de0: 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e  ,.** 57->5, 73->
1df0: 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31  4.  Or one of 71
1e00: 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74  9 other combinat
1e10: 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73  ions might be us
1e20: 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e  ed. It.** does n
1e30: 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  ot really matter
1e40: 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72  .  What is impor
1e50: 74 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61  tant is that spa
1e60: 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  rse cursor.** nu
1e70: 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61  mbers all get ma
1e80: 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75  pped into bit nu
1e90: 6d 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  mbers that begin
1ea0: 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74   with 0 and cont
1eb0: 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a  ain.** no gaps..
1ec0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d  */.struct WhereM
1ed0: 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e  askSet {.  int n
1ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f00: 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63  er of assigned c
1f10: 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a  ursor values */.
1f20: 20 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20    int ix[BMS];  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e  /* Cursor assign
1f50: 65 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a  ed to each bit *
1f60: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68  /.};../*.** A Wh
1f70: 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 72  ereCost object r
1f80: 65 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75 70 20  ecords a lookup 
1f90: 73 74 72 61 74 65 67 79 20 61 6e 64 20 74 68 65  strategy and the
1fa0: 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 63 6f   estimated.** co
1fb0: 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74  st of pursuing t
1fc0: 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2f  hat strategy..*/
1fd0: 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73  .struct WhereCos
1fe0: 74 20 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20  t {.  WherePlan 
1ff0: 70 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20  plan;    /* The 
2000: 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20  lookup strategy 
2010: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73  */.  double rCos
2020: 74 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 61  t;      /* Overa
2030: 6c 6c 20 63 6f 73 74 20 6f 66 20 70 75 72 73 75  ll cost of pursu
2040: 69 6e 67 20 74 68 69 73 20 73 65 61 72 63 68 20  ing this search 
2050: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2060: 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20  uble nRow;      
2070: 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
2080: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
2090: 6f 77 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ows */.};../*.**
20a0: 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68   Bitmasks for th
20b0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
20c0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c   indices are abl
20d0: 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41  e to exploit.  A
20e0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
20f0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
2100: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
2110: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
2120: 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69  g for.** terms i
2130: 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  n the where clau
2140: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se..*/.#define W
2150: 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23  O_IN     0x001.#
2160: 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20  define WO_EQ    
2170: 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57   0x002.#define W
2180: 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LT     (WO_EQ<
2190: 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_LT-TK_EQ)).
21a0: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20  #define WO_LE   
21b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45    (WO_EQ<<(TK_LE
21c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21d0: 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45   WO_GT     (WO_E
21e0: 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29  Q<<(TK_GT-TK_EQ)
21f0: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20  ).#define WO_GE 
2200: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2210: 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GE-TK_EQ)).#defi
2220: 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30  ne WO_MATCH  0x0
2230: 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53  40.#define WO_IS
2240: 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69  NULL 0x080.#defi
2250: 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31  ne WO_OR     0x1
2260: 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20  00       /* Two 
2270: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
2280: 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64  cted terms */.#d
2290: 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20  efine WO_AND    
22a0: 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54  0x200       /* T
22b0: 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63  wo or more AND-c
22c0: 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a  onnected terms *
22d0: 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c  /..#define WO_AL
22e0: 4c 20 20 20 20 30 78 66 66 66 20 20 20 20 20 20  L    0xfff      
22f0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2300: 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61  possible WO_* va
2310: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
2320: 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20  WO_SINGLE 0x0ff 
2330: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2340: 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e   all non-compoun
2350: 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  d WO_* values */
2360: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f  ../*.** Value fo
2370: 72 20 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e  r wsFlags return
2380: 65 64 20 62 79 20 62 65 73 74 49 6e 64 65 78 28  ed by bestIndex(
2390: 29 20 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a  ) and stored in.
23a0: 2a 2a 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  ** WhereLevel.ws
23b0: 46 6c 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c  Flags.  These fl
23c0: 61 67 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68  ags determine wh
23d0: 69 63 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74  ich search.** st
23e0: 72 61 74 65 67 69 65 73 20 61 72 65 20 61 70 70  rategies are app
23f0: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ropriate..**.** 
2400: 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66  The least signif
2410: 69 63 61 6e 74 20 31 32 20 62 69 74 73 20 69 73  icant 12 bits is
2420: 20 72 65 73 65 72 76 65 64 20 61 73 20 61 20 6d   reserved as a m
2430: 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75  ask for WO_ valu
2440: 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65  es above..** The
2450: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
2460: 61 67 73 20 66 69 65 6c 64 20 69 73 20 75 73 75  ags field is usu
2470: 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49  ally set to WO_I
2480: 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c  N|WO_EQ|WO_ISNUL
2490: 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  L..** But if the
24a0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69   table is the ri
24b0: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c  ght table of a l
24c0: 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c  eft join, WhereL
24d0: 65 76 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20  evel.wsFlags.** 
24e0: 69 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  is set to WO_IN|
24f0: 57 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72  WO_EQ.  The Wher
2500: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2510: 69 65 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65  ield can then be
2520: 20 75 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20   used as.** the 
2530: 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20 74  "op" parameter t
2540: 6f 20 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20  o findTerm when 
2550: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
2560: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
2570: 61 69 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c  aints..** ISNULL
2580: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
2590: 6c 20 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73  l then not be us
25a0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ed on the right 
25b0: 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a  table of a left.
25c0: 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74  ** join.  Ticket
25d0: 73 20 23 32 31 37 37 20 61 6e 64 20 23 32 31 38  s #2177 and #218
25e0: 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  9..*/.#define WH
25f0: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20  ERE_ROWID_EQ    
2600: 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20   0x00001000  /* 
2610: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
2620: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  wid IN (...) */.
2630: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
2640: 57 49 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30  WID_RANGE  0x000
2650: 30 32 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c  02000  /* rowid<
2660: 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69  EXPR and/or rowi
2670: 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  d>EXPR */.#defin
2680: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
2690: 51 20 20 20 20 30 78 30 30 30 31 30 30 30 30 20  Q    0x00010000 
26a0: 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20   /* x=EXPR or x 
26b0: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
26c0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
26d0: 5f 52 41 4e 47 45 20 30 78 30 30 30 32 30 30 30  _RANGE 0x0002000
26e0: 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64  0  /* x<EXPR and
26f0: 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64  /or x>EXPR */.#d
2700: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2710: 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34 30  MN_IN    0x00040
2720: 30 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  000  /* x IN (..
2730: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
2740: 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20  ERE_INDEXED     
2750: 20 30 78 30 30 30 37 30 30 30 30 20 20 2f 2a 20   0x00070000  /* 
2760: 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73  Anything that us
2770: 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23  es an index */.#
2780: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f  define WHERE_IN_
2790: 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30 37  ABLE      0x0007
27a0: 31 30 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f  1000  /* Able to
27b0: 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f   support an IN o
27c0: 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  perator */.#defi
27d0: 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  ne WHERE_TOP_LIM
27e0: 49 54 20 20 20 20 30 78 30 30 31 30 30 30 30 30  IT    0x00100000
27f0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
2800: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
2810: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
2820: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
2830: 30 78 30 30 32 30 30 30 30 30 20 20 2f 2a 20 78  0x00200000  /* x
2840: 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52  >EXPR or x>=EXPR
2850: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2860: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58  define WHERE_IDX
2870: 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38 30  _ONLY     0x0080
2880: 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64  0000  /* Use ind
2890: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
28a0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
28b0: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20  WHERE_ORDERBY   
28c0: 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f     0x01000000  /
28d0: 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70  * Output will ap
28e0: 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20  pear in correct 
28f0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
2900: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20   WHERE_REVERSE  
2910: 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20 20      0x02000000  
2920: 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
2930: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  se order */.#def
2940: 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45  ine WHERE_UNIQUE
2950: 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30 30         0x0400000
2960: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
2970: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
2980: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
2990: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
29a0: 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20   0x08000000  /* 
29b0: 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  Use virtual-tabl
29c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
29d0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55  #define WHERE_MU
29e0: 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30  LTI_OR     0x100
29f0: 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69  00000  /* OR usi
2a00: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69  ng multiple indi
2a10: 63 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ces */../*.** In
2a20: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
2a30: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
2a40: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
2a50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2a60: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
2a70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2a80: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
2a90: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
2aa0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
2ab0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2ac0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2ad0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2ae0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ext */.  WhereMa
2af0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20  skSet *pMaskSet 
2b00: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
2b10: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  m table cursor n
2b20: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
2b30: 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  ks */.){.  pWC->
2b40: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2b50: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
2b60: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
2b70: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
2b80: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
2b90: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
2ba0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
2bb0: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
2bc0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2bd0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2be0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2bf0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2c00: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2c10: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2c20: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2c30: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2c40: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2c50: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2c60: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2c70: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2c80: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
2c90: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
2ca0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
2cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2cc0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
2cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2ce0: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
2cf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
2d00: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62   WhereAndInfo ob
2d10: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2d20: 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66  void whereAndInf
2d30: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
2d40: 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66  *db, WhereAndInf
2d50: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
2d60: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
2d70: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2d80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d90: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
2da0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2db0: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
2dc0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
2dd0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2de0: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
2df0: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
2e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2e10: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
2e20: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
2e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e40: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2e50: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2e60: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
2e70: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73  hereTerm *a;.  s
2e80: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
2e90: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2ea0: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
2eb0: 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e  -1, a=pWC->a; i>
2ec0: 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20  =0; i--, a++){. 
2ed0: 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67     if( a->wtFlag
2ee0: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
2ef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f00: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
2f10: 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  a->pExpr);.    }
2f20: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
2f30: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
2f40: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
2f50: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  OrInfoDelete(db,
2f60: 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a   a->u.pOrInfo);.
2f70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d      }else if( a-
2f80: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2f90: 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  ANDINFO ){.     
2fa0: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2fb0: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e  ete(db, a->u.pAn
2fc0: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
2fd0: 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d  }.  if( pWC->a!=
2fe0: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
2ff0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3000: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20  e(db, pWC->a);. 
3010: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3020: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65  a single new Whe
3030: 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20  reTerm entry to 
3040: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
3050: 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54  object pWC..** T
3060: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
3070: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74   object is const
3080: 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72  ructed from Expr
3090: 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c   p and with wtFl
30a0: 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ags..** The inde
30b0: 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66  x in pWC->a[] of
30c0: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
30d0: 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  rm is returned o
30e0: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20  n success..** 0 
30f0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
3100: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
3110: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64   could not be ad
3120: 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d  ded due to a mem
3130: 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
3140: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65  n error.  The me
3150: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3160: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20  failure will be 
3170: 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74  recorded in.** t
3180: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
3190: 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  led flag so that
31a0: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75   higher-level fu
31b0: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65  nctions can dete
31c0: 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ct it..**.** Thi
31d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69  s routine will i
31e0: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
31f0: 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d   of the pWC->a[]
3200: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
3210: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ary..**.** If th
3220: 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65  e wtFlags argume
3230: 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d  nt includes TERM
3240: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72  _DYNAMIC, then r
3250: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
3260: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
3270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73   expression p is
3280: 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20   assumed by the 
3290: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
32a0: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20  ct pWC..** This 
32b0: 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20  is true even if 
32c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
32d0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ls to allocate a
32e0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a   new WhereTerm..
32f0: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20  **.** WARNING:  
3300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
3310: 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68  ht reallocate th
3320: 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  e space used to 
3330: 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65  store.** WhereTe
3340: 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65  rms.  All pointe
3350: 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73  rs to WhereTerms
3360: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c   should be inval
3370: 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20  idated after.** 
3380: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
3390: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
33a0: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
33b0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
33c0: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
33d0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
33e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
33f0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3400: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3410: 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74  , Expr *p, u8 wt
3420: 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  Flags){.  WhereT
3430: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
3440: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43  t idx;.  if( pWC
3450: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
3460: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
3470: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
3480: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
3490: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
34a0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d  se->db;.    pWC-
34b0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
34c0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
34d0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
34e0: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
34f0: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
3500: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46  ){.      if( wtF
3510: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
3520: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MIC ){.        s
3530: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3540: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  (db, p);.      }
3550: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
3560: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
3570: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
3580: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
3590: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
35a0: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
35b0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
35c0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
35d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
35e0: 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b  bFree(db, pOld);
35f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
3600: 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  nSlot = sqlite3D
3610: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
3620: 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70  pWC->a)/sizeof(p
3630: 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  WC->a[0]);.  }. 
3640: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
3650: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
3660: 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  m++];.  pTerm->p
3670: 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72  Expr = p;.  pTer
3680: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
3690: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
36a0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
36b0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
36c0: 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d  .  return idx;.}
36d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
36e0: 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20  tine identifies 
36f0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69  subexpressions i
3700: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3710: 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  se where.** each
3720: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
3730: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  s separated by t
3740: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
3750: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
3760: 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66   operator specif
3770: 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61  ied in the op pa
3780: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68  rameter.  The Wh
3790: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
37a0: 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64  ure.** is filled
37b0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
37c0: 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  o subexpressions
37d0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
37e0: 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20  **.**    WHERE  
37f0: 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63  a=='hello' AND c
3800: 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30  oalesce(b,11)<10
3810: 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52   AND (c+12!=d OR
3820: 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20   c==22).**      
3830: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20       \________/ 
3840: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
3850: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
3860: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
3870: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
3880: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  0]            sl
3890: 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20  ot[1]           
38a0: 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a      slot[2].**.*
38b0: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  * The original W
38c0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70  HERE clause in p
38d0: 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65  Expr is unaltere
38e0: 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  d.  All this rou
38f0: 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20  tine.** does is 
3900: 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72  make slot[] entr
3910: 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62  ies point to sub
3920: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e  structure within
3930: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pExpr..**.** In
3940: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
3950: 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68  ntence and in th
3960: 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74  e diagram, "slot
3970: 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a  []" refers to.**
3980: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
3990: 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  .a[] array.  The
39a0: 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72   slot[] array gr
39b0: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
39c0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
39d0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
39e0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
39f0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
3a00: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
3a10: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
3a20: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  pr, int op){.  i
3a30: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
3a40: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
3a50: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
3a60: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
3a70: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
3a80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3a90: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
3aa0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
3ab0: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
3ac0: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
3ad0: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
3ae0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
3af0: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
3b00: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
3b10: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
3b20: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
3b30: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
3b40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3b50: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
3b60: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
3b70: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
3b80: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
3b90: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
3ba0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
3bb0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
3bc0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
3bd0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
3be0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
3bf0: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
3c00: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
3c10: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
3c20: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
3c30: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
3c40: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
3c50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3c70: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
3c80: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
3c90: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
3ca0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
3cb0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
3cc0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
3cd0: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
3ce0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3cf0: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
3d00: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
3d10: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
3d20: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
3d30: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
3d40: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
3d50: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
3d60: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
3d70: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
3d80: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
3d90: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
3da0: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
3db0: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
3dc0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
3dd0: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
3de0: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
3df0: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
3e00: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
3e10: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
3e20: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
3e30: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
3e40: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3e50: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a   and generates.*
3e60: 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  * a bitmask indi
3e70: 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62  cating which tab
3e80: 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  les are used in 
3e90: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  that expression.
3ea0: 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  ** tree..**.** I
3eb0: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
3ec0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b   routine to work
3ed0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
3ee0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
3ef0: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69  .** previously i
3f00: 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65  nvoked sqlite3Re
3f10: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
3f20: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
3f30: 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  on.  See.** the 
3f40: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
3f50: 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
3f60: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
3f70: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  formation..** Th
3f80: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  e sqlite3Resolve
3f90: 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74  ExprNames() rout
3fa0: 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63  ines looks for c
3fb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a  olumn names and.
3fc0: 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70  ** sets their op
3fd0: 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55  codes to TK_COLU
3fe0: 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70  MN and their Exp
3ff0: 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20  r.iTable fields 
4000: 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63  to.** the VDBE c
4010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
4020: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
4030: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
4040: 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  s to.** translat
4050: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
4060: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73  bers into bitmas
4070: 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20  k values and OR 
4080: 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61  all.** the bitma
4090: 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f  sks together..*/
40a0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
40b0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
40c0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
40d0: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
40e0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
40f0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4100: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
4110: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
4120: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
4130: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4140: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4150: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
4160: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
4170: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4180: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
4190: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
41a0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
41b0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
41c0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
41d0: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
41e0: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
41f0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4200: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
4210: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
4220: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4230: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b  ->pLeft);.  mask
4240: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4250: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4260: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61   p->pList);.  ma
4270: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
4280: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4290: 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  Set, p->pSelect)
42a0: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  ;.  return mask;
42b0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
42c0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
42d0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
42e0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
42f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4300: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4310: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4320: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4330: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4340: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4350: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4360: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4370: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4380: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4390: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
43a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
43b0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
43c0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
43d0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
43e0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
43f0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4400: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4410: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4420: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4430: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
4440: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
4450: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4460: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4470: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
4480: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4490: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
44a0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
44b0: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
44c0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
44d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
44e0: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
44f0: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4500: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
4510: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70  >pHaving);.    p
4520: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
4530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
4540: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
4550: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
4560: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
4570: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
4580: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
4590: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
45a0: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
45b0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
45c0: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
45d0: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
45e0: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
45f0: 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a  ">=", and "IN"..
4600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
4610: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
4620: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
4630: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
4640: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
4650: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
4660: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
4670: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
4680: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
4690: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
46a0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
46b0: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
46c0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
46d0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
46e0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
46f0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
4700: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
4710: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
4720: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
4730: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
4740: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
4750: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
4760: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
4770: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
4780: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4790: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
47a0: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
47b0: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  p X"..**.** If a
47c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
47d0: 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65  nce is associate
47e0: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68  d with either th
47f0: 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a  e left or right.
4800: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
4810: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
4820: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
4830: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
4840: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
4850: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
4860: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
4870: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
4880: 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20   .** "X collate 
4890: 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68  NOCASE op Y". Th
48a0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
48b0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
48c0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
48d0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
48e0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
48f0: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
4900: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
4910: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
4920: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
4930: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
4940: 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  e EP_ExpCollate 
4950: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
4960: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
4970: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
4980: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
4990: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
49a0: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
49b0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
49c0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
49d0: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
49e0: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
49f0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
4a00: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4a10: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4a20: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
4a30: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
4a40: 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e  _IN );.  pExpr->
4a50: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20  pRight->pColl = 
4a60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4a70: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4a80: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
4a90: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
4aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4ab0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
4ac0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53  xpr->pLeft);.  S
4ad0: 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78  WAP(CollSeq*,pEx
4ae0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
4af0: 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l,pExpr->pLeft->
4b00: 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d  pColl);.  pExpr-
4b10: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d  >pRight->flags =
4b20: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
4b30: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
4b40: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65  Collate) | expLe
4b50: 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  ft;.  pExpr->pLe
4b60: 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ft->flags = (pEx
4b70: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4b80: 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74   & ~EP_ExpCollat
4b90: 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20  e) | expRight;. 
4ba0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
4bb0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
4bc0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4bd0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
4be0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
4bf0: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
4c00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
4c10: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
4c20: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
4c30: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
4c40: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
4c50: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
4c70: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
4c80: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
4c90: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
4ca0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
4cb0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
4cc0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
4cd0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
4ce0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
4cf0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
4d00: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
4d10: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
4d20: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
4d30: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
4d40: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
4d50: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
4d60: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
4d70: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
4d80: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
4d90: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
4da0: 4f 52 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  OR ){.    c = WO
4db0: 5f 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OR;.  }else{.  
4dc0: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
4dd0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
4de0: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
4df0: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
4e00: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
4e10: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
4e20: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
4e30: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
4e40: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4f 52 20 7c  ert( op!=TK_OR |
4e50: 7c 20 63 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20  | c==WO_OR );.  
4e60: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
4e70: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
4e80: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
4e90: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
4ea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4eb0: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
4ec0: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
4ed0: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
4ee0: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
4ef0: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
4f00: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
4f10: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
4f20: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
4f30: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
4f40: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
4f50: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
4f60: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
4f70: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4f80: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
4f90: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
4fa0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
4fb0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
4fc0: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
4fd0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
4fe0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
4ff0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
5000: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
5010: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
5020: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
5030: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
5040: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
5050: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
5060: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
5070: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
5080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5090: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
50a0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
50b0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
50c0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
50d0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
50e0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
50f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
5100: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5110: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
5120: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
5130: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
5140: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
5150: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
5160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
5170: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
5180: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
5190: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
51a0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
51b0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
51c0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
51d0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
51e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
51f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
5200: 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74 28  int k;.  assert(
5210: 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70   iCur>=0 );.  op
5220: 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f   &= WO_ALL;.  fo
5230: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
5240: 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b  k=pWC->nTerm; k;
5250: 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
5260: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
5270: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
5280: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
5290: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
52a0: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20  notReady)==0.   
52b0: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
52c0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
52d0: 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70  umn.       && (p
52e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
52f0: 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a  & op)!=0.    ){.
5300: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 26        if( pIdx &
5310: 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
5320: 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  or!=WO_ISNULL ){
5330: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
5340: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
5350: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
5360: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5370: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20    char idxaff;. 
5380: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
5390: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
53a0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
53b0: 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61  e;..        idxa
53c0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
53d0: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
53e0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
53f0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
5400: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
5410: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
5420: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20  tinue;..        
5430: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
5440: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
5450: 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72  ence required fr
5460: 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a  om an index for.
5470: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f          ** it to
5480: 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20 6f   be useful for o
5490: 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65 73  ptimising expres
54a0: 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20 74  sion pX. Store t
54b0: 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  his.        ** v
54c0: 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65  alue in variable
54d0: 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20   pColl..        
54e0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
54f0: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
5500: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
5510: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
5520: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
5530: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
5540: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
5550: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
5560: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
5570: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
5580: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
5590: 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28   }..        for(
55a0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
55b0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
55c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
55d0: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
55e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
55f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5600: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
5610: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
5620: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
5630: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63  ->azColl[j]) ) c
5640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
5650: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54  .      return pT
5660: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  erm;.    }.  }. 
5670: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5680: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5690: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
56a0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
56b0: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
56c0: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
56d0: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
56e0: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
56f0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
5700: 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73  se.  .**.**.*/.s
5710: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5720: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
5730: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
5740: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
5750: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
5760: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
5770: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
5780: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5790: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
57a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
57b0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
57c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
57d0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
57e0: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
57f0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
5800: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
5810: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
5820: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
5830: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
5840: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
5850: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
5860: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
5870: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
5880: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
5890: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
58a0: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
58b0: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
58c0: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
58d0: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
58e0: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
58f0: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
5900: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
5910: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
5920: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
5930: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
5940: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
5950: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
5960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5970: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5980: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5990: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
59a0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
59b0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
59c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
59d0: 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20  nt *pnPattern,  
59e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
59f0: 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69  n-wildcard prefi
5a00: 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  x characters */.
5a10: 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65    int *pisComple
5a20: 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74  te, /* True if t
5a30: 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64  he only wildcard
5a40: 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73   is % in the las
5a50: 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  t character */. 
5a60: 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20   int *pnoCase   
5a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70     /* True if up
5a80: 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76  percase is equiv
5a90: 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61  alent to lowerca
5aa0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  se */.){.  const
5ab0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72   char *z;.  Expr
5ac0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
5ad0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ;.  ExprList *pL
5ae0: 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e  ist;.  int c, cn
5af0: 74 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  t;.  char wc[3];
5b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5b10: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
5b20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
5b30: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
5b40: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
5b50: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
5b60: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
5b70: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
5b80: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
5b90: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
5ba0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
5bb0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5bc0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68  ->pList;.  pRigh
5bd0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t = pList->a[0].
5be0: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69  pExpr;.  if( pRi
5bf0: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49  ght->op!=TK_STRI
5c00: 4e 47 0a 20 20 20 26 26 20 28 70 52 69 67 68 74  NG.   && (pRight
5c10: 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
5c20: 52 20 7c 7c 20 70 52 69 67 68 74 2d 3e 69 43 6f  R || pRight->iCo
5c30: 6c 75 6d 6e 21 3d 54 4b 5f 53 54 52 49 4e 47 29  lumn!=TK_STRING)
5c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5c50: 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20  ;.  }.  pLeft = 
5c60: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
5c70: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
5c80: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5c90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5ca0: 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c   }.  pColl = sql
5cb0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
5cc0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
5cd0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 21    assert( pColl!
5ce0: 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f  =0 || pLeft->iCo
5cf0: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66  lumn==-1 );.  if
5d00: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
5d10: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
5d20: 6e 20 69 73 20 64 65 66 69 6e 65 64 20 66 6f 72  n is defined for
5d30: 20 74 68 65 20 52 4f 57 49 44 2e 20 20 55 73 65   the ROWID.  Use
5d40: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 2a 2f   the default. */
5d50: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  .    pColl = db-
5d60: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a  >pDfltColl;.  }.
5d70: 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79    if( (pColl->ty
5d80: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
5d90: 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61  BINARY || *pnoCa
5da0: 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70 43  se) &&.      (pC
5db0: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
5dc0: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c  E_COLL_NOCASE ||
5dd0: 20 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20   !*pnoCase) ){. 
5de0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5df0: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
5e00: 65 45 78 70 72 28 64 62 2c 20 70 52 69 67 68 74  eExpr(db, pRight
5e10: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
5e20: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
5e30: 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  ;.  cnt = 0;.  i
5e40: 66 28 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c  f( z ){.    whil
5e50: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
5e60: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
5e70: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
5e80: 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d  c[2] ){ cnt++; }
5e90: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  .  }.  if( cnt==
5ea0: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
5eb0: 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75  cnt] ){.    retu
5ec0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73  rn 0;.  }.  *pis
5ed0: 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74  Complete = z[cnt
5ee0: 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  ]==wc[0] && z[cn
5ef0: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61  t+1]==0;.  *pnPa
5f00: 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72  ttern = cnt;.  r
5f10: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
5f20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5f30: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
5f40: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
5f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5f60: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
5f70: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5f80: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
5f90: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
5fa0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
5fb0: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
5fc0: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
5fd0: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
5fe0: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
5ff0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
6000: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
6010: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
6020: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
6030: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
6040: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
6050: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
6060: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6070: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6080: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6090: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f  .  if( pExpr->to
60a0: 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20  ken.n!=5 ||.    
60b0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43     sqlite3StrNIC
60c0: 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
60d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
60e0: 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a  match",5)!=0 ){.
60f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6100: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
6110: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
6120: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6130: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6150: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6160: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6170: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
6190: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
61a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
61b0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
61c0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
61d0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
61e0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
61f0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6200: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6210: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6220: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6230: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6250: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6260: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6270: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
6280: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
6290: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
62a0: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
62b0: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
62c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
62d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
62e0: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
62f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6300: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
6310: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
6320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
6330: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41  UBQUERY)./*.** A
6340: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
6350: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
6360: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
6370: 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65  nnected.** subte
6380: 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a  rms.  So in:.**.
6390: 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45  **     ... WHERE
63a0: 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37    (a=5) AND (b=7
63b0: 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29   OR c=9 OR d=13)
63c0: 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20   AND (d=13).**  
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e          ^^^^^^^^
63f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a  ^^^^^^^^^^^^.**.
6400: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6410: 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73  analyzes terms s
6420: 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c  uch as the middl
6430: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62  e term in the ab
6440: 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20  ove example..** 
6450: 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  A WhereOrTerm ob
6460: 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64  ject is computed
6470: 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f   and attached to
6480: 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a   the term under.
6490: 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67  ** analysis, reg
64a0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
64b0: 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e  utcome of the an
64c0: 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a  alysis.  Hence:.
64d0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
64e0: 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d  erm.wtFlags   |=
64f0: 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a    TERM_ORINFO.**
6500: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
6510: 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64  .pOrInfo  =  a d
6520: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6530: 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d  ated WhereOrTerm
6540: 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68   object.**.** Th
6550: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
6560: 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20  lyzed must have 
6570: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f  two or more of O
6580: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  R-connected subt
6590: 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c  erms..** A singl
65a0: 65 20 73 75 62 74 65 72 6d 73 20 6d 69 67 68 74  e subterms might
65b0: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
65c0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
65d0: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
65e0: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
65f0: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
6600: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
6610: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
6620: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
6630: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
6640: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
6650: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
6660: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
6670: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
6680: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
6690: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
66a0: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
66b0: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
66c0: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
66d0: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
66e0: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
66f0: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
6700: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
6710: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
6720: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a  AND r.z=6).**.**
6730: 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 1:.**.** I
6740: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
6750: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54  re of the form T
6760: 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65  .C=expr for some
6770: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
6780: 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  f C.** a single 
6790: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
67a0: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
67b0: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
67c0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
67d0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
67e0: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
67f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
6800: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
6810: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
6820: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
6830: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
6840: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
6850: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
6860: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
6870: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
6880: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
6890: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
68a0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
68b0: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
68c0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
68d0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
68e0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
68f0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
6900: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
6910: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
6920: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
6930: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
6940: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
6950: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
6960: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
6970: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
6980: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
6990: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
69a0: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
69b0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
69c0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
69d0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
69e0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
69f0: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
6a00: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
6a10: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
6a20: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
6a30: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
6a40: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
6a50: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
6a60: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
6a70: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
6a80: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
6a90: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
6aa0: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
6ab0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
6ac0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
6ad0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
6ae0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
6af0: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
6b00: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
6b10: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6b20: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
6b30: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
6b40: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
6b50: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
6b60: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
6b70: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
6b80: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
6b90: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
6ba0: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
6bb0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
6bc0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
6bd0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
6be0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
6bf0: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
6c00: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
6c10: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65  is something the
6c20: 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75   bestIndex() rou
6c30: 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d  tine will determ
6c40: 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ine.  This analy
6c50: 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b  sis.** only look
6c60: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
6c70: 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74  terms appropriat
6c80: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
6c90: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
6ca0: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
6cb0: 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73  gh E above all s
6cc0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
6cd0: 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a  But if a term.**
6ce0: 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73   also statisfies
6cf0: 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73   case 1 (such as
6d00: 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   B) we know that
6d10: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77   the optimizer w
6d20: 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72  ill.** always pr
6d30: 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20  efer case 1, so 
6d40: 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  in that case we 
6d50: 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73  pretend that cas
6d60: 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61  e 2 is not.** sa
6d70: 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  tisfied..**.** I
6d80: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
6d90: 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ase that multipl
6da0: 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64  e tables are ind
6db0: 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61  exable.  For exa
6dc0: 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f  mple,.** (E) abo
6dd0: 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20  ve is indexable 
6de0: 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20  on tables P, Q, 
6df0: 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72  and R..**.** Ter
6e00: 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  ms that satisfy 
6e10: 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69  case 2 are candi
6e20: 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70  dates for lookup
6e30: 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70   by using.** sep
6e40: 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f  arate indices to
6e50: 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72   find rowids for
6e60: 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e   each subterm an
6e70: 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74  d composing.** t
6e80: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20  he union of all 
6e90: 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52  rowids using a R
6ea0: 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  owSet object.  T
6eb0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a  his is similar.*
6ec0: 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64  * to "bitmap ind
6ed0: 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64  ices" in other d
6ee0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e  atabase engines.
6ef0: 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45  .**.** OTHERWISE
6f00: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  :.**.** If neith
6f10: 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61  er case 1 nor ca
6f20: 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e  se 2 apply, then
6f30: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
6f40: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
6f50: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
6f60: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
6f70: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
6f80: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
6f90: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
6fa0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
6fb0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
6fc0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
6fd0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6fe0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
6ff0: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
7000: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
7010: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
7020: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7030: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
7040: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7050: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
7060: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
7070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7080: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7090: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
70a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
70c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
70d0: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
70e0: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
70f0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
7100: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
7110: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
7120: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
7130: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
7140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7150: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
7160: 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
7170: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7180: 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  t = pWC->pMaskSe
7190: 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20  t; /* Table use 
71a0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69  masks */.  int i
71b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
71e0: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
71f0: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
7200: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
7210: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
7220: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
7230: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
7240: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
7250: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
7260: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
7270: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
7280: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
7290: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
72a0: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
72b0: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
72c0: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
72d0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
72e0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
72f0: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
7300: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
7310: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
7320: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
7330: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
7340: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
7350: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
7360: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
7370: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
7380: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
7390: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
73a0: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
73b0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
73c0: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
73d0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
73e0: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
73f0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
7400: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
7410: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
7420: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
7430: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
7440: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
7450: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
7460: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
7470: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
7480: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
7490: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
74a0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
74b0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
74c0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
74d0: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
74e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
74f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7500: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
7510: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
7520: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
7530: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
7540: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
7550: 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  Set);.  whereSpl
7560: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
7570: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
7580: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
7590: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
75a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
75b0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
75c0: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
75d0: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
75e0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
75f0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7600: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
7610: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
7620: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 63  .  indexable = c
7630: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
7640: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
7650: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
7660: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
7670: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
7680: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
7690: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
76a0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
76b0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
76c0: 20 29 7b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   ){.      chngTo
76d0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  IN = 0;.      in
76e0: 64 65 78 61 62 6c 65 20 3d 20 30 3b 20 20 20 2f  dexable = 0;   /
76f0: 2a 2a 2a 2a 2a 20 46 49 58 20 4d 45 2e 20 20 53  ***** FIX ME.  S
7700: 6f 6d 65 20 41 4e 44 20 63 6c 61 75 73 65 73 20  ome AND clauses 
7710: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 2a  are indexable. *
7720: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
7730: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7740: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
7750: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20  {.      /* Skip 
7760: 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f  this term for no
7770: 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69  w.  We revisit i
7780: 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73  t when we proces
7790: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  s the.      ** c
77a0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52  orresponding TER
77b0: 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a  M_VIRTUAL term *
77c0: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
77d0: 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20     Bitmask b;.  
77e0: 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28      b = getMask(
77f0: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  pMaskSet, pOrTer
7800: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7810: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
7820: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7830: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
7840: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7850: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
7860: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
7870: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
7880: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
7890: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
78a0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
78b0: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
78c0: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
78d0: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
78e0: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
78f0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7900: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7910: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
7920: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
7930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7940: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
7950: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7960: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
7970: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
7980: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
7990: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
79a0: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
79b0: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
79c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
79d0: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
79e0: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
79f0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
7a00: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
7a10: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
7a20: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
7a30: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
7a40: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
7a50: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
7a60: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
7a70: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
7a80: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2f 0a  satisfied..  */.
7a90: 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29    if( chngToIN )
7aa0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68  {.    int okToCh
7ab0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  ngToIN = 0;     
7ac0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63  /* True if the c
7ad0: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20  onversion to IN 
7ae0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20  is valid */.    
7af0: 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  int iColumn = -1
7b00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
7b10: 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73  umn index on lhs
7b20: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
7b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73  */.    int iCurs
7b40: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
7b50: 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72   /* Table cursor
7b60: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74   common to all t
7b70: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
7b80: 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
7b90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7ba0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  unter */..    /*
7bb0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61   Search for a ta
7bc0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74  ble and column t
7bd0: 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f  hat appears on o
7be0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
7bf0: 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74     ** other of t
7c00: 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69  he == operator i
7c10: 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e  n every subterm.
7c20: 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64    That table and
7c30: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77   column.    ** w
7c40: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
7c50: 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  in iCursor and i
7c60: 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d  Column.  There m
7c70: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a  ight not be any.
7c80: 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c      ** such tabl
7c90: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53  e and column.  S
7ca0: 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  et okToChngToIN 
7cb0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
7cc0: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61  e table.    ** a
7cd0: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75  nd column is fou
7ce0: 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54  nd but leave okT
7cf0: 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20  oChngToIN false 
7d00: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
7d10: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30    */.    for(j=0
7d20: 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68  ; j<2 && !okToCh
7d30: 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20  ngToIN; j++){.  
7d40: 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f      pOrTerm = pO
7d50: 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  rWc->a;.      fo
7d60: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
7d70: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
7d80: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
7d90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
7da0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
7db0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
7dc0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7dd0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
7de0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
7df0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7e00: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ==iColumn ) cont
7e10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
7e20: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
7e30: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
7e40: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
7e50: 73 6f 72 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  sor))==0 ) conti
7e60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  nue;.        iCo
7e70: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
7e80: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
7e90: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
7ea0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
7eb0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
7ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7ed0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
7ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
7ef0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
7f00: 65 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28  ert( (chngToIN&(
7f10: 63 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20  chngToIN-1))==0 
7f20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7f30: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
7f40: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69  Mask(pMaskSet, i
7f50: 43 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 20 20 20  Column) );.     
7f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7f70: 7d 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  }.      okToChng
7f80: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
7f90: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
7fa0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
7fb0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
7fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
7fd0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
7fe0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
7ff0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
8000: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
8010: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
8020: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8030: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
8040: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8050: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
8060: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
8070: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
8080: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8090: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
80a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
80b0: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
80c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
80d0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
80e0: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
80f0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
8100: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
8110: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
8120: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
8130: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
8140: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
8150: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
8160: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
8170: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
8180: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
8190: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
81a0: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
81b0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
81c0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
81d0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
81e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
81f0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
8200: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8210: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
8220: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8230: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
8240: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
8250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8260: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8270: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8280: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
8290: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
82a0: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
82b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
82c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
82d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
82e0: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
82f0: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
8300: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
8310: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
8320: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
8330: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
8340: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
8350: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
8360: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
8370: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
8380: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
8390: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
83a0: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
83b0: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
83c0: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
83d0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
83e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
83f0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
8400: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
8410: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
8420: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8430: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
8440: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
8450: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
8460: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8470: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
8480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8490: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
84a0: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
84b0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
84c0: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
84d0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
84e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
84f0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
8500: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8510: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
8520: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
8530: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8540: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
8550: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8560: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
8570: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8580: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8590: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
85a0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
85b0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
85c0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
85d0: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
85e0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
85f0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
8600: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8610: 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72  Append(pWC->pPar
8620: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c  se, pList, pDup,
8630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65   0);.        pLe
8640: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
8650: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
8660: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
8670: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
8680: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
8690: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
86a0: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  eft);.      pNew
86b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
86c0: 62 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  b, TK_IN, pDup, 
86d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
86e0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
86f0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
8700: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
8710: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
8720: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
8730: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c  pNew->pList = pL
8740: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
8750: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
8760: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
8770: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
8780: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
8790: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
87a0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
87b0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
87c0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
87d0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
87e0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
87f0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
8800: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
8810: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
8820: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
8830: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
8840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8860: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
8870: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8880: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
8890: 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65  or = 0;  /* case
88a0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
88b0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
88c0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
88d0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
88e0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
88f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
8900: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  */.../*.** The i
8910: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
8920: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
8930: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
8940: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
8950: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
8960: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
8970: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
8980: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
8990: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
89a0: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
89b0: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
89c0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
89d0: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
89e0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
89f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8a00: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
8a10: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
8a20: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
8a30: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
8a40: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
8a50: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
8a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
8a70: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
8a80: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
8a90: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
8aa0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
8ab0: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
8ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
8ad0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
8ae0: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
8af0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
8b00: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
8b10: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
8b20: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
8b30: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
8b40: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
8b50: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
8b60: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
8b70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
8b80: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
8b90: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
8ba0: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
8bb0: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
8bc0: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
8bd0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
8be0: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
8bf0: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
8c00: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
8c10: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
8c20: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
8c30: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
8c40: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
8c50: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
8c60: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
8c70: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
8c80: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
8c90: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
8ca0: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
8cb0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
8cc0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
8cd0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
8ce0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
8cf0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
8d00: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
8d10: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
8d20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8d30: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
8d40: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
8d50: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
8d60: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
8d70: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
8d80: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
8d90: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
8da0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20   *pMaskSet;     
8db0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74       /* Set of t
8dc0: 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73  able index masks
8dd0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8de0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8df0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8e00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
8e10: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
8e20: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e40: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
8e50: 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  f the pExpr->pLe
8e60: 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ft */.  Bitmask 
8e70: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
8e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
8e90: 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78  equesites of pEx
8ea0: 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  pr */.  Bitmask 
8eb0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a  extraRight = 0;.
8ec0: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a    int nPattern;.
8ed0: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
8ee0: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
8ef0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
8f20: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
8f30: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
8f40: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
8f50: 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61  Parse;     /* Pa
8f60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8f70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8f80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
8f90: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8fa0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
8fb0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8fc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
8fd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
8fe0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
8ff0: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
9000: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
9010: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
9020: 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65  ->pExpr;.  prere
9030: 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c  qLeft = exprTabl
9040: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9050: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9060: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
9070: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
9080: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
9090: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
90a0: 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  0 );.    pTerm->
90b0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
90c0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
90d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
90e0: 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20  ->pList).       
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54     | exprSelectT
9110: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9120: 65 74 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  et, pExpr->pSele
9130: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ct);.  }else if(
9140: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
9150: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
9160: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
9170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
9180: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
9190: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
91a0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
91b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
91c0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
91d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
91e0: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
91f0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9200: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
9210: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
9220: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
9230: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9240: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
9250: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
9260: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
9270: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
9280: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
9290: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
92a0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
92d0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
92e0: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
92f0: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
9300: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
9310: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
9320: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9330: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
9340: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
9350: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9360: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
9370: 77 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54  wedOp(op) && (pT
9380: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
9390: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
93a0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
93b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
93c0: 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  eft;.    Expr *p
93d0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
93e0: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70  Right;.    if( p
93f0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
9400: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
9410: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
9420: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
9430: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c        pTerm->u.l
9440: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
9450: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
9460: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9470: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
9480: 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  k(op);.    }.   
9490: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
94a0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
94b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
94c0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
94d0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
94e0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
94f0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
9500: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9510: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
9520: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
9530: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b  rDup(db, pExpr);
9540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
9550: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9560: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9570: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9580: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
9590: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
95a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
95b0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
95c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
95d0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
95e0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
95f0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
9600: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9610: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
9620: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
9630: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
9640: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
9650: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9660: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9670: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9680: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
9690: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
96a0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
96b0: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
96c0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
96d0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
96e0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
96f0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
9700: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
9710: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
9720: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
9730: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
9740: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
9750: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
9760: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
9770: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
9780: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  n;.      pNew->p
9790: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
97a0: 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  reqLeft;.      p
97b0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
97c0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
97d0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
97e0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
97f0: 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20  (pDup->op);.    
9800: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
9810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
9820: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
9830: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
9840: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
9850: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
9860: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
9870: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
9880: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
9890: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
98a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
98b0: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
98c0: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
98d0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
98e0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
98f0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
9900: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
9910: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
9920: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
9930: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
9940: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
9950: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
9960: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
9970: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
9980: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
9990: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
99a0: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
99b0: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
99c0: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
99d0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
99e0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
99f0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
9a00: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
9a10: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
9a20: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
9a30: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
9a40: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
9a50: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
9a60: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
9a70: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
9a80: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
9a90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
9aa0: 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  EEN ){.    ExprL
9ab0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
9ac0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
9ad0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
9ae0: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
9af0: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
9b00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
9b10: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
9b20: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
9b30: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
9b40: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
9b50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
9b60: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
9b70: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
9b80: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
9b90: 33 45 78 70 72 28 64 62 2c 20 6f 70 73 5b 69 5d  3Expr(db, ops[i]
9ba0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
9bb0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
9bc0: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9bf0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
9c00: 70 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20  pExpr), 0);.    
9c10: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
9c20: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
9c30: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
9c40: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
9c50: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
9c60: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9c70: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
9c80: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
9c90: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
9ca0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
9cb0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
9cc0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9cd0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9ce0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
9cf0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
9d00: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9d10: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
9d20: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
9d30: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
9d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
9d50: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
9d60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9d70: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
9d80: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
9d90: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
9da0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
9db0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
9dc0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
9dd0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
9de0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
9df0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
9e00: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
9e10: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
9e20: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 7d  C, idxTerm);.  }
9e30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9e40: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
9e50: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
9e60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
9e70: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
9e80: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
9e90: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
9ea0: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
9eb0: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
9ec0: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
9ed0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
9ee0: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
9ef0: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
9f00: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
9f10: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
9f20: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
9f30: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
9f40: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
9f50: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
9f60: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
9f70: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
9f80: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
9f90: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
9fa0: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
9fb0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
9fc0: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
9fd0: 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c    if( isLikeOrGl
9fe0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
9ff0: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
a000: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
a010: 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  e) ){.    Expr *
a020: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
a030: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31 2c      Expr *pStr1,
a040: 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78 70   *pStr2;.    Exp
a050: 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a 70  r *pNewExpr1, *p
a060: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
a070: 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e 65  t idxNew1, idxNe
a080: 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d  w2;..    pLeft =
a090: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
a0a0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
a0b0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
a0c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a0d0: 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73 71  ;.    pStr1 = sq
a0e0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
a0f0: 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c  e, TK_STRING, 0,
a100: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
a110: 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73  pStr1 ){.      s
a120: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
a130: 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f 6b 65  db, &pStr1->toke
a140: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  n, &pRight->toke
a150: 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d  n);.      pStr1-
a160: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74  >token.n = nPatt
a170: 65 72 6e 3b 0a 20 20 20 20 20 20 70 53 74 72 31  ern;.      pStr1
a180: 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44 65 71  ->flags = EP_Deq
a190: 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  uoted;.    }.   
a1a0: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
a1b0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
a1c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  1);.    if( !db-
a1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a1e0: 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
a1f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a200: 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pStr2->token.dyn
a210: 20 29 3b 0a 20 20 20 20 20 20 70 43 20 3d 20 28   );.      pC = (
a220: 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65  u8*)&pStr2->toke
a230: 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b  n.z[nPattern-1];
a240: 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a  .      c = *pC;.
a250: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
a260: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a270: 63 3d 3d 27 40 27 20 29 20 69 73 43 6f 6d 70 6c  c=='@' ) isCompl
a280: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
a290: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
a2a0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
a2b0: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
a2c0: 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
a2d0: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
a2e0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
a2f0: 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65  e, TK_GE, sqlite
a300: 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66  3ExprDup(db,pLef
a310: 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  t), pStr1, 0);. 
a320: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
a330: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
a340: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
a350: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
a360: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
a370: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31  estcase( idxNew1
a380: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
a390: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
a3a0: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
a3b0: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
a3c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a3d0: 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45   TK_LT, sqlite3E
a3e0: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29  xprDup(db,pLeft)
a3f0: 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20  , pStr2, 0);.   
a400: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
a410: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
a420: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
a430: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
a440: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
a450: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
a460: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
a470: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
a480: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
a490: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a4a0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
a4b0: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
a4c0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
a4d0: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
a4e0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
a4f0: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
a500: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
a510: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
a520: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
a530: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
a540: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
a550: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
a560: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a570: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
a580: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
a590: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
a5a0: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
a5b0: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
a5c0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
a5d0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a5e0: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
a5f0: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
a600: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
a610: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
a620: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
a630: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
a640: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
a650: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
a660: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
a670: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
a680: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
a690: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
a6a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
a6b0: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
a6c0: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
a6d0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
a6e0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
a6f0: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
a700: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
a710: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
a720: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
a730: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
a740: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
a750: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
a760: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
a770: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
a780: 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20     prereqExpr = 
a790: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
a7a0: 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29  MaskSet, pRight)
a7b0: 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75  ;.    prereqColu
a7c0: 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  mn = exprTableUs
a7d0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
a7e0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70  eft);.    if( (p
a7f0: 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72  rereqExpr & prer
a800: 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a  eqColumn)==0 ){.
a810: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
a820: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
a830: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
a840: 70 72 28 64 62 2c 20 54 4b 5f 4d 41 54 43 48 2c  pr(db, TK_MATCH,
a850: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
a860: 75 70 28 64 62 2c 20 70 52 69 67 68 74 29 2c 20  up(db, pRight), 
a870: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
a880: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a890: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
a8a0: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
a8b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
a8c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a8d0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
a8e0: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
a8f0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
a900: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
a910: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
a920: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
a930: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
a940: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
a950: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
a960: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a970: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
a980: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
a990: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a9a0: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
a9b0: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
a9c0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a9d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a9e0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a9f0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
aa00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
aa10: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
aa20: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
aa30: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
aa40: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
aa50: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
aa60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
aa70: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
aa80: 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50  TABLE */..  /* P
aa90: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
aaa0: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
aab0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
aac0: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
aad0: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
aae0: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
aaf0: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
ab00: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
ab10: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
ab20: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
ab30: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
ab40: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
ab50: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
ab60: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
ab70: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
ab80: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
ab90: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
aba0: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
abb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
abc0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
abd0: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
abe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
abf0: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
ac00: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
ac10: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
ac20: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
ac30: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
ac40: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
ac50: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
ac60: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
ac70: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
ac80: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
ac90: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
aca0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
acd0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
ace0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
acf0: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
ad00: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
ad10: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
ad20: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
ad30: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
ad40: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
ad50: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
ad60: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
ad70: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
ad80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ad90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ada0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
adb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
adc0: 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20  decides if pIdx 
add0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
ade0: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
adf0: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20   BY.** clause.  
ae00: 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65  If it can, it re
ae10: 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64  turns 1.  If pId
ae20: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
ae30: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
ae40: 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f   clause, this ro
ae50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
ae60: 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
ae70: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
ae80: 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c  lause from a SEL
ae90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
aea0: 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c  pTab is the.** l
aeb0: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft-most table i
aec0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
aed0: 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53  e of that same S
aee0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
aef0: 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  and.** the table
af00: 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75   has a cursor nu
af10: 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20  mber of "base". 
af20: 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65   pIdx is an inde
af30: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  x on pTab..**.**
af40: 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e   nEqCol is the n
af50: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
af60: 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72   of pIdx that ar
af70: 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69  e used as equali
af80: 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  ty.** constraint
af90: 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65  s.  Any of these
afa0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20   columns may be 
afb0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65  missing from the
afc0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
afd0: 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63  use and the matc
afe0: 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61  h can still be a
aff0: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
b000: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
b010: 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 6d   ORDER BY that m
b020: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
b030: 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
b040: 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20  ither.** ASC or 
b050: 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66  DESC.  (Terms of
b060: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b070: 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65 6e  ause past the en
b080: 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a  d of a UNIQUE.**
b090: 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65   index do not ne
b0a0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
b0b0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20  is constraint.) 
b0c0: 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75   The *pbRev valu
b0d0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31  e is.** set to 1
b0e0: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
b0f0: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44   clause is all D
b100: 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73 65  ESC and it is se
b110: 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65  t to 0 if.** the
b120: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b130: 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a   is all ASC..*/.
b140: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72  static int isSor
b150: 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72  tingIndex(.  Par
b160: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b170: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b180: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
b190: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
b1a0: 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20  Set, /* Mapping 
b1b0: 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f  from table curso
b1c0: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
b1d0: 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  maps */.  Index 
b1e0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
b1f0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
b200: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f  e are testing */
b210: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
b220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
b230: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
b240: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
b250: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
b260: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
b270: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
b280: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
b290: 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20  int nEqCol,     
b2a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b2b0: 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d  r of index colum
b2c0: 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74  ns with == const
b2d0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
b2e0: 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20  *pbRev          
b2f0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
b300: 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44  if ORDER BY is D
b310: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ESC */.){.  int 
b320: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
b330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b340: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
b350: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
b360: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b370: 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65    /* XOR of inde
b380: 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73  x and ORDER BY s
b390: 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f  ort direction */
b3a0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b3d0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
b3e0: 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
b3f0: 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b  ist_item *pTerm;
b400: 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66      /* A term of
b410: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b420: 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ause */.  sqlite
b430: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b440: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
b450: 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
b460: 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  nTerm = pOrderBy
b470: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
b480: 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  t( nTerm>0 );.. 
b490: 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20   /* Match terms 
b4a0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
b4b0: 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63  clause against c
b4c0: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
b4d0: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
b4e0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e   ** Note that in
b4f0: 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d  dices have pIdx-
b500: 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72  >nColumn regular
b510: 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20   columns plus.  
b520: 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  ** one additiona
b530: 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  l column contain
b540: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20  ing the rowid.  
b550: 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  The rowid column
b560: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  .  ** of the ind
b570: 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77  ex is also allow
b580: 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  ed to match agai
b590: 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  nst the ORDER BY
b5a0: 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20  .  ** clause..  
b5b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
b5c0: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
b5d0: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
b5e0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
b5f0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b600: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
b610: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
b620: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
b630: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
b640: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
b650: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
b660: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
b670: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
b680: 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
b690: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
b6a0: 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69  is term */.    i
b6b0: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
b6c0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f    /* The i-th co
b6d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
b6e0: 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64  x.  -1 for rowid
b6f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72   */.    int iSor
b700: 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20  tOrder;    /* 1 
b710: 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20  for DESC, 0 for 
b720: 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ASC on the i-th 
b730: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
b740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b750: 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  oll; /* Name of 
b760: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
b770: 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
b780: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20  index term */.. 
b790: 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
b7a0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
b7b0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
b7c0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
b7d0: 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
b7e0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74        /* Can not
b7f0: 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f   use an index so
b800: 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74  rt on anything t
b810: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c  hat is not a col
b820: 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  umn in the.     
b830: 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61   ** left-most ta
b840: 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ble of the FROM 
b850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
b860: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b870: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
b880: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
b890: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
b8a0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
b8b0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
b8c0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
b8d0: 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
b8e0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
b8f0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
b900: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
b910: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
b920: 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  ==pIdx->pTable->
b930: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
b940: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
b950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f       }.      iSo
b960: 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e  rtOrder = pIdx->
b970: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
b980: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64       zColl = pId
b990: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
b9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b9b0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
b9c0: 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20     iSortOrder = 
b9d0: 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  0;.      zColl =
b9e0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
b9f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78     }.    if( pEx
ba00: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
ba10: 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53  lumn || sqlite3S
ba20: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
ba30: 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
ba40: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f       /* Term j o
ba50: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
ba60: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
ba70: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66  atch column i of
ba80: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
ba90: 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c      if( i<nEqCol
baa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
bab0: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
bac0: 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  n that is constr
bad0: 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c  ained by == fail
bae0: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20  s to match an.  
baf0: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
bb00: 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20  Y term, that is 
bb10: 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65  OK.  Just ignore
bb20: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   that column of 
bb30: 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
bb40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
bb50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
bb60: 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e  se if( i==pIdx->
bb70: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
bb80: 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75     /* Index colu
bb90: 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69  mn i is the rowi
bba0: 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65  d.  All other te
bbb0: 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  rms match. */.  
bbc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bbd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bbe0: 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78    /* If an index
bbf0: 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f   column fails to
bc00: 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f   match and is no
bc10: 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
bc20: 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   ==.        ** t
bc30: 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61  hen the index ca
bc40: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
bc50: 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72   ORDER BY constr
bc60: 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aint..        */
bc70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bc80: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
bc90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
bca0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  x->aSortOrder!=0
bcb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
bcc0: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
bcd0: 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f  ==0 || pTerm->so
bce0: 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
bcf0: 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f    assert( iSortO
bd00: 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74  rder==0 || iSort
bd10: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
bd20: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
bd30: 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65  iSortOrder ^ pTe
bd40: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
bd50: 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20     if( i>nEqCol 
bd60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  ){.      if( ter
bd70: 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74  mSortOrder!=sort
bd80: 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Order ){.       
bd90: 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20   /* Indices can 
bda0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
bdb0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
bdc0: 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  ms past the.    
bdd0: 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
bde0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
bdf0: 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20  all either DESC 
be00: 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20  or ASC. */.     
be10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
be20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
be30: 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
be40: 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
be50: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
be60: 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20      pTerm++;.   
be70: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26   if( iColumn<0 &
be80: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
be90: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
bea0: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
beb0: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  base) ){.      /
bec0: 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64  * If the indexed
bed0: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70   column is the p
bee0: 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65  rimary key and e
bef0: 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65  verything matche
bf00: 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61  s.      ** so fa
bf10: 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  r and none of th
bf20: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  e ORDER BY terms
bf30: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65   to the right re
bf40: 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20  ference other.  
bf50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e      ** tables in
bf60: 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20   the join, then 
bf70: 77 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74  we are assured t
bf80: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61  hat the index ca
bf90: 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20  n be used .     
bfa0: 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61   ** to sort beca
bfb0: 75 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  use the primary 
bfc0: 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e  key is unique an
bfd0: 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65  d so none of the
bfe0: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
bff0: 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b  columns will mak
c000: 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65  e any difference
c010: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c020: 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d  j = nTerm;.    }
c030: 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d  .  }..  *pbRev =
c040: 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20   sortOrder!=0;. 
c050: 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b   if( j>=nTerm ){
c060: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d  .    /* All term
c070: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
c080: 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76  Y clause are cov
c090: 65 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64  ered by this ind
c0a0: 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ex so.    ** thi
c0b0: 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  s index can be u
c0c0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  sed for sorting.
c0d0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
c0e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
c0f0: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
c100: 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e  ne && i==pIdx->n
c110: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20  Column.      && 
c120: 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72  !referencesOther
c130: 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c  Tables(pOrderBy,
c140: 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61   pMaskSet, j, ba
c150: 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  se) ){.    /* Al
c160: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20  l terms of this 
c170: 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65  index match some
c180: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f   prefix of the O
c190: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
c1a0: 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e     ** and the in
c1b0: 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e  dex is UNIQUE an
c1c0: 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68  d no terms on th
c1d0: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52  e tail of the OR
c1e0: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
c1f0: 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f  ause reference o
c200: 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61  ther tables in a
c210: 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20   join.  If this 
c220: 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e  is all true then
c230: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65  .    ** the orde
c240: 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73  r by clause is s
c250: 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20  uperfluous. */. 
c260: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c270: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c280: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c  /*.** Check tabl
c290: 65 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  e to see if the 
c2a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c2b0: 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20  in pOrderBy can 
c2c0: 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  be satisfied.** 
c2d0: 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72  by sorting in or
c2e0: 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52  der of ROWID.  R
c2f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f  eturn true if so
c300: 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20   and set *pbRev 
c310: 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f  to be.** true fo
c320: 72 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20  r reverse ROWID 
c330: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f  and false for fo
c340: 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65  rward ROWID orde
c350: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c360: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
c370: 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  (.  int base,   
c380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c390: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
c3a0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
c3b0: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
c3c0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
c3d0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
c3e0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
c3f0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
c400: 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20  Set, /* Mapping 
c410: 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f  from table curso
c420: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
c430: 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20  .  int *pbRev   
c440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c450: 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20  t to 1 if ORDER 
c460: 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b  BY is DESC */.){
c470: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61  .  Expr *p;..  a
c480: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
c490: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c4a0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
c4b0: 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65  0 );.  p = pOrde
c4c0: 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  rBy->a[0].pExpr;
c4d0: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
c4e0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
c4f0: 61 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d  able==base && p-
c500: 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20  >iColumn==-1.   
c510: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
c520: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
c530: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31  rBy, pMaskSet, 1
c540: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a  , base) ){.    *
c550: 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79  pbRev = pOrderBy
c560: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
c570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
c580: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
c5a0: 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74   a crude estimat
c5b0: 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74  e of the logarit
c5c0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
c5d0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
c5e0: 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62  sults need not b
c5f0: 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69  e exact.  This i
c600: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
c610: 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68  estimating.** th
c620: 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20  e total cost of 
c630: 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61  performing opera
c640: 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67  tions with O(log
c650: 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a  N) or O(NlogN).*
c660: 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42  * complexity.  B
c670: 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74  ecause N is just
c680: 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20   a guess, it is 
c690: 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79  no great tragedy
c6a0: 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61   if.** logN is a
c6b0: 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a   little off..*/.
c6c0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73  static double es
c6d0: 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a  tLog(double N){.
c6e0: 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20    double logN = 
c6f0: 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20  1;.  double x = 
c700: 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78  10;.  while( N>x
c710: 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20   ){.    logN += 
c720: 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a  1;.    x *= 10;.
c730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67    }.  return log
c740: 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  N;.}../*.** Two 
c750: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
c760: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
c770: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
c780: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
c790: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
c7a0: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
c7b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
c7c0: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
c7d0: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
c7e0: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
c7f0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
c800: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
c810: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
c820: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c830: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c840: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
c850: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
c860: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
c870: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
c880: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
c890: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
c8a0: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
c8b0: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
c8c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
c8d0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
c8e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
c8f0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
c900: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
c910: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
c920: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
c930: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
c940: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
c950: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
c960: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
c970: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
c980: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
c990: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
c9a0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
c9b0: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
c9c0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
c9d0: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
c9e0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
c9f0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
ca00: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
ca10: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
ca20: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
ca30: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
ca40: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
ca50: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
ca60: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
ca70: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
ca80: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
ca90: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
caa0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
cab0: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
cac0: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
cad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
cae0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
caf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
cb00: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
cb10: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
cb20: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
cb30: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
cb40: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
cb50: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
cb60: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
cb70: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
cb80: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
cb90: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
cba0: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
cbb0: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
cbc0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
cbd0: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
cbe0: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
cbf0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
cc00: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
cc10: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
cc20: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
cc30: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
cc40: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
cc50: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
cc60: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
cc70: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
cc80: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
cc90: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
cca0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
ccb0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
ccc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ccd0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
cce0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73   Compute the bes
ccf0: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69  t index for a vi
cd00: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
cd10: 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  ** The best inde
cd20: 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79  x is computed by
cd30: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
cd40: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
cd50: 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d  rtual.** table m
cd60: 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  odule.  This rou
cd70: 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a  tine is really j
cd80: 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68  ust a wrapper th
cd90: 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68  at sets up.** th
cda0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
cdb0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
cdc0: 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
cdd0: 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a  ommunicate with.
cde0: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  ** xBestIndex..*
cdf0: 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20  *.** In a join, 
ce00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
ce10: 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c  ht be called mul
ce20: 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20  tiple times for 
ce30: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74  the.** same virt
ce40: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
ce50: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ce60: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
ce70: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69  created.** and i
ce80: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68  nitialized on th
ce90: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
cea0: 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  on and reused on
ceb0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
cec0: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20  ** invocations. 
ced0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
cee0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
cef0: 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
cf00: 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  hen.** code is g
cf10: 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65  enerated to acce
cf20: 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ss the virtual t
cf30: 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65  able.  The where
cf40: 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a  InfoDelete() .**
cf50: 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63   routine takes c
cf60: 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74  are of freeing t
cf70: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
cf80: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
cf90: 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f  after.** everybo
cfa0: 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  dy has finished 
cfb0: 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  with it..*/.stat
cfc0: 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 56 69  ic double bestVi
cfd0: 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61  rtualIndex(.  Pa
cfe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d000: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
d010: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
d020: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
d030: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
d040: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
d050: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d060: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
d070: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
d080: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
d090: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
d0a0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
d0b0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
d0c0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
d0d0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
d0e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d0f0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
d100: 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
d110: 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
d120: 69 6e 74 20 6f 72 64 65 72 42 79 55 73 61 62 6c  int orderByUsabl
d130: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
d140: 2a 20 54 72 75 65 20 69 66 20 77 65 20 63 61 6e  * True if we can
d150: 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74 20   potential sort 
d160: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
d170: 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49  ex_info **ppIdxI
d180: 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66  nfo /* Index inf
d190: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
d1a0: 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  to xBestIndex */
d1b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
d1c0: 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
d1d0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
d1e0: 70 56 74 61 62 20 3d 20 70 54 61 62 2d 3e 70 56  pVtab = pTab->pV
d1f0: 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  tab;.  sqlite3_i
d200: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
d210: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
d220: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
d230: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
d240: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
d250: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
d260: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
d270: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
d280: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
d290: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
d2a0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
d2b0: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
d2c0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
d2d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
d2e0: 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
d2f0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
d300: 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
d310: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
d320: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
d330: 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74  nitialized for t
d340: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
d350: 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  e, then allocate
d360: 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  .  ** and initia
d370: 6c 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f  lize it now.  */
d380: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
d390: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
d3a0: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
d3b0: 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
d3c0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 52    WHERETRACE(("R
d3d0: 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78  ecomputing index
d3e0: 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c   info for %s...\
d3f0: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
d400: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74  );..    /* Count
d410: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
d420: 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
d430: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
d440: 20 72 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a   referring.    *
d450: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
d460: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  l table */.    f
d470: 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
d480: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
d490: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
d4a0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
d4b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
d4c0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
d4d0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
d4e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d4f0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
d500: 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  r&(pTerm->eOpera
d510: 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  tor-1))==0 );.  
d520: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
d530: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
d540: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  WO_IN );.      t
d550: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
d560: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
d570: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66  NULL );.      if
d580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
d590: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
d5a0: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
d5b0: 65 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b  e;.      nTerm++
d5c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d5d0: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
d5e0: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
d5f0: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
d600: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
d610: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
d620: 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  e then allocate 
d630: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f  space for the aO
d640: 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20  rderBy part of. 
d650: 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65     ** the sqlite
d660: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
d670: 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
d680: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
d690: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
d6a0: 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
d6b0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
d6c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d6d0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d6e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
d6f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
d700: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
d710: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
d720: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
d730: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
d740: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d750: 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79   if( i==pOrderBy
d760: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
d770: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f     nOrderBy = pO
d780: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
d790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d7a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
d7b0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
d7c0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
d7d0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e     */.    pIdxIn
d7e0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
d7f0: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
d800: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
d810: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
d840: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
d850: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
d860: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
d880: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
d890: 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
d8a0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
d8b0: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo==0 ){.      s
d8c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d8d0: 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
d8e0: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72  emory");.      r
d8f0: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
d900: 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20  .    *ppIdxInfo 
d910: 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20  = pIdxInfo;..   
d920: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
d930: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
d940: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
d950: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
d960: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
d970: 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
d980: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
d990: 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
d9a0: 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
d9b0: 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  .    ** changing
d9c0: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
d9d0: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
d9e0: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
d9f0: 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74  r to.    ** init
da00: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
da10: 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
da20: 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
da30: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
da40: 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
da50: 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70  dxInfo[1];.    p
da60: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
da70: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
da80: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
da90: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
daa0: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
dab0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
dac0: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
dad0: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
dae0: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a  nOrderBy];.    *
daf0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
db00: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
db10: 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a  Term;.    *(int*
db20: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
db30: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
db40: 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71  .    *(struct sq
db50: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
db60: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
db70: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
db80: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20  = pIdxCons;.    
db90: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
dba0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
dbb0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
dbc0: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
dbd0: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
dbe0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
dbf0: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
dc00: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
dc10: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
dc70: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
dc80: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
dc90: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
dca0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
dcb0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
dcc0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
dcd0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
dce0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
dcf0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
dd00: 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
dd10: 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
dd20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
dd30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
dd40: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  O_IN );.      te
dd50: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
dd60: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
dd70: 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ULL );.      if(
dd80: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
dd90: 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
dda0: 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
ddb0: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
ddc0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
ddd0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
dde0: 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  n;.      pIdxCon
ddf0: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
de00: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
de10: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
de20: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
de30: 72 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;.      /* The 
de40: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
de50: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
de60: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
de70: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
de80: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f        ** the WO_
de90: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
dea0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
deb0: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
dec0: 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
ded0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
dee0: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
def0: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  act. */.      as
df00: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
df10: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
df20: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20  AINT_EQ );.     
df30: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
df40: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
df50: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
df60: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
df70: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
df80: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
df90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
dfa0: 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
dfb0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
dfc0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dfd0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
dfe0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
dff0: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _GE );.      ass
e000: 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
e010: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
e020: 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
e030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e050: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
e060: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
e070: 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
e080: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
e090: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
e0a0: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
e0b0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
e0c0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
e0d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 49 64  pExpr;.      pId
e0e0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
e0f0: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
e100: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78  lumn;.      pIdx
e110: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
e120: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
e130: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
e140: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
e150: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73  his point, the s
e160: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e170: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
e180: 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73   pIdxInfo points
e190: 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61  .  ** to will ha
e1a0: 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ve been initiali
e1b0: 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69  zed, either duri
e1c0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ng the current i
e1d0: 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a  nvocation or.  *
e1e0: 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72  * during some pr
e1f0: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ior invocation. 
e200: 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76   Now we just hav
e210: 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74  e to customize t
e220: 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20  he.  ** details 
e230: 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20  of pIdxInfo for 
e240: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
e250: 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20  cation and pass 
e260: 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74  it to.  ** xBest
e270: 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  Index..  */..  /
e280: 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d  * The module nam
e290: 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
e2a0: 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73  d. Also, by this
e2b0: 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73   point there mus
e2c0: 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e  t.  ** be a poin
e2d0: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
e2e0: 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
e2f0: 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a  . Otherwise.  **
e300: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
e310: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75  olumnNames() wou
e320: 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75  ld have picked u
e330: 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20  p the error. .  
e340: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
e350: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26  b->azModuleArg &
e360: 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  & pTab->azModule
e370: 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65  Arg[0] );.  asse
e380: 72 74 28 20 70 56 74 61 62 20 29 3b 0a 23 69 66  rt( pVtab );.#if
e390: 20 30 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   0.  if( pTab->p
e3a0: 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Vtab==0 ){.    s
e3b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e3c0: 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65  Parse, "undefine
e3d0: 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20  d module %s for 
e3e0: 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20  table %s",.     
e3f0: 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c     pTab->azModul
e400: 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a  eArg[0], pTab->z
e410: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
e420: 6e 20 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  n 0.0;.  }.#endi
e430: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  f..  /* Set the 
e440: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
e450: 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20  able fields and 
e460: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a  initialize all .
e470: 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69    ** output vari
e480: 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20  ables to zero.. 
e490: 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72   **.  ** aConstr
e4a0: 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73  aint[].usable is
e4b0: 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72   true for constr
e4c0: 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20  aints where the 
e4d0: 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20  right-hand.  ** 
e4e0: 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  side contains on
e4f0: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ly references to
e500: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
e510: 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  eft of the curre
e520: 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  nt.  ** table.  
e530: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
e540: 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
e550: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
e560: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
e570: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
e580: 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  xpr.  **.  ** an
e590: 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  d we are evaluat
e5a0: 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  ing a join, then
e5b0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
e5c0: 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20  on column is .  
e5d0: 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66  ** only valid if
e5e0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65   all tables refe
e5f0: 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f  renced in expr o
e600: 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74  ccur to the left
e610: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
e620: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
e630: 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lumn..  **.  ** 
e640: 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
e650: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
e660: 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
e670: 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
e680: 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
e690: 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
e6a0: 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
e6b0: 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
e6c0: 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  ce.  ** even tho
e6d0: 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
e6e0: 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
e6f0: 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
e700: 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72   times..  ** For
e710: 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74   each attempt at
e720: 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65   picking an inde
e730: 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  x, the order of 
e740: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
e750: 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65  ** join might be
e760: 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65   different so we
e770: 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75   have to recompu
e780: 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  te the usable fl
e790: 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d  ag.  ** each tim
e7a0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  e..  */.  pIdxCo
e7b0: 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
e7c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
e7d0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
e7e0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
e7f0: 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
e800: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
e810: 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d  tUsage;.  for(i=
e820: 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
e830: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
e840: 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
e850: 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
e860: 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
e870: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
e880: 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  [j];.    pIdxCon
e890: 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54  s->usable =  (pT
e8a0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
e8b0: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
e8c0: 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  ?1:0;.  }.  mems
e8d0: 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
e8e0: 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
e8f0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
e900: 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49  raint);.  if( pI
e910: 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
e920: 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
e930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
e940: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
e950: 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e    }.  pIdxInfo->
e960: 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
e970: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
e980: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
e990: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
e9a0: 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
e9b0: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
e9c0: 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  d = 0;.  pIdxInf
e9d0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
e9e0: 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
e9f0: 4c 20 2f 20 32 2e 30 3b 0a 20 20 6e 4f 72 64 65  L / 2.0;.  nOrde
ea00: 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  rBy = pIdxInfo->
ea10: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
ea20: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
ea30: 42 79 20 26 26 20 21 6f 72 64 65 72 42 79 55 73  By && !orderByUs
ea40: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e  able ){.    *(in
ea50: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
ea60: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
ea70: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
ea80: 53 61 66 65 74 79 4f 66 66 28 70 50 61 72 73 65  SafetyOff(pParse
ea90: 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52 45 54 52  ->db);.  WHERETR
eaa0: 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78  ACE(("xBestIndex
eab0: 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62   for %s\n", pTab
eac0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41  ->zName));.  TRA
ead0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 49  CE_IDX_INPUTS(pI
eae0: 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20  dxInfo);.  rc = 
eaf0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
eb00: 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
eb10: 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54  , pIdxInfo);.  T
eb20: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
eb30: 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 28 76  (pIdxInfo);.  (v
eb40: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
eb50: 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  yOn(pParse->db);
eb60: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
eb70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
eb80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
eb90: 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
eba0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
ebb0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
ebc0: 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
ebd0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
ebe0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ebf0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
ec00: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
ec10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ec20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ec30: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
ec40: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
ec50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
ec60: 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
ec70: 73 65 2d 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a  se->db, pVtab->z
ec80: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
ec90: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
eca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
ecb0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
ecc0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
ecd0: 28 20 21 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  ( !pIdxInfo->aCo
ece0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
ecf0: 6c 65 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e  le && pUsage[i].
ed00: 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
ed10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ed20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
ed30: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
ed40: 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
ed50: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
ed60: 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
ed70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
ed80: 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20  urn 0.0;.    }. 
ed90: 20 7d 0a 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49   }..  *(int*)&pI
eda0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
edb0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72   = nOrderBy;.  r
edc0: 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e  eturn pIdxInfo->
edd0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d  estimatedCost;.}
ede0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
edf0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ee00: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69  BLE */../*.** Fi
ee10: 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
ee20: 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
ee30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
ee40: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  le.  Write the.*
ee50: 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  * best query pla
ee60: 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  n and its cost i
ee70: 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73  nto the WhereCos
ee80: 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65  t object supplie
ee90: 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74  d as the.** last
eea0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
eeb0: 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
eec0: 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68  t plan wins.  Th
eed0: 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
eee0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
eef0: 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
ef00: 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20  d disk I/O need 
ef10: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
ef20: 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65  equest using the
ef30: 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a   selected plan..
ef40: 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20  ** Factors that 
ef50: 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69  influence cost i
ef60: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
ef70: 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65   *  The estimate
ef80: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
ef90: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
efa0: 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a  trieved.  (The.*
efb0: 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68  *       fewer th
efc0: 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a  e better.).**.**
efd0: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
efe0: 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75  r not sorting mu
eff0: 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  st occur..**.** 
f000: 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
f010: 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20   not there must 
f020: 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b  be separate look
f030: 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ups in the.**   
f040: 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e      index and in
f050: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
f060: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
f070: 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
f080: 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65  Y clause attache
f090: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  d to the table i
f0a0: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
f0b0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
f0c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
f0d0: 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
f0e0: 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
f0f0: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
f100: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
f110: 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72  ound, then the r
f120: 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a  eturned cost is.
f130: 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ** SQLITE_BIG_DB
f140: 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 63 61 6e  L. If a plan can
f150: 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 75   be found that u
f160: 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ses the named in
f170: 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68  dex, .** then th
f180: 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c  e cost is calcul
f190: 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61  ated in the usua
f1a0: 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l way..**.** If 
f1b0: 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  a NOT INDEXED cl
f1c0: 61 75 73 65 20 77 61 73 20 61 74 74 61 63 68 65  ause was attache
f1d0: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  d to the table i
f1e0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  n the SELECT .**
f1f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
f200: 20 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20   no indexes are 
f210: 63 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65  considered. Howe
f220: 76 65 72 2c 20 74 68 65 20 73 65 6c 65 63 74 65  ver, the selecte
f230: 64 20 0a 2a 2a 20 70 6c 61 6e 20 6d 61 79 20 73  d .** plan may s
f240: 74 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74  till take advant
f250: 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  age of the table
f260: 73 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64  s built-in rowid
f270: 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  .** index..*/.st
f280: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e  atic void bestIn
f290: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
f2a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
f2b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
f2c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
f2d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
f2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f2f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f300: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
f310: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
f320: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
f330: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
f340: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
f350: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
f360: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
f370: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
f380: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
f390: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f3a0: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
f3b0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
f3c0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
f3d0: 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
f3e0: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
f3f0: 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
f400: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
f410: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
f420: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
f430: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
f440: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
f450: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
f460: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
f470: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
f480: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
f490: 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
f4a0: 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
f4b0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
f4c0: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
f4d0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b  ng */.  int rev;
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
f500: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
f510: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 77 73  rder */.  int ws
f520: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
f530: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
f540: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
f550: 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Probe */.  int n
f560: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
f570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f580: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
f590: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
f5a0: 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  t eqTermMask;   
f5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
f5c0: 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
f5d0: 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
f5e0: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f600: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
f610: 70 50 72 6f 62 65 20 2a 2f 0a 20 20 64 6f 75 62  pProbe */.  doub
f620: 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  le nRow;        
f630: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
f640: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
f650: 6f 77 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  ows in result se
f660: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
f690: 65 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  er */.  Bitmask 
f6a0: 6d 61 73 6b 53 72 63 3b 20 20 20 20 20 20 20 20  maskSrc;        
f6b0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66      /* Bitmask f
f6c0: 6f 72 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  or the pSrc tabl
f6d0: 65 20 2a 2f 0a 0a 20 20 57 48 45 52 45 54 52 41  e */..  WHERETRA
f6e0: 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20  CE(("bestIndex: 
f6f0: 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d  tbl=%s notReady=
f700: 25 6c 6c 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  %llx\n", pSrc->p
f710: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 6e 6f 74 52 65  Tab->zName,notRe
f720: 61 64 79 29 29 3b 0a 20 20 70 50 72 6f 62 65 20  ady));.  pProbe 
f730: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
f740: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 53 72 63  ndex;.  if( pSrc
f750: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
f760: 20 20 20 20 70 50 72 6f 62 65 20 3d 20 30 3b 0a      pProbe = 0;.
f770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
f780: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
f790: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
f7a0: 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20  are no terms in 
f7b0: 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63  the where.  ** c
f7c0: 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
f7d0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74   to the ROWID, t
f7e0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hen we will neve
f7f0: 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a  r be able to do.
f800: 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74    ** anything ot
f810: 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  her than a full 
f820: 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68  table scan on th
f830: 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69  is table.  We mi
f840: 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c  ght as.  ** well
f850: 20 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e   put it first in
f860: 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e   the join order.
f870: 20 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68    That way, perh
f880: 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20  aps it can be.  
f890: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ** referenced by
f8a0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
f8b0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
f8c0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20    memset(pCost, 
f8d0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  0, sizeof(*pCost
f8e0: 29 29 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65  ));.  if( pProbe
f8f0: 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64  ==0 &&.     find
f900: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
f910: 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
f920: 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  IN|WO_LT|WO_LE|W
f930: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30  O_GT|WO_GE,0)==0
f940: 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72   &&.     (pOrder
f950: 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62  By==0 || !sortab
f960: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
f970: 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70  pOrderBy, pWC->p
f980: 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29 20  MaskSet, &rev)) 
f990: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
f9a0: 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73   }.  pCost->rCos
f9b0: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
f9c0: 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  BL;..  /* Check 
f9d0: 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52  for a rowid=EXPR
f9e0: 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e   or rowid IN (..
f9f0: 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  .) constraints. 
fa00: 49 66 20 74 68 65 72 65 20 77 61 73 0a 20 20 2a  If there was.  *
fa10: 2a 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * an INDEXED BY 
fa20: 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20  clause attached 
fa30: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2c 20 73  to this table, s
fa40: 6b 69 70 20 74 68 69 73 20 73 74 65 70 2e 0a 20  kip this step.. 
fa50: 20 2a 2f 0a 20 20 69 66 28 20 21 70 53 72 63 2d   */.  if( !pSrc-
fa60: 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  >pIndex ){.    p
fa70: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
fa80: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
fa90: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
faa0: 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IN, 0);.    if
fab0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
fac0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
fad0: 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
fae0: 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
faf0: 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 20 20  ROWID_EQ;.      
fb00: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
fb10: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a  ator & WO_EQ ){.
fb20: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
fb30: 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  == is always the
fb40: 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f   best pick.  Loo
fb50: 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42  k no further.  B
fb60: 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20  ecause only.    
fb70: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
fb80: 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
fb90: 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
fba0: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
fbb0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  er */.        pC
fbc0: 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
fbd0: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
fbe0: 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55  EQ | WHERE_UNIQU
fbf0: 45 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  E;.        pCost
fc00: 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 31 3b 0a  ->plan.nEq = 1;.
fc10: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
fc20: 43 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73  CE(("... best is
fc30: 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20   rowid\n"));.   
fc40: 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
fc50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
fc60: 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 31 3b 0a  Cost->nRow = 1;.
fc70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
fc80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fc90: 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  (pExpr = pTerm->
fca0: 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30  pExpr)->pList!=0
fcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
fcc0: 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20  owid IN (LIST): 
fcd0: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
fce0: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
fcf0: 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20  ber of list.    
fd00: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
fd10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 6f    */.        pCo
fd20: 73 74 2d 3e 72 43 6f 73 74 20 3d 20 70 43 6f 73  st->rCost = pCos
fd30: 74 2d 3e 6e 52 6f 77 20 3d 20 70 45 78 70 72 2d  t->nRow = pExpr-
fd40: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  >pList->nExpr;. 
fd50: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
fd60: 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 70 43  ost *= estLog(pC
fd70: 6f 73 74 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20  ost->rCost);.   
fd80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd90: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53    /* Rowid IN (S
fda0: 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20  ELECT): cost is 
fdb0: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
fdc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
fdd0: 6f 77 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ows.        ** i
fde0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
fdf0: 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74  the inner select
fe00: 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61  .  We have no wa
fe10: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20  y to estimate.  
fe20: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
fe30: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
fe40: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
fe50: 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77       pCost->nRow
fe60: 20 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20   = 100;.        
fe70: 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 32  pCost->rCost = 2
fe80: 30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  00;.      }.    
fe90: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
fea0: 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74  .. rowid IN cost
feb0: 3a 20 25 2e 39 67 5c 6e 22 2c 20 70 43 6f 73 74  : %.9g\n", pCost
fec0: 2d 3e 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ->rCost));.    }
fed0: 0a 20 20 0a 20 20 20 20 2f 2a 20 45 73 74 69 6d  .  .    /* Estim
fee0: 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ate the cost of 
fef0: 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49  a table scan.  I
ff00: 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  f we do not know
ff10: 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a   how many.    **
ff20: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
ff30: 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31  the table, use 1
ff40: 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75   million as a gu
ff50: 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
ff60: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20  cost = pProbe ? 
ff70: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
ff80: 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20  [0] : 1000000;. 
ff90: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
ffa0: 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62  ... table scan b
ffb0: 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e  ase cost: %.9g\n
ffc0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 77  ", cost));.    w
ffd0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  sFlags = WHERE_R
ffe0: 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 0a 20  OWID_RANGE;.  . 
fff0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
10000 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
10010 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73   range of rowids
10020 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e   in a table scan
10030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 65  ..    */.    pTe
10040 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
10050 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
10060 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
10070 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
10080 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  0);.    if( pTer
10090 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  m ){.      if( f
100a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
100b0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
100c0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
100d0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
100e0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
100f0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
10100 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
10110 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c  uess that rowid<
10120 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
10130 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
10140 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ws */.      }.  
10150 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
10160 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
10170 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
10180 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
10190 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
101a0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
101b0 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  .        cost /=
101c0 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68   3;  /* Guess th
101d0 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c  at rowid>EXPR el
101e0 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
101f0 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  rds of rows */. 
10200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
10210 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f  RETRACE(("... ro
10220 77 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65  wid range reduce
10230 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
10240 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ", cost));.    }
10250 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 73 46 6c  else{.      wsFl
10260 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ags = 0;.    }. 
10270 20 20 20 6e 52 6f 77 20 3d 20 63 6f 73 74 3b 0a     nRow = cost;.
10280 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
10290 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73   table scan does
102a0 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
102b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
102c0 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 20 20 2a  , increase.    *
102d0 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c  * the cost by Nl
102e0 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ogN to cover the
102f0 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74   expense of sort
10300 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
10310 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10320 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79    if( sortableBy
10330 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
10340 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b  erBy, pWC->pMask
10350 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a 20 20  Set, &rev) ){.  
10360 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
10370 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57   WHERE_ORDERBY|W
10380 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
10390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
103a0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  v ){.          w
103b0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
103c0 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
103d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
103e0 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20          cost += 
103f0 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74  cost*estLog(cost
10400 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  );.        WHERE
10410 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
10420 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f  ing increases co
10430 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
10440 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
10450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 73     }.    if( cos
10460 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  t<pCost->rCost )
10470 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  {.      pCost->r
10480 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
10490 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d     pCost->nRow =
104a0 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f   nRow;.      pCo
104b0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
104c0 20 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20   = wsFlags;.    
104d0 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
104e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
104f0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
10500 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 4f 52  Search for an OR
10510 2d 63 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e  -clause that can
10520 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 6b   be used to look
10530 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
10540 20 2a 2f 0a 20 20 6d 61 73 6b 53 72 63 20 3d 20   */.  maskSrc = 
10550 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10560 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
10570 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
10580 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
10590 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
105a0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6c 61  +){.    WhereCla
105b0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20  use tempWC;.    
105c0 74 65 6d 70 57 43 20 3d 20 2a 70 57 43 3b 0a 20  tempWC = *pWC;. 
105d0 20 20 20 74 65 6d 70 57 43 2e 6e 53 6c 6f 74 20     tempWC.nSlot 
105e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 54 65  = 1;.    if( pTe
105f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
10600 4f 5f 4f 52 20 0a 20 20 20 20 20 20 20 20 26 26  O_OR .        &&
10610 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   ((pTerm->prereq
10620 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20  All & ~maskSrc) 
10630 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
10640 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
10650 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
10660 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63  exable & maskSrc
10670 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )!=0 ){.      Wh
10680 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 43  ereClause *pOrWC
10690 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
106a0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
106b0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
106c0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  rm;.      int j;
106d0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54  .      double rT
106e0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
106f0 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b  double nRow = 0;
10700 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
10710 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
10720 3b 20 6a 3c 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ; j<pOrWC->nTerm
10730 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; j++, pOrTerm++
10740 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
10750 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a  Cost sTermCost;.
10760 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
10770 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
10780 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
10790 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 57 43  ;.        tempWC
107a0 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
107b0 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
107c0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c  pParse, &tempWC,
107d0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
107e0 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
107f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 54 65  .        if( sTe
10800 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  rmCost.plan.wsFl
10810 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ags==0 ){.      
10820 20 20 20 20 72 54 6f 74 61 6c 20 3d 20 70 43 6f      rTotal = pCo
10830 73 74 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  st->rCost;.     
10840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54      }.        rT
10860 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73  otal += sTermCos
10870 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  t.rCost;.       
10880 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f   nRow += sTermCo
10890 73 74 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 7d  st.nRow;.      }
108a0 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61  .      if( rTota
108b0 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  l<pCost->rCost )
108c0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  {.        pCost-
108d0 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b  >rCost = rTotal;
108e0 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
108f0 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nRow = nRow;.   
10900 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
10910 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
10920 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
10930 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
10940 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a  .pTerm = pTerm;.
10950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10960 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10970 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
10980 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 2f 2a  IZATION */..  /*
10990 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
109a0 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
109b0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
109c0 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
109d0 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
109e0 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
109f0 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
10a00 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
10a10 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
10a20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
10a30 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
10a40 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
10a50 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
10a60 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
10a70 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
10a80 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
10a90 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
10aa0 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
10ab0 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
10ac0 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
10ad0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
10ae0 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
10af0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
10b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65   }else{.    eqTe
10b10 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
10b20 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
10b30 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
10b40 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
10b50 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  */.  if( pSrc->p
10b60 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 50 72  Index ){.    pPr
10b70 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
10b80 65 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20  ex;.  }.  for(; 
10b90 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 28  pProbe; pProbe=(
10ba0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20 30  pSrc->pIndex ? 0
10bb0 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74   : pProbe->pNext
10bc0 29 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20  )){.    int i;  
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10bf0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62  nter */.    doub
10c00 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20  le inMultiplier 
10c10 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45 54  = 1;..    WHERET
10c20 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78  RACE(("... index
10c30 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d   %s:\n", pProbe-
10c40 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
10c50 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10c60 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10c70 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
10c80 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20 20  are satisfied.  
10c90 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63    ** by x=EXPR c
10ca0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20  onstraints or x 
10cb0 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
10cc0 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
10cd0 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
10ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72    for(i=0; i<pPr
10cf0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  obe->nColumn; i+
10d00 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  +){.      int j 
10d10 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
10d20 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65  mn[i];.      pTe
10d30 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
10d40 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
10d50 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b  eady, eqTermMask
10d60 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  , pProbe);.     
10d70 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
10d80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46  break;.      wsF
10d90 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
10da0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
10db0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
10dc0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
10dd0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
10de0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
10df0 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  r;.        wsFla
10e00 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
10e10 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
10e20 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
10e30 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
10e40 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a    inMultiplier *
10e50 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65  = 25;.        }e
10e60 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
10e70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a  Expr->pList) ){.
10e80 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
10e90 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d  iplier *= pExpr-
10ea0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  >pList->nExpr + 
10eb0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
10ec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
10ed0 52 6f 77 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Row = pProbe->ai
10ee0 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75  RowEst[i] * inMu
10ef0 6c 74 69 70 6c 69 65 72 3b 0a 20 20 20 20 63 6f  ltiplier;.    co
10f00 73 74 20 3d 20 6e 52 6f 77 20 2a 20 65 73 74 4c  st = nRow * estL
10f10 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
10f20 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
10f30 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
10f40 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
10f50 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
10f60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
10f70 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45  0.         && nE
10f80 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
10f90 6d 6e 20 29 7b 0a 20 20 20 20 20 20 77 73 46 6c  mn ){.      wsFl
10fa0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
10fb0 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  QUE;.    }.    W
10fc0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
10fd0 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74  .. nEq=%d inMult
10fe0 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c  =%.9g cost=%.9g\
10ff0 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70 6c  n",nEq,inMultipl
11000 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20 20  ier,cost));..   
11010 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e   /* Look for ran
11020 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
11030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45     */.    if( nE
11040 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
11050 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  n ){.      int j
11060 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
11070 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20  umn[nEq];.      
11080 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
11090 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
110a0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
110b0 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
110c0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  , pProbe);.     
110d0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
110e0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
110f0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
11100 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NGE;.        if(
11110 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
11120 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
11130 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
11140 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
11150 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
11160 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
11170 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
11180 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  = 3;.          n
11190 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  Row /= 3;.      
111a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
111b0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
111c0 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
111d0 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50   WO_GT|WO_GE, pP
111e0 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
111f0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
11200 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
11210 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d           cost /=
11220 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 52   3;.          nR
11230 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  ow /= 3;.       
11240 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
11250 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72  TRACE(("...... r
11260 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73  ange reduces cos
11270 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
11280 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
11290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
112a0 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  the additional c
112b0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
112c0 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63 74  f that is a fact
112d0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
112e0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
112f0 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67       if( (wsFlag
11300 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
11310 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  _IN)==0 &&.     
11320 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49        isSortingI
11330 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d  ndex(pParse,pWC-
11340 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65  >pMaskSet,pProbe
11350 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e  ,iCur,pOrderBy,n
11360 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20 20  Eq,&rev) ){.    
11370 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73 3d      if( wsFlags=
11380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11390 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
113a0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
113b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
113d0 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
113e0 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20    if( rev ){.   
113f0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11400 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
11410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11430 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
11440 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
11450 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
11460 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69  ...... orderby i
11470 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f  ncreases cost to
11480 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
11490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
114a0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
114b0 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67   see if we can g
114c0 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69  et away with usi
114d0 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
114e0 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  x without.    **
114f0 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68   ever reading th
11500 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61  e table.  If tha
11510 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
11520 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20  hen halve the.  
11530 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69    ** cost of thi
11540 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  s index..    */.
11550 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73 20      if( wsFlags 
11560 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  && pSrc->colUsed
11570 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   < (((Bitmask)1)
11580 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
11590 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
115a0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
115b0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
115c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72    for(j=0; j<pPr
115d0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  obe->nColumn; j+
115e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
115f0 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  x = pProbe->aiCo
11600 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
11610 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a   if( x<BMS-1 ){.
11620 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e            m &= ~
11630 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78  (((Bitmask)1)<<x
11640 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11650 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
11660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ==0 ){.        w
11670 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
11680 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
11690 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20    cost /= 2;.   
116a0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
116b0 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c  ("...... idx-onl
116c0 79 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  y reduces cost t
116d0 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
116e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
116f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
11700 20 69 6e 64 65 78 20 68 61 73 20 61 63 68 69 65   index has achie
11710 76 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ved the lowest c
11720 6f 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e  ost so far, then
11730 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a   use it..    */.
11740 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73 21      if( wsFlags!
11750 3d 30 20 26 26 20 63 6f 73 74 20 3c 20 70 43 6f  =0 && cost < pCo
11760 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
11770 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
11780 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
11790 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77  ost->nRow = nRow
117a0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
117b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77 73  lan.wsFlags = ws
117c0 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 43 6f  Flags;.      pCo
117d0 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  st->plan.nEq = n
117e0 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Eq;.      assert
117f0 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73  ( pCost->plan.ws
11800 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
11810 44 45 58 45 44 20 29 3b 0a 20 20 20 20 20 20 70  DEXED );.      p
11820 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
11830 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
11840 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
11850 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75  rt the best resu
11860 6c 74 0a 20 20 2a 2f 0a 20 20 70 43 6f 73 74 2d  lt.  */.  pCost-
11870 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
11880 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 57   eqTermMask;.  W
11890 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74  HERETRACE(("best
118a0 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f   index is %s, co
118b0 73 74 3d 25 2e 39 67 2c 20 6e 72 6f 77 3d 25 2e  st=%.9g, nrow=%.
118c0 39 67 2c 20 77 73 46 6c 61 67 73 3d 25 78 2c 20  9g, wsFlags=%x, 
118d0 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
118e0 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e     (pCost->plan.
118f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
11900 49 4e 44 45 58 45 44 29 21 3d 30 20 3f 0a 20 20  INDEXED)!=0 ?.  
11910 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 73 74             pCost
11920 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
11930 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c  Name : "(none)",
11940 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 2c 0a 20 20   pCost->nRow,.  
11950 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
11960 73 74 2c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  st, pCost->plan.
11970 77 73 46 6c 61 67 73 2c 20 70 43 6f 73 74 2d 3e  wsFlags, pCost->
11980 70 6c 61 6e 2e 6e 45 71 29 29 3b 0a 7d 0a 0a 0a  plan.nEq));.}...
11990 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
119a0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
119b0 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
119c0 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
119d0 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
119e0 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
119f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
11a00 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
11a10 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
11a20 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
11a30 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
11a40 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
11a50 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
11a60 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
11a70 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
11a80 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
11a90 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
11aa0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
11ab0 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
11ac0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
11ad0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
11ae0 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
11af0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
11b00 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
11b10 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
11b20 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
11b30 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
11b40 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
11b50 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
11b60 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
11b70 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
11b80 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
11b90 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
11ba0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
11bb0 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
11bc0 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
11bd0 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
11be0 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
11bf0 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
11c00 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
11c10 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
11c20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
11c30 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
11c40 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
11c50 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
11c60 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
11c70 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
11c80 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
11c90 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
11ca0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
11cb0 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
11cc0 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
11cd0 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
11ce0 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
11cf0 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
11d00 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
11d10 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
11d20 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
11d30 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
11d40 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
11d50 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
11d60 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
11d70 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
11d80 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
11d90 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
11da0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
11db0 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
11dc0 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
11dd0 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
11de0 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
11df0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
11e00 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
11e10 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
11e20 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
11e30 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
11e40 20 20 20 26 26 20 41 4c 57 41 59 53 28 28 70 54     && ALWAYS((pT
11e50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
11e60 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 29 0a 20  ERM_CODED)==0). 
11e70 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
11e80 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
11e90 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
11ea0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
11eb0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
11ec0 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
11ed0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
11ee0 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
11ef0 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
11f00 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
11f10 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
11f20 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
11f30 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
11f40 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
11f50 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
11f60 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
11f70 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
11f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11f90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
11fa0 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 69  ply the affiniti
11fb0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
11fc0 74 68 20 74 68 65 20 66 69 72 73 74 20 6e 20 63  th the first n c
11fd0 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 0a  olumns of index.
11fe0 2a 2a 20 70 49 64 78 20 74 6f 20 74 68 65 20 76  ** pIdx to the v
11ff0 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e 20 72  alues in the n r
12000 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
12010 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73 74  g at base..*/.st
12020 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
12030 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
12040 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
12050 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64 65  ase, int n, Inde
12060 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
12070 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  n>0 ){.    Vdbe 
12080 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
12090 62 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  be;.    assert( 
120a0 76 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  v!=0 );.    sqli
120b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
120c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
120d0 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
120e0 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
120f0 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20  Str(v, pIdx);.  
12100 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12110 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
12120 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
12130 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
12140 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
12150 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
12160 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
12170 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
12180 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
12190 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
121a0 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
121b0 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
121c0 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
121d0 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
121e0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
121f0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
12200 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
12210 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
12220 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
12230 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
12240 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
12250 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
12260 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
12270 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
12280 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
12290 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
122a0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
122b0 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
122c0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
122d0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
122e0 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
122f0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
12300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
12310 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
12320 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
12340 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12350 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12360 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
12370 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
12380 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
12390 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
123a0 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68  l *pLevel, /* Wh
123b0 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  en level of the 
123c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
123d0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
123e0 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
123f0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
12400 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
12410 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
12420 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
12430 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
12440 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
12450 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
12460 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12480 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
12490 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61   results */..  a
124a0 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30  ssert( iTarget>0
124b0 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70   );.  if( pX->op
124c0 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69  ==TK_EQ ){.    i
124d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
124e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
124f0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
12500 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  iTarget);.  }els
12510 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
12520 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  _ISNULL ){.    i
12530 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
12540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12550 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
12560 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64   0, iReg);.#ifnd
12570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12580 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
12590 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
125a0 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
125b0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
125c0 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72  *pIn;..    asser
125d0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
125e0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
125f0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
12600 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
12610 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
12620 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20  X, 0);.    iTab 
12630 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
12640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12650 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12660 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
12670 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12680 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e  "%.*s", pX->span
12690 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
126a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
126b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
126c0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
126d0 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LE );.    if( pL
126e0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
126f0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
12700 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
12710 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12720 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
12730 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
12740 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
12750 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
12760 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
12770 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
12780 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
12790 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20  >u.in.aInLoop,. 
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
127c0 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
127d0 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
127e0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
127f0 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
12800 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
12810 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
12820 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
12830 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
12840 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
12850 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
12860 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
12870 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
12880 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
12890 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
128a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
128b0 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
128c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
128d0 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
128e0 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
128f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12900 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
12910 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
12920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12930 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
12940 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
12950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
12960 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
12970 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
12980 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
12990 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
129a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
129b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
129c0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
129d0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
129e0 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
129f0 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
12a00 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
12a10 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
12a20 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
12a30 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
12a40 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
12a50 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
12a60 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
12a70 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
12a80 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
12a90 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
12aa0 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
12ab0 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
12ac0 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
12ad0 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
12ae0 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
12af0 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
12b00 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
12b10 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
12b20 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
12b30 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
12b40 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
12b50 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
12b60 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
12b70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
12b80 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
12b90 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
12ba0 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
12bb0 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
12bc0 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
12bd0 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
12be0 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
12bf0 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
12c00 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
12c10 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
12c20 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
12c30 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
12c40 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
12c50 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
12c60 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
12c70 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
12c80 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
12c90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
12ca0 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
12cb0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
12cc0 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
12cd0 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
12ce0 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
12cf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12d00 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
12d10 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
12d20 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
12d30 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
12d40 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
12d50 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
12d60 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
12d70 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
12d80 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
12d90 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
12da0 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
12db0 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
12dc0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
12dd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
12de0 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
12df0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
12e00 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
12e10 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
12e20 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
12e30 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
12e40 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
12e50 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
12e60 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
12e70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12e80 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12e90 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
12ea0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
12eb0 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
12ec0 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
12ed0 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
12ee0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12ef0 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
12f00 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12f10 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
12f20 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
12f30 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
12f40 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
12f50 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
12f60 6e 45 78 74 72 61 52 65 67 20 20 20 20 20 20 20  nExtraReg       
12f70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
12f80 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
12f90 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 29 7b  o allocate */.){
12fa0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65  .  int nEq = pLe
12fb0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20  vel->plan.nEq;  
12fc0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
12fd0 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
12fe0 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
12ff0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
13000 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
13010 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
13020 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
13030 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
13060 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
13070 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
13080 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
13090 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
130a0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
130b0 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
130c0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
130d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
130e0 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
130f0 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13120 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
13130 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
13140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
13150 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
13160 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
13170 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
13180 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
13190 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
131a0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
131b0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
131c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
131d0 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20  XED );.  pIdx = 
131e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
131f0 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  Idx;..  /* Figur
13200 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
13210 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
13220 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
13230 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
13240 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
13250 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
13260 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
13270 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
13280 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
13290 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
132a0 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
132b0 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
132c0 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
132d0 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
132e0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
132f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 70 50  ->nMem + 1;.  pP
13300 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
13310 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
13320 20 31 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a   1 + nExtraReg;.
13330 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
13340 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
13350 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
13360 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
13370 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  lumn>=nEq );.  f
13380 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
13390 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
133a0 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
133b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
133c0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
133d0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
133e0 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  k, notReady, pLe
133f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
13400 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66  s, pIdx);.    if
13410 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30  ( NEVER(pTerm==0
13420 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  ) ) break;.    a
13430 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
13440 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
13450 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  DED)==0 );.    r
13460 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
13470 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
13480 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42  rm, pLevel, regB
13490 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
134a0 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
134b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
134c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
134d0 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
134e0 65 2b 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+j);.    }.    
134f0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
13500 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13510 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
13520 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
13530 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
13540 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
13550 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
13560 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
13570 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))==0 ){.      s
13580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13590 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
135a0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
135b0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
135c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
135d0 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egBase;.}../*.**
135e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
135f0 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
13600 70 57 43 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  pWC contains no 
13610 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 61 72  terms that.** ar
13620 65 20 6e 6f 74 20 76 69 72 74 75 61 6c 20 61 6e  e not virtual an
13630 64 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f 74  d which have not
13640 20 62 65 65 6e 20 63 6f 64 65 64 2e 0a 2a 2a 0a   been coded..**.
13650 2a 2a 20 54 6f 20 70 75 74 20 69 74 20 61 6e 6f  ** To put it ano
13660 74 68 65 72 20 77 61 79 2c 20 72 65 74 75 72 6e  ther way, return
13670 20 54 52 55 45 20 69 66 20 6e 6f 20 61 64 64 69   TRUE if no addi
13680 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  tional WHERE cla
13690 75 73 65 73 0a 2a 2a 20 74 65 73 74 73 20 61 72  uses.** tests ar
136a0 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 6f 72  e required in or
136b0 64 65 72 20 74 6f 20 65 73 74 61 62 6c 69 73 68  der to establish
136c0 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
136d0 74 20 72 6f 77 0a 2a 2a 20 73 68 6f 75 6c 64 20  t row.** should 
136e0 67 6f 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64  go to output and
136f0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
13700 20 74 68 65 72 65 20 61 72 65 20 73 6f 6d 65 20   there are some 
13710 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
13720 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
13730 74 20 6e 65 65 64 20 74 6f 20 62 65 20 76 61 6c  t need to be val
13740 69 64 61 74 65 64 20 62 65 66 6f 72 65 20 6f 75  idated before ou
13750 74 70 75 74 69 6e 67 20 74 68 65 20 72 6f 77 2e  tputing the row.
13760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13770 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
13780 75 74 70 75 74 28 57 68 65 72 65 43 6c 61 75 73  utput(WhereClaus
13790 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
137a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
137b0 6e 74 20 6a 3b 0a 20 0a 20 20 66 6f 72 28 70 54  nt j;. .  for(pT
137c0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
137d0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
137e0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
137f0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
13800 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
13810 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
13820 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
13830 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
13840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
13850 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
13860 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
13870 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
13880 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13890 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
138a0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
138b0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
138c0 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
138d0 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
138e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
138f0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
13900 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
13910 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13920 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
13930 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
13940 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
13950 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
13960 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
13970 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  8 wctrlFlags,   
13980 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
13990 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
139a0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
139b0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
139c0 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
139d0 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
139e0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
139f0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
13a00 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
13a10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13a20 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
13a30 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
13a40 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
13a50 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
13a60 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
13a70 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
13a80 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
13a90 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
13aa0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
13ab0 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
13ac0 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
13ad0 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
13ae0 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
13af0 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
13b00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
13b10 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
13b20 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
13b30 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
13b40 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
13b50 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
13b60 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
13b70 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
13b80 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
13b90 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
13ba0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
13bb0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
13bc0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
13bd0 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
13be0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
13bf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13c20 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13c50 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
13c60 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
13c70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
13c80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
13c90 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
13ca0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
13cb0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
13cc0 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
13cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
13ce0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
13cf0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
13d00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
13d10 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
13d20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
13d30 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
13d40 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
13d50 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 53 65  /.  int regRowSe
13d60 74 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t;       /* Writ
13d70 65 20 72 6f 77 69 64 73 20 74 6f 20 74 68 69 73  e rowids to this
13d80 20 52 6f 77 53 65 74 20 69 66 20 6e 6f 6e 2d 6e   RowSet if non-n
13d90 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74  egative */.  int
13da0 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79   codeRowSetEarly
13db0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64  ; /* True if ind
13dc0 65 78 20 66 75 6c 6c 79 20 63 6f 6e 73 74 72 61  ex fully constra
13dd0 69 6e 73 20 74 68 65 20 73 65 61 72 63 68 20 2a  ins the search *
13de0 2f 0a 20 20 0a 0a 20 20 70 50 61 72 73 65 20 3d  /.  ..  pParse =
13df0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
13e00 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
13e10 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57  Vdbe;.  pWC = pW
13e20 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65  Info->pWC;.  pLe
13e30 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
13e40 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62  [iLevel];.  pTab
13e50 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
13e60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
13e70 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
13e80 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13e90 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d  Cursor;.  bRev =
13ea0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
13eb0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
13ec0 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d  EVERSE)!=0;.  om
13ed0 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
13ee0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
13ef0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
13f00 29 21 3d 30 3b 0a 20 20 72 65 67 52 6f 77 53 65  )!=0;.  regRowSe
13f10 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52  t = pWInfo->regR
13f20 6f 77 53 65 74 3b 0a 20 20 63 6f 64 65 52 6f 77  owSet;.  codeRow
13f30 53 65 74 45 61 72 6c 79 20 3d 20 30 3b 0a 0a 20  SetEarly = 0;.. 
13f40 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
13f50 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
13f60 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
13f70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
13f80 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
13f90 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
13fa0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
13fb0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
13fc0 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
13fd0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
13fe0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
13ff0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
14000 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
14010 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
14020 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
14030 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
14040 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
14050 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
14060 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
14070 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
14080 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
14090 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
140a0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
140b0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
140c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
140d0 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
140e0 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
140f0 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
14100 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
14110 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
14120 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
14130 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
14140 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14150 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
14160 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
14170 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14180 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
14190 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
141a0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
141b0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
141c0 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
141d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
141e0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
141f0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
14200 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
14210 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
14220 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
14230 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
14240 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
14250 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
14260 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
14270 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
14280 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
14290 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
142a0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
142b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
142c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
142d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
142e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
142f0 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
14300 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
14310 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66  lag"));.  }..#if
14320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14330 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14340 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  if(  (pLevel->pl
14350 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
14360 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
14370 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
14380 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65  se 0:  The table
14390 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
143a0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
143b0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
143c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
143d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
143e0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
143f0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
14400 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
14410 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  ilter */.    sql
14420 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14430 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
14440 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
14450 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
14460 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
14470 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
14480 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
14490 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
144a0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
144b0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
144f0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14500 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
14510 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14520 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
14530 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
14570 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
14580 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  ;..    iReg = sq
14590 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
145a0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
145b0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 70 50  raint+2);.    pP
145c0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
145d0 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 66 6f 72  Cache++;.    for
145e0 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72  (j=1; j<=nConstr
145f0 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
14600 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f    for(k=0; k<nCo
14610 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a  nstraint; k++){.
14620 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
14630 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
14640 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
14650 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
14660 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
14670 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
14680 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14690 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
146a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  e );.          s
146b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
146c0 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54  Parse, pWC->a[iT
146d0 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67  erm].pExpr->pRig
146e0 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20  ht, iReg+j+1);. 
146f0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14710 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e  }.      if( k==n
14720 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65  Constraint ) bre
14730 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
14740 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
14750 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b  sableColCache );
14760 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73  .    pParse->dis
14770 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
14780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14790 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
147a0 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  ger, pVtabIdx->i
147b0 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
147c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
147e0 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b  r, j-1, iReg+1);
147f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14800 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
14810 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
14820 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62  Brk, iReg, pVtab
14830 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20  Idx->idxStr,.   
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
14860 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20  dToFreeIdxStr ? 
14870 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
14880 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74  STATIC);.    pVt
14890 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
148a0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
148b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
148c0 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
148d0 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
148e0 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20  j].omit ){.     
148f0 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
14900 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54  Constraint[j].iT
14910 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
14920 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14930 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69  Level, &pWC->a[i
14940 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Term]);.      }.
14950 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
14960 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
14970 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
14980 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
14990 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
149a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
149b0 76 29 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53  v);.    codeRowS
149c0 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77  etEarly = regRow
149d0 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f  Set>=0 ? whereRo
149e0 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28  wReadyForOutput(
149f0 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  pWC) : 0;.    if
14a00 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
14a10 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
14a20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14a30 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75 72 2c  OP_VRowid, iCur,
14a40 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71   iReg);.      sq
14a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a60 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c  v, OP_RowSetAdd,
14a70 20 72 65 67 52 6f 77 53 65 74 2c 20 69 52 65 67   regRowSet, iReg
14a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14a90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14aa0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
14ab0 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
14ac0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
14ad0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14ae0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
14af0 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ..  if( pLevel->
14b00 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
14b10 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
14b20 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
14b30 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
14b40 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
14b50 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
14b60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
14b70 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
14b80 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
14b90 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
14ba0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
14bb0 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
14bc0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
14bd0 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
14be0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
14bf0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
14c00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
14c10 72 31 3b 0a 20 20 20 20 69 6e 74 20 72 74 6d 70  r1;.    int rtmp
14c20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14c30 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14c40 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
14c50 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
14c60 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
14c70 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
14c80 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
14c90 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14ca0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
14cb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14cc0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
14cd0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61  r==iCur );.    a
14ce0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
14cf0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  ==0 );.    r1 = 
14d00 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
14d10 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
14d20 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a 20  pLevel, rtmp);. 
14d30 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
14d40 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
14d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d60 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
14d70 49 6e 74 2c 20 72 31 2c 20 61 64 64 72 4e 78 74  Int, r1, addrNxt
14d80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14d90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
14da0 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
14db0 61 64 64 72 4e 78 74 2c 20 72 31 29 3b 0a 20 20  addrNxt, r1);.  
14dc0 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c    codeRowSetEarl
14dd0 79 20 3d 20 28 70 57 43 2d 3e 6e 54 65 72 6d 3d  y = (pWC->nTerm=
14de0 3d 31 20 26 26 20 72 65 67 52 6f 77 53 65 74 3e  =1 && regRowSet>
14df0 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66  =0) ?1:0;.    if
14e00 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
14e10 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
14e20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14e30 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65  OP_RowSetAdd, re
14e40 67 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20  gRowSet, r1);.  
14e50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
14e60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14e70 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a 20 20 20  arse, rtmp);.   
14e80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
14e90 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
14ea0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
14eb0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  p;.  }else if( p
14ec0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
14ed0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
14ee0 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f  D_RANGE ){.    /
14ef0 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
14f00 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
14f10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
14f20 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
14f30 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eld..    */.    
14f40 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
14f50 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74  Noop;.    int st
14f60 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  art;.    int mem
14f70 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  EndValue = 0;.  
14f80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
14f90 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
14fa0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
14fb0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74  le==0 );.    pSt
14fc0 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  art = findTerm(p
14fd0 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
14fe0 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
14ff0 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e  _GE, 0);.    pEn
15000 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  d = findTerm(pWC
15010 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
15020 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
15030 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  E, 0);.    if( b
15040 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
15050 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
15060 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
15070 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
15080 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
15090 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
150a0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
150b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
150c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
150d0 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
150e0 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
150f0 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
15100 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
15110 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
15120 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
15130 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
15140 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
15150 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
15160 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
15170 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
15180 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
15190 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
151a0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
151b0 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
151c0 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
151d0 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
151e0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
151f0 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
15200 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20  OP_SeekGt,.     
15210 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
15220 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20  /  OP_SeekLe,.  
15230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
15240 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c  T */  OP_SeekLt,
15250 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
15260 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
15270 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  Ge.      };.    
15280 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
15290 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
152a0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
152b0 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
152c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
152d0 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
152e0 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
152f0 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
15300 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
15310 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
15320 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
15330 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
15340 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58 20 3d 20   */..      pX = 
15350 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
15360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
15370 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
15380 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
15390 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
153a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
153b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
153c0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
153d0 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
153e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
153f0 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
15400 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
15410 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
15420 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
15430 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
15440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15450 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15460 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
15470 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
15480 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15490 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
154a0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
154b0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
154c0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
154d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154e0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
154f0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
15500 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
15510 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
15520 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
15530 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
15540 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
15550 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
15560 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
15570 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
15580 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
15590 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
155a0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
155b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
155c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
155d0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
155e0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
155f0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
15600 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
15610 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
15620 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
15630 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
15640 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15650 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15660 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
15670 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
15680 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
15690 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
156a0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
156b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
156c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
156d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
156e0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
156f0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
15700 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
15710 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
15720 74 61 72 74 3b 0a 20 20 20 20 63 6f 64 65 52 6f  tart;.    codeRo
15730 77 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52  wSetEarly = regR
15740 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65  owSet>=0 ? where
15750 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75  RowReadyForOutpu
15760 74 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20  t(pWC) : 0;.    
15770 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61  if( codeRowSetEa
15780 72 6c 79 20 7c 7c 20 74 65 73 74 4f 70 21 3d 4f  rly || testOp!=O
15790 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
157a0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
157b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
157c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
157d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
157e0 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 72  P_Rowid, iCur, r
157f0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  1);.      if( te
15800 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
15810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15820 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65  VdbeAddOp3(v, te
15830 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  stOp, memEndValu
15840 65 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  e, addrBrk, r1);
15850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15860 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
15870 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
15880 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
15890 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
158a0 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 52  .      if( codeR
158b0 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20  owSetEarly ){.  
158c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
158d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
158e0 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53  wSetAdd, regRowS
158f0 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  et, r1);.      }
15900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15910 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15920 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 7d 0a  rse, r1);.    }.
15930 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
15940 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
15950 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
15960 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
15970 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f  UMN_EQ) ){.    /
15980 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e  * Case 3: A scan
15990 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
159a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
159b0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
159c0 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
159d0 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
159e0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
159f0 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
15a00 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
15a10 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
15a20 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
15a30 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
15a40 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
15a50 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
15a60 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
15a70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
15a80 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
15a90 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
15aa0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
15ab0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
15ac0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
15ad0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
15ae0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
15af0 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
15b00 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
15b10 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
15b20 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
15b30 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
15b40 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
15b50 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
15b60 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
15b70 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
15b80 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
15b90 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
15ba0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
15bb0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
15bc0 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
15bd0 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
15be0 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
15bf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
15c00 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
15c10 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15c20 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
15c30 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
15c40 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
15c50 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
15c60 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
15c70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15c80 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
15c90 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
15ca0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
15cb0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
15cc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
15cd0 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
15ce0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
15cf0 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
15d00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
15d10 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
15d20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
15d30 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
15d40 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
15d50 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
15d60 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
15d70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
15d80 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
15d90 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15da0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
15db0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
15dc0 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
15dd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
15de0 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
15df0 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
15e00 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
15e10 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
15e20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
15e30 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
15e40 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
15e50 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
15e60 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
15e70 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
15e80 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
15e90 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
15ea0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e  .    */  .    in
15eb0 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  t aStartOp[] = {
15ec0 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
15ed0 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
15ee0 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
15ef0 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
15f00 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
15f10 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
15f20 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
15f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
15f40 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
15f50 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
15f60 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
15f70 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20       OP_SeekGt, 
15f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
15f90 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
15fa0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
15fb0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
15fc0 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20     OP_SeekLt,   
15fd0 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
15fe0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
15ff0 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
16000 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
16010 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
16020 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
16030 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16040 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
16050 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
16060 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20  P_SeekLe        
16070 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
16080 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
16090 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
160a0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
160b0 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d    int aEndOp[] =
160c0 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
160d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
160e0 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
160f0 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
16100 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
16110 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
16120 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
16130 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
16140 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
16150 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
16160 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
16170 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
16180 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
16190 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20  el->plan.nEq;.  
161a0 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
161b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
161c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
161d0 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
161e0 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
161f0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16210 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
16220 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
16230 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
16240 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16260 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
16270 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
16280 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
16290 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
162a0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
162b0 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
162c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
162d0 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
162e0 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
162f0 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
16300 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
16310 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
16320 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16330 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
16340 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
16350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
16360 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
16370 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16380 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
16390 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
163a0 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
163b0 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
163c0 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
163d0 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
163e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
163f0 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
16400 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16410 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
16420 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
16430 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f  *pIdx;         /
16440 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77  * The index we w
16450 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a  ill be using */.
16460 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b      int iIdxCur;
16470 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16480 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
16490 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
164a0 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 20 20 70 49   int op;..    pI
164b0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
164c0 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49  n.u.pIdx;.    iI
164d0 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
164e0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d  iIdxCur;.    k =
164f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
16500 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c  nEq];     /* Col
16510 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69  umn for inequali
16520 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
16530 2f 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  /..    /* Genera
16540 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
16550 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
16560 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
16570 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
16580 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
16590 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
165a0 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
165b0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
165c0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
165d0 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
165e0 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
165f0 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
16600 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
16610 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c  , pWC, notReady,
16620 20 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74   2);.    addrNxt
16630 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
16640 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  xt;..    /* If t
16650 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
16660 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
16670 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
16680 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
16690 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
166a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
166b0 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
166c0 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
166d0 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
166e0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
166f0 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
16700 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
16710 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
16720 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
16730 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
16740 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
16750 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
16760 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
16770 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
16780 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
16790 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
167a0 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
167b0 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
167c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
167d0 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
167e0 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
167f0 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
16800 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
16810 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
16820 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
16830 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
16840 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
16850 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
16860 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26 20  RDERBY).     && 
16870 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
16880 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
16890 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
168a0 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
168b0 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
168c0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
168d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
168e0 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
168f0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
16900 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
16910 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
16920 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
16930 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16940 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
16950 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
16960 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
16970 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
16980 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
16990 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
169a0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
169b0 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
169c0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
169d0 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
169e0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
169f0 70 49 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pIdx);.    }.   
16a00 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
16a10 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
16a20 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
16a30 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
16a40 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
16a50 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
16a60 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  dy, (WO_GT|WO_GE
16a70 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 7d 0a  ), pIdx);.    }.
16a80 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
16a90 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
16aa0 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
16ab0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
16ac0 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
16ad0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
16ae0 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
16af0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
16b00 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
16b10 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
16b20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
16b30 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
16b40 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
16b50 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  ( bRev==(pIdx->a
16b60 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
16b70 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
16b80 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
16b90 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
16ba0 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
16bb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
16bc0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
16bd0 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
16be0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
16bf0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
16c00 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
16c10 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
16c20 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
16c30 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
16c40 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
16c50 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
16c60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
16c70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
16c80 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
16c90 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
16ca0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
16cb0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
16cc0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
16cd0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
16ce0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
16cf0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
16d00 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
16d10 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
16d20 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
16d30 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
16d40 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
16d50 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
16d60 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
16d70 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
16d80 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
16d90 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
16da0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
16db0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
16dc0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
16dd0 20 20 20 20 69 6e 74 20 64 63 63 20 3d 20 70 50      int dcc = pP
16de0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
16df0 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
16e00 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
16e10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
16e20 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
16e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16e40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
16e50 50 61 72 73 65 2c 20 70 52 61 6e 67 65 53 74 61  Parse, pRangeSta
16e60 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
16e70 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
16e80 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
16e90 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 3d  isableColCache =
16ea0 20 64 63 63 3b 0a 20 20 20 20 20 20 73 71 6c 69   dcc;.      sqli
16eb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ec0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
16ed0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
16ee0 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
16ef0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  aint++;.    }els
16f00 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
16f10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16f20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16f30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
16f40 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
16f50 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
16f60 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
16f70 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
16f80 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
16f90 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
16fa0 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
16fb0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
16fc0 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20  traint, pIdx);. 
16fd0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
16fe0 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
16ff0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
17000 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
17010 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
17020 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
17030 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
17040 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
17050 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
17060 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
17070 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
17080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17090 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
170a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
170b0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
170c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
170d0 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
170e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
170f0 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  p4(v, op, iIdxCu
17100 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
17110 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ase, .          
17120 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17130 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43  TE_INT_TO_PTR(nC
17140 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49  onstraint), P4_I
17150 4e 54 33 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  NT32);..    /* L
17160 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
17170 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
17180 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
17190 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
171a0 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
171b0 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
171c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
171d0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
171e0 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  eEnd ){.      sq
171f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
17200 61 72 73 65 2c 20 70 52 61 6e 67 65 45 6e 64 2d  arse, pRangeEnd-
17210 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
17220 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
17230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
17250 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
17260 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
17270 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
17280 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
17290 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64 78 29  se, nEq+1, pIdx)
172a0 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
172b0 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  int++;.    }..  
172c0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
172d0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
172e0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
172f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17300 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
17310 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
17320 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
17330 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
17340 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
17350 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
17360 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
17370 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
17380 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17390 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
173a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
173b0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
173c0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
173d0 78 4c 54 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xLT );.    sqlit
173e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
173f0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
17400 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 0a 20  rNxt, regBase,. 
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
17430 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69  TO_PTR(nConstrai
17440 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  nt), P4_INT32);.
17450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17460 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
17470 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 0a 20  !=bRev ?1:0);.. 
17480 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
17490 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
174a0 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
174b0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
174c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
174d0 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
174e0 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
174f0 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
17500 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20  NULL..    ** If 
17510 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
17520 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
17530 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
17540 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73     */.    r1 = s
17550 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17560 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65  (pParse);.    te
17570 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
17580 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
17590 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
175a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
175b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
175c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
175d0 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
175e0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
175f0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
17600 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
17610 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
17620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17630 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
17640 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
17650 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17670 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
17680 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
17690 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  }..    /* Seek t
176a0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  he table cursor,
176b0 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
176c0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
176d0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
176e0 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c  art);.    disabl
176f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
17700 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 63 6f  angeEnd);.    co
17710 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20  deRowSetEarly = 
17720 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77  regRowSet>=0 ? w
17730 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
17740 75 74 70 75 74 28 70 57 43 29 20 3a 20 30 3b 0a  utput(pWC) : 0;.
17750 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
17760 6c 65 20 7c 7c 20 63 6f 64 65 52 6f 77 53 65 74  le || codeRowSet
17770 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  Early ){.      s
17780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17790 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
177a0 20 69 49 64 78 43 75 72 2c 20 72 31 29 3b 0a 20   iIdxCur, r1);. 
177b0 20 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77       if( codeRow
177c0 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20  SetEarly ){.    
177d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
177e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
177f0 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
17800 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
17810 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
17820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17830 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
17840 72 31 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  r1);  /* Deferre
17850 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20  d seek */.      
17860 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
17870 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17880 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
17890 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
178a0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
178b0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
178c0 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
178d0 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
178e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
178f0 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
17900 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
17910 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
17920 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
17930 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
17940 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
17950 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
17960 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
17970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
17980 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
17990 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
179a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
179b0 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
179c0 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f   /* Case 4:  Two
179d0 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
179e0 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
179f0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
17a00 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
17a10 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
17a20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
17a30 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
17a40 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
17a50 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
17a60 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
17a70 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
17a80 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
17a90 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
17aa0 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
17ab0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
17ac0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
17ad0 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
17ae0 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
17af0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
17b00 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
17b10 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
17b20 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
17b30 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
17b40 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
17b50 74 68 65 20 6c 6f 6f 70 20 69 73 20 63 6f 6e 73  the loop is cons
17b60 74 72 75 63 74 65 64 20 62 79 20 63 72 65 61 74  tructed by creat
17b70 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
17b80 65 63 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70  ect.    ** and p
17b90 6f 70 75 6c 61 74 69 6e 67 20 69 74 2e 20 20 54  opulating it.  T
17ba0 68 65 6e 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  hen looping over
17bb0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
17bc0 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
17bd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 4e 75      **        Nu
17be0 6c 6c 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  ll 1.    **     
17bf0 20 20 20 23 20 66 69 6c 6c 20 52 6f 77 53 65 74     # fill RowSet
17c00 20 31 20 77 69 74 68 20 65 6e 74 72 69 65 73 20   1 with entries 
17c10 77 68 65 72 65 20 61 3d 35 20 75 73 69 6e 67 20  where a=5 using 
17c20 69 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  i1.    **       
17c30 20 23 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31   # fill Rowset 1
17c40 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68   with entries wh
17c50 65 72 65 20 62 3d 37 20 75 73 69 6e 67 20 69 32  ere b=7 using i2
17c60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23  .    **        #
17c70 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77   fill Rowset 1 w
17c80 69 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72  ith entries wher
17c90 65 20 63 3d 31 31 20 61 6e 64 20 64 3d 31 33 20  e c=11 and d=13 
17ca0 69 33 20 61 6e 64 20 74 31 0a 20 20 20 20 2a 2a  i3 and t1.    **
17cb0 20 20 20 20 20 41 3a 20 52 6f 77 53 65 74 52 65       A: RowSetRe
17cc0 61 64 20 31 2c 20 42 2c 20 32 0a 20 20 20 20 2a  ad 1, B, 2.    *
17cd0 2a 20 20 20 20 20 20 20 20 53 65 65 6b 20 20 20  *        Seek   
17ce0 20 20 20 20 69 2c 20 32 0a 20 20 20 20 2a 2a 0a      i, 2.    **.
17cf0 20 20 20 20 2a 2a 20 54 68 65 20 62 6f 74 74 6f      ** The botto
17d00 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  m of the loop lo
17d10 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
17d20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
17d30 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 30      Goto       0
17d40 2c 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 42  , A.    **     B
17d50 3a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  :.    */.    int
17d60 20 72 65 67 4f 72 52 6f 77 73 65 74 3b 20 20 20   regOrRowset;   
17d70 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
17d80 68 6f 6c 64 69 6e 67 20 74 68 65 20 52 6f 77 53  holding the RowS
17d90 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
17da0 20 69 6e 74 20 72 65 67 4e 65 78 74 52 6f 77 69   int regNextRowi
17db0 64 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  d;      /* Regis
17dc0 74 65 72 20 68 6f 6c 64 69 6e 67 20 6e 65 78 74  ter holding next
17dd0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 57 68   rowid */.    Wh
17de0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
17df0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
17e00 6c 65 74 65 20 4f 52 2d 63 6c 61 75 73 65 20 2a  lete OR-clause *
17e10 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
17e20 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
17e30 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
17e40 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
17e50 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68  bterms */.    Wh
17e60 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
17e70 3b 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  ;    /* A single
17e80 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e 20   subterm within 
17e90 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 2a 2f  the OR-clause */
17ea0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 6f 6e 65  .    SrcList one
17eb0 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Tab;        /* S
17ec0 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
17ed0 69 73 74 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ist */.   .    p
17ee0 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Term = pLevel->p
17ef0 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20  lan.u.pTerm;.   
17f00 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
17f10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17f20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
17f30 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20  r==WO_OR );.    
17f40 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
17f50 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
17f60 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
17f70 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
17f80 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
17f90 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61      codeRowSetEa
17fa0 72 6c 79 20 3d 20 28 72 65 67 52 6f 77 53 65 74  rly = (regRowSet
17fb0 3e 3d 30 20 26 26 20 70 57 43 2d 3e 6e 54 65 72  >=0 && pWC->nTer
17fc0 6d 3d 3d 31 29 20 3f 31 3a 30 3b 0a 0a 20 20 20  m==1) ?1:0;..   
17fd0 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45   if( codeRowSetE
17fe0 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  arly ){.      re
17ff0 67 4f 72 52 6f 77 73 65 74 20 3d 20 72 65 67 52  gOrRowset = regR
18000 6f 77 53 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  owSet;.    }else
18010 7b 0a 20 20 20 20 20 20 72 65 67 4f 72 52 6f 77  {.      regOrRow
18020 73 65 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  set = sqlite3Get
18030 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18060 75 6c 6c 2c 20 30 2c 20 72 65 67 4f 72 52 6f 77  ull, 0, regOrRow
18070 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
18080 6f 6e 65 54 61 62 2e 6e 53 72 63 20 3d 20 31 3b  oneTab.nSrc = 1;
18090 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 41 6c 6c  .    oneTab.nAll
180a0 6f 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54  oc = 1;.    oneT
180b0 61 62 2e 61 5b 30 5d 20 3d 20 2a 70 54 61 62 49  ab.a[0] = *pTabI
180c0 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  tem;.    for(j=0
180d0 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
180e0 3e 61 3b 20 6a 3c 70 4f 72 57 63 2d 3e 6e 54 65  >a; j<pOrWc->nTe
180f0 72 6d 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d  rm; j++, pOrTerm
18100 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
18110 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
18120 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
18130 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
18140 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
18150 0a 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f  .      pSubWInfo
18160 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
18170 65 67 69 6e 28 70 50 61 72 73 65 2c 20 26 6f 6e  egin(pParse, &on
18180 65 54 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  eTab, pOrTerm->p
18190 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53   WHERE_FILL_ROWS
181c0 45 54 2c 20 72 65 67 4f 72 52 6f 77 73 65 74 29  ET, regOrRowset)
181d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62  ;.      if( pSub
181e0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
181f0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
18200 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
18210 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
18220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18230 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
18240 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
18250 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
18260 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18270 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
18280 20 69 66 28 20 21 63 6f 64 65 52 6f 77 53 65 74   if( !codeRowSet
18290 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 72  Early ){.      r
182a0 65 67 4e 65 78 74 52 6f 77 69 64 20 3d 20 73 71  egNextRowid = sq
182b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
182c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 61  pParse);.      a
182d0 64 64 72 43 6f 6e 74 20 3d 20 0a 20 20 20 20 20  ddrCont = .     
182e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
182f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp3(v, OP_RowS
18300 65 74 52 65 61 64 2c 20 72 65 67 4f 72 52 6f 77  etRead, regOrRow
18310 73 65 74 2c 61 64 64 72 42 72 6b 2c 72 65 67 4e  set,addrBrk,regN
18320 65 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  extRowid);.     
18330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18340 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
18350 43 75 72 2c 20 72 65 67 4e 65 78 74 52 6f 77 69  Cur, regNextRowi
18360 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
18370 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18380 70 50 61 72 73 65 2c 20 72 65 67 4e 65 78 74 52  pParse, regNextR
18390 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2f 2a 20  owid);.      /* 
183a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
183b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
183c0 67 4f 72 52 6f 77 73 65 74 29 3b 20 2f 2f 20 50  gOrRowset); // P
183d0 72 65 73 65 72 76 65 20 74 68 65 20 52 6f 77 53  reserve the RowS
183e0 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76  et */.      pLev
183f0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f  el->op = OP_Goto
18400 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
18410 70 32 20 3d 20 61 64 64 72 43 6f 6e 74 3b 0a 20  p2 = addrCont;. 
18420 20 20 20 7d 0a 20 20 20 20 64 69 73 61 62 6c 65     }.    disable
18430 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
18440 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
18450 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18460 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
18470 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
18480 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65  * Case 5:  There
18490 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
184a0 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
184b0 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
184c0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
184d0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
184e0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
184f0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
18500 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  le==0 );.    ass
18510 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a  ert( bRev==0 );.
18520 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
18530 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
18540 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
18550 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
18560 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
18570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
18580 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
18590 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
185a0 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
185b0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
185c0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 63 6f 64 65  N_STEP;.    code
185d0 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30 3b  RowSetEarly = 0;
185e0 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20  .  }.  notReady 
185f0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d  &= ~getMask(pWC-
18600 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
18610 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  ;..  /* Insert c
18620 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
18630 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
18640 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
18650 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
18660 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
18670 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
18680 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d  bles..  */.  k =
18690 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
186a0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
186b0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
186c0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
186d0 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74  pr *pE;.    test
186e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
186f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
18700 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
18710 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
18720 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
18730 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
18740 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
18750 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
18760 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
18770 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
18780 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
18790 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
187a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
187b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
187c0 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
187d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
187e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
187f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18800 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
18810 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
18820 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
18830 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
18840 6f 6c 43 61 63 68 65 20 2b 3d 20 6b 3b 0a 20 20  olCache += k;.  
18850 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
18860 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
18870 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
18880 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
18890 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
188a0 6c 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b 3b  leColCache -= k;
188b0 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20  .    k = 1;.    
188c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
188d0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
188e0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
188f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
18900 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
18910 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
18920 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
18930 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
18940 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
18950 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
18960 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
18970 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
18980 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
18990 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
189a0 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
189b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
189c0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
189d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
189e0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
189f0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
18a00 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
18a10 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
18a20 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
18a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18a40 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
18a50 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  pParse, pLevel->
18a60 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 73 71  iTabCur);.    sq
18a70 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f  lite3ExprClearCo
18a80 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
18a90 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
18aa0 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  r);.    for(pTer
18ab0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
18ac0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
18ad0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
18ae0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
18af0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
18b00 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
18b10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
18b20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
18b30 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
18b40 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
18b50 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
18b60 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
18b70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18b80 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
18b90 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
18ba0 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ady)!=0 ) contin
18bb0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
18bc0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
18bd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18be0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
18bf0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
18c00 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
18c10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
18c20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
18c30 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
18c40 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
18c50 2f 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 77 61  /*.  ** If it wa
18c60 73 20 72 65 71 75 65 73 74 65 64 20 74 6f 20 73  s requested to s
18c70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
18c80 20 69 6e 20 61 20 72 6f 77 73 65 74 20 61 6e 64   in a rowset and
18c90 20 74 68 61 74 20 68 61 73 0a 20 20 2a 2a 20 6e   that has.  ** n
18ca0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
18cb0 64 6f 2c 20 74 68 65 6e 20 64 6f 20 73 6f 20 6e  do, then do so n
18cc0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ow..  */.  if( r
18cd0 65 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20 21  egRowSet>=0 && !
18ce0 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
18cf0 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  ){.    int r1 = 
18d00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18d10 67 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  g(pParse);.#ifnd
18d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
18d30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
18d40 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  if(  (pLevel->pl
18d50 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
18d60 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
18d70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
18d80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18d90 2c 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75  , OP_VRowid, iCu
18da0 72 2c 20 72 31 29 3b 0a 20 20 20 20 7d 65 6c 73  r, r1);.    }els
18db0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
18dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
18de0 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20  id, iCur, r1);. 
18df0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18e00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18e10 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52  _RowSetAdd, regR
18e20 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20  owSet, r1);.    
18e30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18e40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18e50 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
18e60 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69   notReady;.}..#i
18e70 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18e80 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65  _TEST)./*.** The
18e90 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
18ea0 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74  ble holds a text
18eb0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
18ec0 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72  query plan gener
18ed0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d  ated.** by the m
18ee0 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
18ef0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
18f00 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61  egin().  Each ca
18f10 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e  ll to WhereBegin
18f20 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
18f30 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68  he previous.  Th
18f40 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
18f50 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
18f60 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73  ng and.** analys
18f70 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72  is only..*/.char
18f80 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
18f90 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20  lan[BMS*2*40];  
18fa0 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a  /* Text of the j
18fb0 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oin */.static in
18fc0 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20  t nQPlan = 0;   
18fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
18fe0 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20  xt free slow in 
18ff0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f  _query_plan[] */
19000 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
19010 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  TE_TEST */.../*.
19020 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
19030 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
19040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
19050 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
19060 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
19070 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
19080 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
19090 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
190a0 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
190b0 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
190c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
190d0 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57  info *pInfo = pW
190e0 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49  Info->a[i].pIdxI
190f0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
19100 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
19110 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
19120 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
19130 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
19140 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19150 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  pInfo);.      }.
19160 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43      }.    whereC
19170 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66  lauseClear(pWInf
19180 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c  o->pWC);.    sql
19190 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
191a0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
191b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
191c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
191d0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
191e0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
191f0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
19200 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
19210 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
19220 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
19230 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
19240 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
19250 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
19260 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
19270 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
19280 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
19290 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
192a0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
192b0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
192c0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
192d0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
192e0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
192f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
19300 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
19310 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
19320 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
19330 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
19340 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
19350 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
19360 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
19370 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
19380 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
19390 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
193a0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
193b0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
193c0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
193d0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
193e0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
193f0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
19400 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
19410 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
19420 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
19430 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
19440 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
19450 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
19460 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
19470 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
19480 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
19490 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
194a0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
194b0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
194c0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
194d0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
194e0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
194f0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
19500 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
19510 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
19520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
19530 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
19540 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
19550 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
19560 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
19580 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
19590 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
195c0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
195d0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
19600 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
19610 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
19620 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
19630 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
19640 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
19650 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
19660 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
19670 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
19680 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
19690 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
196a0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
196b0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
196c0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
196d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
196e0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
196f0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
19700 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
19710 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
19720 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
19730 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
19740 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
19750 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
19760 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
19770 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
19780 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
19790 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
197a0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
197b0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
197c0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
197d0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
197e0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
197f0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
19800 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
19810 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
19820 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
19830 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
19840 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
19850 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
19860 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
19870 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
19880 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
19890 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
198a0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
198b0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
198c0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
198d0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
198e0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
198f0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
19900 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
19910 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
19920 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
19930 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
19940 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
19950 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
19960 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
19970 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
19980 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
19990 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
199a0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
199b0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
199c0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
199d0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
199e0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
199f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
19a00 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
19a10 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
19a20 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
19a30 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
19a40 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
19a50 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
19a60 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
19a70 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
19a80 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
19a90 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
19aa0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
19ab0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
19ac0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
19ad0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
19ae0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
19af0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
19b00 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
19b10 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
19b20 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
19b30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
19b40 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
19b50 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
19b60 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
19b70 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
19b80 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
19b90 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
19ba0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
19bb0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
19bc0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
19bd0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
19be0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
19bf0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
19c00 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
19c10 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
19c20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
19c30 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
19c40 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
19c50 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
19c60 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
19c70 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
19c80 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
19c90 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
19ca0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
19cb0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
19cc0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
19cd0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
19ce0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
19cf0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
19d00 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
19d10 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
19d20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
19d30 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
19d40 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
19d50 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
19d60 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
19d70 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
19d80 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
19d90 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
19da0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
19db0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
19dc0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
19dd0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
19de0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
19df0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
19e00 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
19e10 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
19e20 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
19e30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19e40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19e50 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
19e60 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
19e70 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
19e80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
19e90 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
19ea0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
19eb0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
19ec0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
19ed0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
19ee0 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
19ef0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
19f00 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
19f10 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
19f20 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
19f30 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
19f40 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
19f50 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
19f60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
19f70 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
19f80 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
19f90 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
19fa0 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
19fb0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
19fc0 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
19fd0 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
19fe0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
19ff0 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
1a000 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
1a010 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
1a020 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
1a030 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
1a040 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
1a050 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
1a060 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
1a070 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1a080 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
1a090 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
1a0a0 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
1a0b0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
1a0c0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
1a0d0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
1a0e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1a0f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1a100 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1a110 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1a120 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
1a130 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
1a140 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
1a150 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
1a160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1a170 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1a180 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
1a190 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
1a1a0 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
1a1b0 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 63 74 72  ULL */.  u8 wctr
1a1c0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f  lFlags,        /
1a1d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
1a1e0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
1a1f0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
1a200 68 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  h */.  int regRo
1a210 77 53 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  wSet         /* 
1a220 52 65 67 69 73 74 65 72 20 68 6f 6c 64 20 52 6f  Register hold Ro
1a230 77 53 65 74 20 69 66 20 57 48 45 52 45 5f 46 49  wSet if WHERE_FI
1a240 4c 4c 5f 52 4f 57 53 45 54 20 69 73 20 73 65 74  LL_ROWSET is set
1a250 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1a280 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
1a290 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1a2a0 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
1a2b0 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
1a2c0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
1a2d0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
1a2e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a2f0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
1a300 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
1a310 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
1a320 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
1a330 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
1a340 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
1a350 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
1a360 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1a370 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
1a380 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
1a390 6b 20 73 65 74 20 2a 2f 0a 20 20 2f 2f 57 68 65  k set */.  //Whe
1a3a0 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
1a3b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1a3c0 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76  RE clause is div
1a3d0 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20  ided into these 
1a3e0 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
1a3f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1a400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1a410 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
1a420 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a430 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1a440 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
1a450 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
1a460 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
1a470 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
1a480 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
1a490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1a4a0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
1a4b0 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
1a4c0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
1a4f0 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
1a500 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1a510 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
1a520 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
1a530 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
1a540 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
1a550 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  Flags */.  sqlit
1a560 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1a570 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1a580 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1a590 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1a5a0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
1a5b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
1a5c0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1a5d0 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
1a5e0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
1a5f0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
1a600 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
1a610 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
1a620 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
1a630 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a640 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
1a650 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
1a660 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
1a670 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a680 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42 79  .  if( ppOrderBy
1a690 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
1a6a0 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20   = *ppOrderBy;. 
1a6b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
1a6c0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1a6d0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
1a6e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
1a6f0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
1a700 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
1a710 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
1a720 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 49 6e 66  rse->db;.  pWInf
1a730 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
1a740 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 20 0a 20 20  locZero(db,  .  
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
1a770 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
1a780 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 70              + (p
1a790 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 29  TabList->nSrc-1)
1a7a0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
1a7b0 65 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  el).            
1a7c0 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1a7d0 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 0a  of(WhereClause).
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 57        + sizeof(W
1a800 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 20  hereMaskSet).   
1a810 20 20 20 20 20 20 20 20 29 3b 0a 20 20 69 66 28          );.  if(
1a820 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a830 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
1a840 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
1a850 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
1a860 76 65 6c 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  vel = pTabList->
1a870 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  nSrc;.  pWInfo->
1a880 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1a890 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
1a8a0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
1a8b0 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
1a8c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a8d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
1a8e0 49 6e 66 6f 2d 3e 72 65 67 52 6f 77 53 65 74 20  Info->regRowSet 
1a8f0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
1a900 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45  WHERE_FILL_ROWSE
1a910 54 29 20 3f 20 72 65 67 52 6f 77 53 65 74 20 3a  T) ? regRowSet :
1a920 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70   -1;.  pWInfo->p
1a930 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72  WC = pWC = (Wher
1a940 65 43 6c 61 75 73 65 2a 29 26 70 57 49 6e 66 6f  eClause*)&pWInfo
1a950 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
1a960 65 6c 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  el];.  pMaskSet 
1a970 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  = (WhereMaskSet*
1a980 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20  )&pWC[1];..  /* 
1a990 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
1a9a0 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
1a9b0 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
1a9c0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
1a9d0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
1a9e0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
1a9f0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
1aa00 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
1aa10 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
1aa20 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
1aa30 69 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20  it(pWC, pParse, 
1aa40 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
1aa50 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
1aa60 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
1aa70 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
1aa80 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c  lit(pWC, pWhere,
1aa90 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
1aaa0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
1aab0 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
1aac0 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
1aad0 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
1aae0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
1aaf0 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
1ab00 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
1ab10 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
1ab20 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
1ab30 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69  Where && (pTabLi
1ab40 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73  st->nSrc==0 || s
1ab50 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1ab60 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
1ab70 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
1ab80 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1ab90 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
1aba0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
1abb0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1abc0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
1abd0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  0;.  }..  /* Ass
1abe0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
1abf0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
1ac00 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
1ac10 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
1ac20 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
1ac30 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
1ac40 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
1ac50 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
1ac60 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
1ac70 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
1ac80 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
1ac90 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
1aca0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
1acb0 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
1acc0 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
1acd0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
1ace0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
1acf0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
1ad00 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
1ad10 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
1ad20 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
1ad30 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
1ad40 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
1ad50 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1ad60 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
1ad70 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
1ad80 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
1ad90 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
1ada0 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
1adb0 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
1adc0 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
1add0 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
1ade0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
1adf0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
1ae00 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
1ae10 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
1ae20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
1ae30 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
1ae40 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
1ae50 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
1ae60 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2f  cket #3015..  */
1ae70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1ae80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1ae90 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
1aea0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
1aeb0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
1aec0 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
1aed0 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
1aee0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
1aef0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
1af00 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1af10 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1af20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
1af30 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
1af40 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
1af50 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1af60 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
1af70 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
1af80 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
1af90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1afa0 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
1afb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
1afc0 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
1afd0 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
1afe0 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
1aff0 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
1b000 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
1b010 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
1b020 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
1b030 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
1b040 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
1b050 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
1b060 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
1b070 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
1b080 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
1b090 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
1b0a0 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
1b0b0 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
1b0c0 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
1b0d0 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
1b0e0 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66  List, pWC);.  if
1b0f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1b100 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
1b110 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
1b120 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
1b130 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
1b140 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
1b150 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1b160 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
1b170 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
1b180 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
1b190 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
1b1a0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
1b1b0 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
1b1c0 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
1b1d0 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
1b1e0 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
1b1f0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73    pWInfo->a[].ws
1b200 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78  Flags   WHERE_xx
1b210 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
1b220 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
1b230 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
1b240 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
1b250 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
1b260 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
1b270 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
1b280 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68  .iFrom     Which
1b290 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
1b2a0 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
1b2b0 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
1b2c0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
1b2d0 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
1b2e0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
1b2f0 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
1b300 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
1b310 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
1b320 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1b330 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57   index.  **   pW
1b340 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20  Info->a[].pTerm 
1b350 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73      When wsFlags
1b360 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d  ==WO_OR, the OR-
1b370 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a  clause term.  **
1b380 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
1b390 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
1b3a0 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
1b3b0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1b3c0 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
1b3d0 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
1b3e0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
1b3f0 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
1b400 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
1b410 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
1b420 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
1b430 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
1b440 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
1b450 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
1b460 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
1b470 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
1b480 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
1b490 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
1b4a0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
1b4b0 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
1b4c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
1b4d0 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
1b4e0 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
1b4f0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b510 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
1b520 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
1b530 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1b560 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
1b570 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
1b580 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20  bestJ = 0;      
1b590 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1b5a0 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
1b5b0 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5d0 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
1b5e0 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
1b5f0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30      int once = 0
1b600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b610 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72  /* True when fir
1b620 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e  st table is seen
1b630 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
1b640 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69  &bestPlan, 0, si
1b650 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b  zeof(bestPlan));
1b660 0a 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43  .    bestPlan.rC
1b670 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1b680 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  _DBL;.    for(j=
1b690 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d  iFrom, pTabItem=
1b6a0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
1b6b0 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
1b6c0 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  c; j++, pTabItem
1b6d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ++){.      int d
1b6e0 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a  oNotReorder;  /*
1b6f0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61   True if this ta
1b700 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ble should not b
1b710 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  e reordered */. 
1b720 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
1b730 43 6f 73 74 3b 20 20 20 2f 2a 20 43 6f 73 74 20  Cost;   /* Cost 
1b740 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1b750 20 62 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a   bestIndex() */.
1b760 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72  .      doNotReor
1b770 64 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d  der =  (pTabItem
1b780 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
1b790 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1b7a0 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  !=0;.      if( o
1b7b0 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72  nce && doNotReor
1b7c0 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
1b7d0 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
1b7e0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
1b7f0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1b800 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
1b810 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
1b820 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
1b830 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
1b840 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b850 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1b860 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  rt( pTabItem->pT
1b870 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ab );.#ifndef SQ
1b880 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1b890 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28  LTABLE.      if(
1b8a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49   IsVirtual(pTabI
1b8b0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1b8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
1b8d0 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
1b8e0 64 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  dx; /* Current v
1b8f0 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  irtual index */.
1b900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b910 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
1b920 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f  dxInfo = &pWInfo
1b930 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
1b940 0a 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 72  .        sCost.r
1b950 43 6f 73 74 20 3d 20 62 65 73 74 56 69 72 74 75  Cost = bestVirtu
1b960 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  alIndex(pParse, 
1b970 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  pWC, pTabItem, n
1b980 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f  ppOrderBy ? *ppO
1b9c0 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30  rderBy : 0, i==0
1b9d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 20 20 20 20 20 70 70 49 64 78 49 6e           ppIdxIn
1ba00 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 43 6f  fo);.        sCo
1ba10 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
1ba20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
1ba30 41 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 73 43  ABLE;.        sC
1ba40 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  ost.plan.u.pVtab
1ba50 49 64 78 20 3d 20 70 56 74 61 62 49 64 78 20 3d  Idx = pVtabIdx =
1ba60 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20   *ppIdxInfo;.   
1ba70 20 20 20 20 20 69 66 28 20 70 56 74 61 62 49 64       if( pVtabId
1ba80 78 20 26 26 20 70 56 74 61 62 49 64 78 2d 3e 6f  x && pVtabIdx->o
1ba90 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
1baa0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 43 6f 73  {.          sCos
1bab0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
1bac0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1bad0 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45  BLE | WHERE_ORDE
1bae0 52 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RBY;.        }. 
1baf0 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61         sCost.pla
1bb00 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  n.nEq = 0;.     
1bb10 20 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42     if( (SQLITE_B
1bb20 49 47 5f 44 42 4c 2f 32 2e 30 29 3c 73 43 6f 73  IG_DBL/2.0)<sCos
1bb30 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  t.rCost ){.     
1bb40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1bb50 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1bb60 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
1bb70 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
1bb80 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 20 20   (the.          
1bb90 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20  ** inital value 
1bba0 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e  of lowestCost in
1bbb0 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69   this loop. If i
1bbc0 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20  t is, then.     
1bbd0 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73       ** the (cos
1bbe0 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
1bbf0 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
1bc00 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20 20  ver be true..   
1bc10 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
1bc20 20 20 20 20 20 73 43 6f 73 74 2e 72 43 6f 73 74       sCost.rCost
1bc30 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
1bc40 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20 20 20  BL/2.0);.       
1bc50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a   }.      }else .
1bc60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1bc70 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
1bc80 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
1bc90 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
1bca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bcb0 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
1bcc0 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
1bcd0 65 72 42 79 20 3a 20 30 2c 20 26 73 43 6f 73 74  erBy : 0, &sCost
1bce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bcf0 20 69 66 28 20 73 43 6f 73 74 2e 72 43 6f 73 74   if( sCost.rCost
1bd00 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20  <bestPlan.rCost 
1bd10 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  ){.        once 
1bd20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 65 73  = 1;.        bes
1bd30 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20  tPlan = sCost;. 
1bd40 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
1bd50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bd60 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72  if( doNotReorder
1bd70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1bd80 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
1bd90 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
1bda0 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
1bdb0 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
1bdc0 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
1bdd0 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
1bde0 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
1bdf0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
1be00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1be10 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
1be20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
1be30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
1be40 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
1be50 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
1be60 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
1be70 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
1be80 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
1be90 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
1bea0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
1beb0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1bec0 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
1bed0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
1bee0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
1bef0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
1bf00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
1bf10 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
1bf20 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
1bf30 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
1bf40 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
1bf50 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
1bf60 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1bf70 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62 6c  that if the tabl
1bf80 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69  e scanned by thi
1bf90 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
1bfa0 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49   had an.    ** I
1bfb0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1bfc0 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c   attached to it,
1bfd0 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20   that the named 
1bfe0 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20  index is being. 
1bff0 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74     ** used for t
1c000 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c  he scan. If not,
1c010 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70   then query comp
1c020 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c  ilation has fail
1c030 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72  ed..    ** Retur
1c040 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
1c050 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54  */.    pIdx = pT
1c060 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
1c070 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  .pIndex;.    ass
1c080 65 72 74 28 20 21 70 49 64 78 0a 20 20 20 20 20  ert( !pIdx.     
1c090 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74 50 6c        || (bestPl
1c0a0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  an.plan.wsFlags&
1c0b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
1c0c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
1c0d0 70 49 64 78 3d 3d 62 65 73 74 50 6c 61 6e 2e 70  pIdx==bestPlan.p
1c0e0 6c 61 6e 2e 75 2e 70 49 64 78 20 29 3b 0a 20 20  lan.u.pIdx );.  
1c0f0 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
1c100 26 26 20 28 28 62 65 73 74 50 6c 61 6e 2e 70 6c  && ((bestPlan.pl
1c110 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1c120 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 0a 20  RE_INDEXED)==0. 
1c130 20 20 20 20 20 20 20 20 7c 7c 20 62 65 73 74 50          || bestP
1c140 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 21  lan.plan.u.pIdx!
1c150 3d 70 49 64 78 29 0a 20 20 20 20 29 7b 0a 20 20  =pIdx).    ){.  
1c160 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c170 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
1c180 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25  not use index: %
1c190 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
1c1a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  ;.      goto whe
1c1b0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
1c1c0 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
1c1d0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
1c1e0 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
1c1f0 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 64 62  *\n"));.  if( db
1c200 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c210 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1c220 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  Error;..  /* If 
1c230 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
1c240 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73  only selects a s
1c250 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20  ingle row, then 
1c260 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
1c270 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65  * clause is irre
1c280 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  levant..  */.  i
1c290 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  f( (andFlags & W
1c2a0 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
1c2b0 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a  && ppOrderBy ){.
1c2c0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
1c2d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1c2e0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1c2f0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
1c300 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
1c310 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
1c320 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
1c330 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
1c340 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
1c350 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
1c360 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
1c370 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
1c380 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
1c390 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
1c3a0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
1c3b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
1c3c0 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
1c3d0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
1c3e0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
1c3f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
1c400 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
1c410 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
1c420 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
1c430 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1c440 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
1c450 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
1c460 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
1c470 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
1c480 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
1c490 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
1c4a0 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
1c4b0 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
1c4c0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
1c4d0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
1c4e0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
1c4f0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
1c500 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
1c510 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
1c520 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
1c530 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1c540 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
1c550 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
1c560 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
1c570 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
1c580 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
1c590 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
1c5a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
1c5b0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
1c5c0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
1c5d0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
1c5e0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
1c5f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1c600 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
1c610 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
1c620 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  x */..#ifndef SQ
1c630 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1c640 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  N.    if( pParse
1c650 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
1c660 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
1c670 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
1c680 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1c690 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1c6a0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1c6b0 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
1c6c0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c6d0 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49  , "TABLE %s", pI
1c6e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1c6f0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1c700 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
1c710 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c720 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c730 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
1c740 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
1c750 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c760 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1c770 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1c780 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
1c790 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1c7a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c7b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57  (db, zMsg, "%s W
1c7c0 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 0a 20  ITH INDEX %s",. 
1c7d0 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20            zMsg, 
1c7e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1c7f0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
1c800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1c810 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1c820 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
1c830 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1c840 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
1c850 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c860 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c870 67 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52 49  g, "%s USING PRI
1c880 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1c890 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1c8a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c8b0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1c8c0 20 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65   else if( (pLeve
1c8d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1c8e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1c8f0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1c900 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1c910 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
1c920 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
1c930 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
1c940 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c950 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c960 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1c970 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1c980 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c9a0 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
1c9b0 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
1c9c0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
1c9d0 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  if.      if( pLe
1c9e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1c9f0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1ca00 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Y ){.        zMs
1ca10 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1ca20 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1ca30 73 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  s ORDER BY", zMs
1ca40 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1ca50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ca60 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1ca70 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  n, i, pLevel->iF
1ca80 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  rom, 0, zMsg, P4
1ca90 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
1caa0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1cab0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
1cac0 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  /.    pTabItem =
1cad0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1cae0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1caf0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
1cb00 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
1cb10 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1cb20 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1cb30 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1cb40 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
1cb50 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1cb60 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
1cb70 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1cb80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
1cb90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cba0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1cbb0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1cbc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1cbd0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1cbe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1cbf0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1cc00 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
1cc10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc20 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
1cc30 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  iCur, 0, 0,.    
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
1cc60 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34  )pTab->pVtab, P4
1cc70 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
1cc80 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
1cc90 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1cca0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ccb0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
1ccc0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
1ccd0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
1cce0 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
1ccf0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
1cd00 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
1cd10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1cd20 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
1cd30 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
1cd40 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
1cd50 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
1cd60 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
1cd70 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
1cd80 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
1cd90 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
1cda0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
1cdb0 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
1cdc0 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
1cdd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1cde0 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74  hangeP2(v, sqlit
1cdf0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1ce00 72 28 76 29 2d 32 2c 20 6e 29 3b 0a 20 20 20 20  r(v)-2, n);.    
1ce10 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
1ce20 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
1ce30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1ce40 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
1ce50 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
1ce60 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
1ce70 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
1ce80 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1ce90 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61  l->iTabCur = pTa
1cea0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1ceb0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
1cec0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1ced0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
1cee0 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  0 ){.      Index
1cef0 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   *pIx = pLevel->
1cf00 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
1cf10 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1cf20 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
1cf30 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
1cf40 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Ix);.      int i
1cf50 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
1cf60 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
1cf70 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
1cf80 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
1cf90 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
1cfa0 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20  ert( iIdxCur>=0 
1cfb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cfc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cfd0 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
1cfe0 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0, pIx->nColumn+
1cff0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1d000 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d010 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
1d020 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
1d030 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1d050 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
1d060 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1d070 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1d080 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
1d090 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
1d0a0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1d0b0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1d0c0 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
1d0d0 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
1d0e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1d0f0 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47  Addr(v);..  /* G
1d100 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
1d110 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
1d120 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
1d130 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
1d140 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
1d150 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
1d160 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
1d170 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
1d180 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
1d190 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
1d1a0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
1d1b0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1d1c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1d1d0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
1d1e0 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
1d1f0 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
1d200 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
1d210 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
1d220 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e  iContinue = pWIn
1d230 66 6f 2d 3e 61 5b 69 2d 31 5d 2e 61 64 64 72 43  fo->a[i-1].addrC
1d240 6f 6e 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ont;..#ifdef SQL
1d250 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72  ITE_TEST  /* For
1d260 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
1d270 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
1d280 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69  */.  /* Record i
1d290 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  n the query plan
1d2a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1d2b0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ut the current t
1d2c0 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  able.  ** and th
1d2d0 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  e index used to 
1d2e0 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e  access it (if an
1d2f0 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  y).  If the tabl
1d300 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73  e itself.  ** is
1d310 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e   not used, its n
1d320 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27  ame is just '{}'
1d330 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69  .  If no index i
1d340 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20  s used.  ** the 
1d350 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20  index is listed 
1d360 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65  as "{}".  If the
1d370 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
1d380 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e  used the.  ** in
1d390 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e  dex name is '*'.
1d3a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1d3b0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1d3c0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  c; i++){.    cha
1d3d0 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
1d3e0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
1d3f0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
1d400 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
1d410 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1d420 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d  >iFrom];.    z =
1d430 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61   pTabItem->zAlia
1d440 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  s;.    if( z==0 
1d450 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  ) z = pTabItem->
1d460 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
1d470 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d480 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
1d490 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
1d4a0 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
1d4b0 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
1d4c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
1d4d0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d4e0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
1d4f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1d500 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
1d510 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22  an[nQPlan], "{}"
1d520 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , 2);.        nQ
1d530 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Plan += 2;.     
1d540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d550 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
1d560 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
1d570 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  n], z, n);.     
1d580 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
1d590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d5a0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1d5b0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
1d5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
1d5d0 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
1d5e0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1d5f0 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
1d600 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
1d610 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d620 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
1d630 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28  RANGE );.    if(
1d640 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1d650 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  Flags & (WHERE_R
1d660 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
1d670 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
1d680 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
1d690 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1d6a0 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29  QPlan], "* ", 2)
1d6b0 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
1d6c0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
1d6d0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
1d6e0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1d6f0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
1d700 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1d710 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c  3Strlen30(pLevel
1d720 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
1d730 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
1d740 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
1d750 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
1d760 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20  _plan)-2 ){.    
1d770 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
1d780 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1d790 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e  QPlan], pLevel->
1d7a0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
1d7b0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  me, n);.        
1d7c0 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
1d7d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
1d7e0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
1d7f0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
1d800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d810 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
1d820 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1d830 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b  lan], "{} ", 3);
1d840 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
1d850 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   3;.    }.  }.  
1d860 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
1d870 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
1d880 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
1d890 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
1d8a0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
1d8b0 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
1d8c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
1d8d0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
1d8e0 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
1d8f0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1d900 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
1d910 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
1d920 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
1d930 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
1d940 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
1d950 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
1d960 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1d970 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
1d980 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
1d990 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49   */.  return pWI
1d9a0 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
1d9b0 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
1d9c0 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
1d9d0 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72 65  inError:.  where
1d9e0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
1d9f0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nfo);.  return 0
1da00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1da10 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
1da20 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
1da30 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
1da40 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1da50 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
1da60 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1da70 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1da80 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
1da90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
1daa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1dab0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1dac0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
1dad0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1dae0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
1daf0 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72  el *pLevel;.  Sr
1db00 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
1db10 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1db20 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
1db30 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1db40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
1db50 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
1db60 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
1db70 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
1db80 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1db90 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54   -1);.  for(i=pT
1dba0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20  abList->nSrc-1; 
1dbb0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
1dbc0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
1dbd0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  ->a[i];.    sqli
1dbe0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1dbf0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
1dc00 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
1dc10 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
1dc20 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
1dc30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dc40 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
1dc50 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
1dc60 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73  el->p2);.      s
1dc70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1dc80 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
1dc90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1dca0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1dcb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1dcc0 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
1dcd0 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
1dce0 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
1dcf0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
1dd00 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
1dd10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1dd20 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
1dd30 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
1dd40 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
1dd50 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
1dd60 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1dd70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
1dd80 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
1dd90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1dda0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
1ddb0 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
1ddc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ddd0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1dde0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
1ddf0 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
1de00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1de10 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
1de20 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
1de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1de40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1de50 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1de60 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
1de70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1de80 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
1de90 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1dea0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
1deb0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1dec0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
1ded0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1dee0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
1def0 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
1df00 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
1df10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1df20 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
1df30 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
1df40 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1df50 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
1df60 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
1df70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df80 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
1df90 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
1dfa0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
1dfb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dfc0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1dfd0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
1dfe0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 73 71  First);.      sq
1dff0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1e000 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1e010 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
1e020 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
1e030 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
1e040 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e050 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
1e060 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
1e070 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e080 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
1e090 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
1e0a0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
1e0b0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
1e0c0 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
1e0d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1e0e0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1e0f0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
1e100 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1e110 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
1e120 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  l++){.    struct
1e130 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e140 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
1e150 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1e160 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
1e170 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
1e180 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
1e190 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
1e1a0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
1e1b0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
1e1c0 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
1e1d0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
1e1e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1e1f0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
1e200 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  ss && (pLevel->p
1e210 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e220 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
1e230 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e240 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1e250 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
1e260 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1e270 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76   }.    if( (pLev
1e280 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1e290 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1e2a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
1e2b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1e2c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
1e2d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
1e2e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1e2f0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
1e300 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
1e310 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
1e320 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
1e330 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
1e340 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
1e350 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
1e360 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
1e370 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
1e380 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
1e390 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
1e3a0 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
1e3b0 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
1e3c0 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
1e3d0 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
1e3e0 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
1e3f0 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
1e400 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
1e410 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
1e420 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
1e430 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
1e440 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
1e450 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
1e460 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
1e470 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
1e480 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
1e490 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
1e4a0 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
1e4b0 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
1e4c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
1e4d0 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
1e4e0 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
1e4f0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
1e500 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1e510 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
1e520 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
1e530 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
1e540 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
1e550 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
1e560 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
1e570 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
1e580 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
1e590 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
1e5a0 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
1e5b0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
1e5c0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e5d0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
1e5e0 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
1e5f0 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
1e600 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
1e610 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
1e620 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
1e630 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65  x;.      int use
1e640 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76  IndexOnly = pLev
1e650 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1e660 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1e670 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  Y;..      assert
1e680 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
1e690 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
1e6a0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
1e6b0 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
1e6c0 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
1e6d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e6e0 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
1e6f0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
1e700 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
1e710 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e720 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
1e730 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
1e740 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1e750 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1e760 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
1e770 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1e780 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
1e790 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1e7a0 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
1e7b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
1e7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e7d0 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
1e7e0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
1e7f0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
1e800 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
1e810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
1e840 73 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f  ssert(!useIndexO
1e850 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e  nly || j<pIdx->n
1e860 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1e870 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1e880 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
1e890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1e8a0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
1e8b0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
1e8c0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
1e8d0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
1e8e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e8f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1e900 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e  NullRow && useIn
1e910 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  dexOnly ){.     
1e920 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
1e930 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1e940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1e960 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
1e970 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
1e980 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
1e990 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.