/ Hex Artifact Content
Login

Artifact 685a1e8d2b84946a4804ae7973e4704f76a71ac6:


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 33  : where.c,v 1.33
0340: 38 20 32 30 30 38 2f 31 32 2f 31 37 20 31 39 3a  8 2008/12/17 19:
0350: 32 32 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a  22:16 drh Exp $.
0360: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0370: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0380: 20 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61   Trace output ma
0390: 63 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69  cros.*/.#if defi
03a0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
03b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
03c0: 54 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71  TE_DEBUG).int sq
03d0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
03e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
03f0: 30 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  0.# define WHERE
0400: 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c  TRACE(X)  if(sql
0410: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 29 20  ite3WhereTrace) 
0420: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0430: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0440: 69 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58  ine WHERETRACE(X
0450: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72  ).#endif../* For
0460: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a  ward reference.*
0470: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65   WhereClause Whe
0490: 72 65 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65  reClause;.typede
04a0: 66 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  f struct ExprMas
04b0: 6b 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74  kSet ExprMaskSet
04c0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
04d0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
04e0: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
04f0: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0500: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0510: 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71  fo;../*.** The q
0520: 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75  uery generator u
0530: 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ses an array of 
0540: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69  instances of thi
0550: 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  s structure to.*
0560: 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a  * help it analyz
0570: 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  e the subexpress
0580: 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52  ions of the WHER
0590: 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20  E clause.  Each 
05a0: 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
05b0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
05c0: 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
05d0: 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e  the others by AN
05e0: 44 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 20  D operators..** 
05f0: 28 4e 6f 74 65 3a 20 74 68 65 20 73 61 6d 65 20  (Note: the same 
0600: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
0610: 73 20 61 6c 73 6f 20 72 65 75 73 65 64 20 74 6f  s also reused to
0620: 20 68 6f 6c 64 20 61 20 67 72 6f 75 70 20 6f 66   hold a group of
0630: 20 74 65 72 6d 73 0a 2a 2a 20 73 65 70 61 72 61   terms.** separa
0640: 74 65 64 20 62 79 20 4f 52 20 6f 70 65 72 61 74  ted by OR operat
0650: 6f 72 73 2e 20 20 42 75 74 20 61 74 20 74 68 65  ors.  But at the
0660: 20 74 6f 70 2d 6c 65 76 65 6c 2c 20 65 76 65 72   top-level, ever
0670: 79 74 68 69 6e 67 20 69 73 20 41 4e 44 0a 2a 2a  ything is AND.**
0680: 20 73 65 70 61 72 61 74 65 64 2e 29 0a 2a 2a 0a   separated.).**.
0690: 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d  ** All WhereTerm
06a0: 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20  s are collected 
06b0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  into a single Wh
06c0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
06d0: 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f  ure.  .** The fo
06e0: 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79  llowing identity
06f0: 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   holds:.**.**   
0700: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70       WhereTerm.p
0710: 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e  WC->a[WhereTerm.
0720: 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72  idx] == WhereTer
0730: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74  m.**.** When a t
0740: 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f  erm is of the fo
0750: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
0760: 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65         X <op> <e
0770: 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xpr>.**.** where
0780: 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e   X is a column n
0790: 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  ame and <op> is 
07a0: 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f  one of certain o
07b0: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65  perators,.** the
07c0: 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74  n WhereTerm.left
07d0: 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65  Cursor and Where
07e0: 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d  Term.u.leftColum
07f0: 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20  n record the.** 
0800: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e  cursor number an
0810: 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  d column number 
0820: 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72  for X.  WhereTer
0830: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f  m.eOperator reco
0840: 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20  rds.** the <op> 
0850: 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20  using a bitmask 
0860: 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64  encoding defined
0870: 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77   by WO_xxx below
0880: 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66  .  The.** use of
0890: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
08a0: 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72  ing for the oper
08b0: 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74  ator allows us t
08c0: 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63  o search.** quic
08d0: 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68  kly for terms th
08e0: 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20  at match any of 
08f0: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
0900: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  t operators..**.
0910: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d  ** A WhereTerm m
0920: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f  ight also be two
0930: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
0940: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
0950: 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  R:.**.**        
0960: 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70   (t1.X <op> <exp
0970: 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70  r>) OR (t1.Y <op
0980: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e  > <expr>) OR ...
0990: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
09a0: 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46  second case, wtF
09b0: 6c 61 67 20 61 73 20 74 68 65 20 54 45 52 4d 5f  lag as the TERM_
09c0: 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64 20 65  ORINFO set and e
09d0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a  Operator==WO_OR.
09e0: 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
09f0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66  Term.u.pOrInfo f
0a00: 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  ield points to a
0a10: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
0a20: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20  tion that.** is 
0a30: 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20  collected about 
0a40: 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  the.**.** If a t
0a50: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
0a60: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
0a70: 20 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66   match either of
0a80: 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75   the two previou
0a90: 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c  s.** categories,
0aa0: 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d   then eOperator=
0ab0: 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65  =0.  The WhereTe
0ac0: 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69  rm.pExpr field i
0ad0: 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74  s still set.** t
0ae0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  o the original s
0af0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  ubexpression con
0b00: 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73  tent and wtFlags
0b10: 20 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f   is set up appro
0b20: 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20  priately.** but 
0b30: 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  no other fields 
0b40: 69 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  in the WhereTerm
0b50: 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e   object are mean
0b60: 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68  ingful..**.** Wh
0b70: 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c  en eOperator!=0,
0b80: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
0b90: 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72   prereqAll recor
0ba0: 64 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72  d sets of cursor
0bb0: 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74   numbers,.** but
0bc0: 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69   they do so indi
0bd0: 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c  rectly.  A singl
0be0: 65 20 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74  e ExprMaskSet st
0bf0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
0c00: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
0c10: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
0c20: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
0c30: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
0c40: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
0c50: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
0c60: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
0c70: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
0c80: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
0c90: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
0ca0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
0cb0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
0cc0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
0cd0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
0ce0: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
0cf0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
0d00: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
0d10: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
0d20: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
0d30: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
0d40: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
0d50: 64 20 34 35 2e 20 20 54 68 65 20 45 78 70 72 4d  d 45.  The ExprM
0d60: 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c  askSet.** transl
0d70: 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72 73  ates these spars
0d80: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0d90: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
0da0: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65  e integers.** be
0db0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69  ginning with 0 i
0dc0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
0dd0: 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c  the best possibl
0de0: 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76 61  e use of the ava
0df0: 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69  ilable.** bits i
0e00: 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20  n the Bitmask.  
0e10: 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70  So, in the examp
0e20: 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75  le above, the cu
0e30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20  rsor numbers.** 
0e40: 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  would be mapped 
0e50: 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20  into integers 0 
0e60: 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a 2a  through 7..**.**
0e70: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
0e80: 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20 69  erms in a join i
0e90: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
0ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 0a   number of bits.
0eb0: 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67 68  ** in prereqRigh
0ec0: 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 2e  t and prereqAll.
0ed0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
0ee0: 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65 20   64 bits, hence 
0ef0: 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e 6c  SQLite.** is onl
0f00: 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73  y able to proces
0f10: 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34 20  s joins with 64 
0f20: 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73 2e  or fewer tables.
0f30: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0f40: 63 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65  ct WhereTerm Whe
0f50: 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74 20 57  reTerm;.struct W
0f60: 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70  hereTerm {.  Exp
0f70: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
0f80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0f90: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
0fa0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69  sion that is thi
0fb0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
0fc0: 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
0fd0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70      /* Disable p
0fe0: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77  WC->a[iParent] w
0ff0: 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69  hen this term di
1000: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sabled */.  int 
1010: 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20  leftCursor;     
1020: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1030: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
1040: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
1050: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e    union {.    in
1060: 74 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20  t leftColumn;   
1070: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
1080: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
1090: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
10a0: 2f 0a 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66  /.    WhereOrInf
10b0: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a  o *pOrInfo;   /*
10c0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
10d0: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
10e0: 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20 20 20 57 68  =WO_OR */.    Wh
10f0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
1100: 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69  Info; /* Extra i
1110: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
1120: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
1130: 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31 36 20  */.  } u;.  u16 
1140: 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20  eOperator;      
1150: 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76      /* A WO_xx v
1160: 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20  alue describing 
1170: 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77 74 46  <op> */.  u8 wtF
1180: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1190: 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20 62 69    /* TERM_xxx bi
11a0: 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65  t flags.  See be
11b0: 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69  low */.  u8 nChi
11c0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
11d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
11e0: 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74  ildren that must
11f0: 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20   disable us */. 
1200: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1210: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
1220: 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72 6d  clause this term
1230: 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20   is part of */. 
1240: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52   Bitmask prereqR
1250: 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d  ight;    /* Bitm
1260: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73  ask of tables us
1270: 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70 52 69  ed by pExpr->pRi
1280: 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ght */.  Bitmask
1290: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
12a0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
12b0: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
12c0: 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d 3b 0a   by pExpr */.};.
12d0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
12e0: 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54 65  alues of WhereTe
12f0: 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a 23 64  rm.wtFlags.*/.#d
1300: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
1310: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
1320: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
1330: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1340: 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23 64 65  b, pExpr) */.#de
1350: 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55 41  fine TERM_VIRTUA
1360: 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 41  L    0x02   /* A
1370: 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  dded by the opti
1380: 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63  mizer.  Do not c
1390: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ode */.#define T
13a0: 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20 30  ERM_CODED      0
13b0: 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74 65  x04   /* This te
13c0: 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  rm is already co
13d0: 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ded */.#define T
13e0: 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20 30  ERM_COPIED     0
13f0: 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20 63  x08   /* Has a c
1400: 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hild */.#define 
1410: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20 20 20  TERM_ORINFO     
1420: 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64 20 74  0x10   /* Need t
1430: 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72 65  o free the Where
1440: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 6f  Term.u.pOrInfo o
1450: 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69 6e 65  bject */.#define
1460: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 20 20   TERM_ANDINFO   
1470: 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65 64 20   0x20   /* Need 
1480: 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72  to free the Wher
1490: 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e 66 6f  eTerm.u.pAndInfo
14a0: 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e 65 20   obj */.#define 
14b0: 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20  TERM_OR_OK      
14c0: 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64 20 64  0x40   /* Used d
14d0: 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  uring OR-clause 
14e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f  processing */../
14f0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1500: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1510: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
1520: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
1530: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45  n about a.** WHE
1540: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74  RE clause.  Most
1550: 6c 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  ly this is a con
1560: 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f  tainer for one o
1570: 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d  r more WhereTerm
1580: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
1590: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
15a0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
15b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15c0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
15d0: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
15e0: 61 73 6b 53 65 74 3b 20 20 20 2f 2a 20 4d 61 70  askSet;   /* Map
15f0: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 69 6e  ping of table in
1600: 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 73 6b  dices to bitmask
1610: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  s */.  int nTerm
1620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1640: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f  ms */.  int nSlo
1650: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1660: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1670: 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a  tries in a[] */.
1680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20    WhereTerm *a; 
1690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61             /* Ea
16a0: 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73  ch a[] describes
16b0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57   a term of the W
16c0: 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20  HERE cluase */. 
16d0: 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74   WhereTerm aStat
16e0: 69 63 5b 34 5d 3b 20 20 20 20 2f 2a 20 49 6e 69  ic[4];    /* Ini
16f0: 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63  tial static spac
1700: 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a  e for a[] */.};.
1710: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1720: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1730: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
1740: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
1750: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
1760: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1770: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
1780: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1790: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
17a0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
17b0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
17c0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
17d0: 54 68 65 20 4f 52 20 73 75 62 65 78 70 72 65 73  The OR subexpres
17e0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
17f0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  */.  double cost
1800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1810: 20 43 6f 73 74 20 6f 66 20 65 76 61 6c 75 61 74   Cost of evaluat
1820: 69 6e 67 20 74 68 69 73 20 4f 52 20 73 75 62 65  ing this OR sube
1830: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a  xpression */.};.
1840: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1850: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1860: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
1870: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
1880: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
1890: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
18a0: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
18b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
18c0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
18d0: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
18e0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
18f0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1900: 2f 2a 20 54 68 65 20 4f 52 20 73 75 62 65 78 70  /* The OR subexp
1910: 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f  ression broken o
1920: 75 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ut */.  Index *p
1930: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1940: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1950: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
1960: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1970: 2a 20 43 6f 73 74 20 6f 66 20 65 76 61 6c 75 61  * Cost of evalua
1980: 74 69 6e 67 20 74 68 69 73 20 4f 52 20 73 75 62  ting this OR sub
1990: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b  expression */.};
19a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
19b0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
19c0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  wing structure k
19d0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20  eeps track of a 
19e0: 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65  mapping.** betwe
19f0: 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  en VDBE cursor n
1a00: 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20  umbers and bits 
1a10: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20  of the bitmasks 
1a20: 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  in WhereTerm..**
1a30: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72  .** The VDBE cur
1a40: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
1a50: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63  small integers c
1a60: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20  ontained in .** 
1a70: 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75  SrcList_item.iCu
1a80: 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54  rsor and Expr.iT
1a90: 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f  able fields.  Fo
1aa0: 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52  r any given WHER
1ab0: 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68  E .** clause, th
1ac0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1ad0: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e   might not begin
1ae0: 20 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79   with 0 and they
1af0: 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69   might.** contai
1b00: 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75  n gaps in the nu
1b10: 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65  mbering sequence
1b20: 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74  .  But we want t
1b30: 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a  o make maximum.*
1b40: 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74  * use of the bit
1b50: 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b  s in our bitmask
1b60: 73 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  s.  This structu
1b70: 72 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61  re provides a ma
1b80: 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68  pping.** from th
1b90: 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20  e sparse cursor 
1ba0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e  numbers into con
1bb0: 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72  secutive integer
1bc0: 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77  s beginning.** w
1bd0: 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ith 0..**.** If 
1be0: 45 78 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b 41  ExprMaskSet.ix[A
1bf0: 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68  ]==B it means th
1c00: 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  at The A-th bit 
1c10: 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20  of a Bitmask.** 
1c20: 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45  corresponds VDBE
1c30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42   cursor number B
1c40: 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  .  The A-th bit 
1c50: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20  of a bitmask is 
1c60: 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  1<<A..**.** For 
1c70: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
1c90: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65  ression used the
1ca0: 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f  se VDBE.** curso
1cb0: 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39  rs:  4, 5, 8, 29
1cc0: 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20  , 57, 73.  Then 
1cd0: 74 68 65 20 20 45 78 70 72 4d 61 73 6b 53 65 74  the  ExprMaskSet
1ce0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f   structure.** wo
1cf0: 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75  uld map those cu
1d00: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
1d10: 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67 68  o bits 0 through
1d20: 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74   5..**.** Note t
1d30: 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20  hat the mapping 
1d40: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
1d50: 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20  ly ordered.  In 
1d60: 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61  the example.** a
1d70: 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e  bove, the mappin
1d80: 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20  g might go like 
1d90: 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e  this:  4->3, 5->
1da0: 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a  1, 8->2, 29->0,.
1db0: 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e  ** 57->5, 73->4.
1dc0: 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20    Or one of 719 
1dd0: 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f  other combinatio
1de0: 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ns might be used
1df0: 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  . It.** does not
1e00: 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20   really matter. 
1e10: 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61   What is importa
1e20: 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72 73  nt is that spars
1e30: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
1e40: 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70  ers all get mapp
1e50: 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62  ed into bit numb
1e60: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
1e70: 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69  ith 0 and contai
1e80: 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f  n.** no gaps..*/
1e90: 0a 73 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b  .struct ExprMask
1ea0: 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  Set {.  int n;  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ed0: 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73  of assigned curs
1ee0: 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  or values */.  i
1ef0: 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20  nt ix[BMS];     
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f10: 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  Cursor assigned 
1f20: 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d  to each bit */.}
1f30: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  ;.../*.** Bitmas
1f40: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
1f50: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
1f60: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
1f70: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
1f80: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
1f90: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
1fa0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
1fb0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
1fc0: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
1fd0: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
1fe0: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
1ff0: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
2000: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
2010: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
2020: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
2030: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2040: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2050: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2060: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
2070: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2080: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
2090: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
20a0: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
20b0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
20c0: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
20d0: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
20e0: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
20f0: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
2100: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
2110: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
2120: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
2130: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
2140: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2150: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2160: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
2170: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
2180: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
2190: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
21a0: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
21b0: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f  ../*.** Value fo
21c0: 72 20 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e  r wsFlags return
21d0: 65 64 20 62 79 20 62 65 73 74 49 6e 64 65 78 28  ed by bestIndex(
21e0: 29 20 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a  ) and stored in.
21f0: 2a 2a 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  ** WhereLevel.ws
2200: 46 6c 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c  Flags.  These fl
2210: 61 67 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68  ags determine wh
2220: 69 63 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74  ich search.** st
2230: 72 61 74 65 67 69 65 73 20 61 72 65 20 61 70 70  rategies are app
2240: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ropriate..**.** 
2250: 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66  The least signif
2260: 69 63 61 6e 74 20 31 32 20 62 69 74 73 20 69 73  icant 12 bits is
2270: 20 72 65 73 65 72 76 65 64 20 61 73 20 61 20 6d   reserved as a m
2280: 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75  ask for WO_ valu
2290: 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65  es above..** The
22a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
22b0: 61 67 73 20 66 69 65 6c 64 20 69 73 20 75 73 75  ags field is usu
22c0: 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49  ally set to WO_I
22d0: 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c  N|WO_EQ|WO_ISNUL
22e0: 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  L..** But if the
22f0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69   table is the ri
2300: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c  ght table of a l
2310: 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c  eft join, WhereL
2320: 65 76 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20  evel.wsFlags.** 
2330: 69 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  is set to WO_IN|
2340: 57 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72  WO_EQ.  The Wher
2350: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2360: 69 65 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65  ield can then be
2370: 20 75 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20   used as.** the 
2380: 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20 74  "op" parameter t
2390: 6f 20 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20  o findTerm when 
23a0: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
23b0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
23c0: 61 69 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c  aints..** ISNULL
23d0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
23e0: 6c 20 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73  l then not be us
23f0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ed on the right 
2400: 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a  table of a left.
2410: 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74  ** join.  Ticket
2420: 73 20 23 32 31 37 37 20 61 6e 64 20 23 32 31 38  s #2177 and #218
2430: 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  9..*/.#define WH
2440: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20  ERE_ROWID_EQ    
2450: 20 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20   0x00001000  /* 
2460: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
2470: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  wid IN (...) */.
2480: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
2490: 57 49 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30  WID_RANGE  0x000
24a0: 30 32 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c  02000  /* rowid<
24b0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69  EXPR and/or rowi
24c0: 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  d>EXPR */.#defin
24d0: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
24e0: 51 20 20 20 20 30 78 30 30 30 31 30 30 30 30 20  Q    0x00010000 
24f0: 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20   /* x=EXPR or x 
2500: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
2510: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
2520: 5f 52 41 4e 47 45 20 30 78 30 30 30 32 30 30 30  _RANGE 0x0002000
2530: 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64  0  /* x<EXPR and
2540: 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64  /or x>EXPR */.#d
2550: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2560: 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34 30  MN_IN    0x00040
2570: 30 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  000  /* x IN (..
2580: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
2590: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20  ERE_TOP_LIMIT   
25a0: 20 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20   0x00100000  /* 
25b0: 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50  x<EXPR or x<=EXP
25c0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
25d0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54  #define WHERE_BT
25e0: 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32  M_LIMIT    0x002
25f0: 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52  00000  /* x>EXPR
2600: 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73   or x>=EXPR cons
2610: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
2620: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
2630: 20 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20       0x00800000 
2640: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
2650: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
2660: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2670: 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 30 78  _ORDERBY      0x
2680: 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f 75 74  01000000  /* Out
2690: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
26a0: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
26b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
26c0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 30  E_REVERSE      0
26d0: 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20 53 63  x02000000  /* Sc
26e0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
26f0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2700: 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20  HERE_UNIQUE     
2710: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2720: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
2730: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
2740: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2750: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2760: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2770: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2780: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2790: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
27a0: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
27b0: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
27c0: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
27d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
27e0: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
27f0: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
2800: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2810: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2820: 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72  auseInit(.  Wher
2830: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2840: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2850: 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e  eClause to be in
2860: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50  itialized */.  P
2870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2890: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
28a0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
28b0: 2a 70 4d 61 73 6b 53 65 74 20 20 20 20 2f 2a 20  *pMaskSet    /* 
28c0: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
28d0: 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62 69  le indices to bi
28e0: 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70  tmasks */.){.  p
28f0: 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  WC->pParse = pPa
2900: 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73  rse;.  pWC->pMas
2910: 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b  kSet = pMaskSet;
2920: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20  .  pWC->nTerm = 
2930: 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  0;.  pWC->nSlot 
2940: 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d  = ArraySize(pWC-
2950: 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43  >aStatic);.  pWC
2960: 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74  ->a = pWC->aStat
2970: 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  ic;.}../* Forwar
2980: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2990: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
29a0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
29b0: 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a  eClause*);../*.*
29c0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  * Deallocate all
29d0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
29e0: 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f  ed with a WhereO
29f0: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rInfo object..*/
2a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2a10: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73  reOrInfoDelete(s
2a20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
2a30: 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  eOrInfo *p){.  i
2a40: 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68 65 72  f( p ){.    wher
2a50: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
2a60: 3e 77 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >wc);.  }.}../*.
2a70: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
2a80: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
2a90: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
2aa0: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
2ab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2ac0: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
2ad0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
2ae0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
2af0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2b00: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2b10: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 7d 0a 7d 0a  (&p->wc);.  }.}.
2b20: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2b30: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
2b40: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
2b50: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2b60: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
2b70: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
2b80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2b90: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
2ba0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
2bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2bc0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2bd0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2be0: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
2bf0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73  hereTerm *a;.  s
2c00: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
2c10: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2c20: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
2c30: 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e  -1, a=pWC->a; i>
2c40: 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20  =0; i--, a++){. 
2c50: 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67     if( a->wtFlag
2c60: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
2c70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
2c90: 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  a->pExpr);.    }
2ca0: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
2cb0: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
2cc0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
2cd0: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  OrInfoDelete(db,
2ce0: 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a   a->u.pOrInfo);.
2cf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d      }else if( a-
2d00: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2d10: 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  ANDINFO ){.     
2d20: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2d30: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e  ete(db, a->u.pAn
2d40: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
2d50: 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d  }.  if( pWC->a!=
2d60: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
2d70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d80: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20  e(db, pWC->a);. 
2d90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2da0: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65  a single new Whe
2db0: 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20  reTerm entry to 
2dc0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2dd0: 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54  object pWC..** T
2de0: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
2df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74   object is const
2e00: 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72  ructed from Expr
2e10: 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c   p and with wtFl
2e20: 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ags..** The inde
2e30: 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66  x in pWC->a[] of
2e40: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
2e50: 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  rm is returned o
2e60: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20  n success..** 0 
2e70: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
2e80: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
2e90: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64   could not be ad
2ea0: 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d  ded due to a mem
2eb0: 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
2ec0: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65  n error.  The me
2ed0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2ee0: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20  failure will be 
2ef0: 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74  recorded in.** t
2f00: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
2f10: 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  led flag so that
2f20: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75   higher-level fu
2f30: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65  nctions can dete
2f40: 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ct it..**.** Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69  s routine will i
2f60: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2f70: 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d   of the pWC->a[]
2f80: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
2f90: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ary..**.** If th
2fa0: 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65  e wtFlags argume
2fb0: 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d  nt includes TERM
2fc0: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72  _DYNAMIC, then r
2fd0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
2fe0: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
2ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73   expression p is
3000: 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20   assumed by the 
3010: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
3020: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20  ct pWC..** This 
3030: 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20  is true even if 
3040: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
3050: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ls to allocate a
3060: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a   new WhereTerm..
3070: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20  **.** WARNING:  
3080: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
3090: 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68  ht reallocate th
30a0: 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  e space used to 
30b0: 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65  store.** WhereTe
30c0: 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65  rms.  All pointe
30d0: 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73  rs to WhereTerms
30e0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c   should be inval
30f0: 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20  idated after.** 
3100: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
3110: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
3120: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
3130: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
3140: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
3150: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
3160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
3170: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3180: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3190: 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74  , Expr *p, u8 wt
31a0: 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  Flags){.  WhereT
31b0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
31c0: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43  t idx;.  if( pWC
31d0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
31e0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
31f0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
3200: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
3210: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
3220: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d  se->db;.    pWC-
3230: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
3240: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
3250: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
3260: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
3270: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
3280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46  ){.      if( wtF
3290: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
32a0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MIC ){.        s
32b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
32c0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  (db, p);.      }
32d0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
32e0: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
32f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
3300: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
3310: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
3320: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
3330: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
3340: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
3360: 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b  bFree(db, pOld);
3370: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
3380: 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  nSlot = sqlite3D
3390: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
33a0: 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70  pWC->a)/sizeof(p
33b0: 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  WC->a[0]);.  }. 
33c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
33d0: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
33e0: 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  m++];.  pTerm->p
33f0: 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72  Expr = p;.  pTer
3400: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
3410: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
3420: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
3430: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
3440: 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d  .  return idx;.}
3450: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3460: 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20  tine identifies 
3470: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69  subexpressions i
3480: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3490: 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  se where.** each
34a0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
34b0: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  s separated by t
34c0: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
34d0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
34e0: 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66   operator specif
34f0: 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61  ied in the op pa
3500: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68  rameter.  The Wh
3510: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
3520: 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64  ure.** is filled
3530: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
3540: 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  o subexpressions
3550: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
3560: 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20  **.**    WHERE  
3570: 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63  a=='hello' AND c
3580: 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30  oalesce(b,11)<10
3590: 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52   AND (c+12!=d OR
35a0: 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20   c==22).**      
35b0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20       \________/ 
35c0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
35d0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
35e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
35f0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
3600: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  0]            sl
3610: 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20  ot[1]           
3620: 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a      slot[2].**.*
3630: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  * The original W
3640: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70  HERE clause in p
3650: 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65  Expr is unaltere
3660: 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  d.  All this rou
3670: 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20  tine.** does is 
3680: 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72  make slot[] entr
3690: 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62  ies point to sub
36a0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e  structure within
36b0: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pExpr..**.** In
36c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
36d0: 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68  ntence and in th
36e0: 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74  e diagram, "slot
36f0: 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a  []" refers to.**
3700: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
3710: 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  .a[] array.  The
3720: 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72   slot[] array gr
3730: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
3740: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
3750: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3760: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
3770: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
3780: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
3790: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
37a0: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  pr, int op){.  i
37b0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
37c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
37d0: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
37e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
37f0: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
3800: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3810: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
3820: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
3830: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
3840: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
3850: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
3860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
3870: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
3880: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
3890: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
38a0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
38b0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
38c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
38d0: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
38e0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
38f0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
3900: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
3910: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
3920: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
3930: 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61  k getMask(ExprMa
3940: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
3950: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
3960: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3970: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
3980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3990: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
39a0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
39b0: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
39c0: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
39d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
39e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
39f0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
3a00: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
3a10: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
3a20: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
3a30: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
3a40: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
3a50: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
3a60: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3a70: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
3a80: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
3a90: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
3aa0: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
3ab0: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
3ac0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
3ad0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
3ae0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
3af0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
3b00: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
3b10: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
3b20: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
3b30: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
3b40: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
3b50: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
3b60: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
3b70: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
3b80: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
3b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3ba0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
3bb0: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
3bc0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
3bd0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
3be0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
3bf0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
3c00: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
3c10: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
3c20: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
3c30: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
3c40: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
3c50: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
3c60: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
3c70: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
3c80: 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f  oked sqlite3Reso
3c90: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f  lveExprNames() o
3ca0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3cb0: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
3cc0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
3cd0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
3ce0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
3cf0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
3d00: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
3d10: 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  prNames() routin
3d20: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
3d30: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
3d40: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
3d50: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
3d60: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
3d70: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
3d80: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
3d90: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
3da0: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
3db0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
3dc0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
3dd0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
3de0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
3df0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
3e00: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
3e10: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
3e20: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3e30: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3e40: 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 45  (ExprMaskSet*, E
3e50: 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
3e60: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
3e70: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45  lectTableUsage(E
3e80: 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c  xprMaskSet*, Sel
3e90: 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ect*);.static Bi
3ea0: 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55  tmask exprTableU
3eb0: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
3ec0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
3ed0: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
3ee0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
3ef0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3f00: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
3f10: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
3f20: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
3f30: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
3f40: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
3f50: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
3f60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3f70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
3f80: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
3f90: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
3fa0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
3fb0: 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ft);.  mask |= e
3fc0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
3fd0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
3fe0: 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  List);.  mask |=
3ff0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4000: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4010: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
4020: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
4030: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
4040: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4050: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
4060: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
4070: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
4080: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
4090: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
40a0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
40b0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
40c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
40d0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
40e0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
40f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4100: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4110: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
4120: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
4130: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4140: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  e(ExprMaskSet *p
4150: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
4160: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
4170: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
4180: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73  e( pS ){.    mas
4190: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
41a0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
41b0: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
41c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
41d0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
41e0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
41f0: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
4200: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
4210: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4220: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
4230: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
4240: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4250: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
4260: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4270: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4280: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
4290: 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d  g);.    pS = pS-
42a0: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
42b0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
42d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
42e0: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
42f0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
4300: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
4310: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
4320: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
4330: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
4340: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
4350: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
4360: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61  ", "<=", ">=", a
4370: 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74  nd "IN"..*/.stat
4380: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
4390: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
43a0: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
43b0: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
43c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
43d0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
43e0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
43f0: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
4400: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
4410: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
4420: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
4430: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
4440: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
4450: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
4460: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
4480: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
4490: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
44a0: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
44b0: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
44c0: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
44d0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
44e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
44f0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
4500: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
4510: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
4520: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
4530: 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74  *.** If a collat
4540: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
4550: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4560: 65 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20  either the left 
4570: 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65  or right.** side
4580: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4590: 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61  on, it remains a
45a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
45b0: 68 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74  he same side aft
45c0: 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74  er.** the commut
45d0: 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c  ation. So "Y col
45e0: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
45f0: 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58  " becomes .** "X
4600: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
4610: 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62  op Y". This is b
4620: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
4630: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
4640: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
4650: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
4660: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
4670: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
4680: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
4690: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
46a0: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
46b0: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78  reason the EP_Ex
46c0: 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  pCollate flag.**
46d0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
46e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
46f0: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
4700: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
4710: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
4720: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
4730: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
4740: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
4750: 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74  );.  u16 expLeft
4760: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
4770: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
4780: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65  Collate);.  asse
4790: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45  rt( allowedOp(pE
47a0: 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70  xpr->op) && pExp
47b0: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op!=TK_IN );.
47c0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d    pExpr->pRight-
47d0: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
47e0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
47f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
4800: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  t);.  pExpr->pLe
4810: 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ft->pColl = sqli
4820: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
4830: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
4840: 65 66 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c  eft);.  SWAP(Col
4850: 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69  lSeq*,pExpr->pRi
4860: 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72  ght->pColl,pExpr
4870: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b  ->pLeft->pColl);
4880: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
4890: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
48a0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
48b0: 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  & ~EP_ExpCollate
48c0: 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70  ) | expLeft;.  p
48d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
48e0: 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  gs = (pExpr->pLe
48f0: 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f  ft->flags & ~EP_
4900: 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78  ExpCollate) | ex
4910: 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45  pRight;.  SWAP(E
4920: 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  xpr*,pExpr->pRig
4930: 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ht,pExpr->pLeft)
4940: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
4950: 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p>=TK_GT ){.    
4960: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
4970: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_GT+2 );.    as
4980: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
4990: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  LE+2 );.    asse
49a0: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
49b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
49c0: 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20  K_GT<TK_LE );.  
49d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
49e0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
49f0: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
4a00: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
4a10: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
4a20: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
4a30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
4a40: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
4a50: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
4a60: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
4a70: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
4a80: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
4a90: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
4aa0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
4ab0: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
4ac0: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
4ad0: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
4ae0: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
4af0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
4b00: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NULL;.  }else if
4b10: 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20  ( op==TK_OR ){. 
4b20: 20 20 20 63 20 3d 20 57 4f 5f 4f 52 3b 0a 20 20     c = WO_OR;.  
4b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4b40: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
4b50: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
4b60: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
4b70: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
4b80: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
4b90: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
4ba0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
4bb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4bc0: 21 3d 54 4b 5f 4f 52 20 7c 7c 20 63 3d 3d 57 4f  !=TK_OR || c==WO
4bd0: 5f 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OR );.  assert(
4be0: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
4bf0: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
4c00: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
4c10: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
4c20: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
4c30: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
4c40: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
4c50: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
4c60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4c70: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
4c80: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
4c90: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
4ca0: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
4cb0: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n c;.}../*.** Se
4cc0: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
4cd0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
4ce0: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
4cf0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4d00: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
4d10: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
4d20: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
4d30: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
4d40: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
4d50: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
4d60: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
4d70: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
4d80: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
4d90: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4da0: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
4db0: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
4dc0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
4dd0: 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54  WhereTerm *findT
4de0: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
4df0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
4e00: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
4e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
4e20: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
4e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4e40: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
4e50: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
4e60: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
4e70: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
4e80: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
4e90: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
4ea0: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
4eb0: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
4ec0: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
4ed0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4ee0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
4ef0: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
4f00: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
4f10: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
4f30: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
4f40: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
4f50: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
4f60: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
4f70: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a  pTerm;.  int k;.
4f80: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d    assert( iCur>=
4f90: 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  0 );.  op &= WO_
4fa0: 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  ALL;.  for(pTerm
4fb0: 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
4fc0: 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70  nTerm; k; k--, p
4fd0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
4fe0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
4ff0: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
5000: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
5010: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
5020: 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  y)==0.       && 
5030: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5040: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
5050: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
5060: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d  Operator & op)!=
5070: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
5080: 66 28 20 70 49 64 78 20 26 26 20 70 54 65 72 6d  f( pIdx && pTerm
5090: 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
50a0: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
50b0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
50c0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
50d0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
50e0: 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  l;.        char 
50f0: 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20  idxaff;.        
5100: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50  int j;.        P
5110: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
5120: 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20  WC->pParse;..   
5130: 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49       idxaff = pI
5140: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
5150: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
5160: 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ty;.        if( 
5170: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
5180: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61  inityOk(pX, idxa
5190: 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ff) ) continue;.
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75  .        /* Figu
51b0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
51c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
51d0: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
51e0: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
51f0: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65   ** it to be use
5200: 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69  ful for optimisi
5210: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  ng expression pX
5220: 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20  . Store this.   
5230: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e       ** value in
5240: 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e   variable pColl.
5250: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5260: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
5270: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
5280: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
5290: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
52a0: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
52b0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
52c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
52d0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
52e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
52f0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
5300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
5310: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49       for(j=0; pI
5320: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
5330: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
5340: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
5350: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
5360: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
5370: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5380: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
5390: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
53a0: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
53b0: 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  l[j]) ) continue
53c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
53d0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
53e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
53f0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
5400: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5410: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5420: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
5430: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
5440: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
5450: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
5460: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
5470: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
5480: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
5490: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
54a0: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
54b0: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
54c0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
54d0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
54e0: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
54f0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
5500: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
5510: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
5520: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5530: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
5540: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
5550: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
5560: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
5570: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5580: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
5590: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
55a0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
55b0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
55c0: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
55d0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
55e0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
55f0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
5600: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
5610: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
5620: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
5630: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
5640: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
5650: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
5660: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
5670: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
5680: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
5690: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
56a0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
56b0: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
56c0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
56d0: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
56e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
56f0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5700: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5710: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
5720: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
5730: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5740: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50  on */.  int *pnP
5750: 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d  attern,   /* Num
5760: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
5770: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
5780: 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  cters */.  int *
5790: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
57a0: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
57b0: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
57c0: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
57d0: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
57e0: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
57f0: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
5800: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
5810: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
5820: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5830: 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  z;.  Expr *pRigh
5840: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78 70  t, *pLeft;.  Exp
5850: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
5860: 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 63 68  int c, cnt;.  ch
5870: 61 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c  ar wc[3];.  Coll
5880: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71  Seq *pColl;.  sq
5890: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
58a0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 21  se->db;..  if( !
58b0: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
58c0: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
58d0: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
58e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
58f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
5900: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
5910: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
5920: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
5930: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
5940: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ;.  pRight = pLi
5950: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
5960: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
5970: 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 26  !=TK_STRING.   &
5980: 26 20 28 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  & (pRight->op!=T
5990: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 70 52  K_REGISTER || pR
59a0: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 54  ight->iColumn!=T
59b0: 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20  K_STRING) ){.   
59c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
59d0: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
59e0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
59f0: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
5a00: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
5a10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43  turn 0;.  }.  pC
5a20: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5a30: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5a40: 20 70 4c 65 66 74 29 3b 0a 20 20 61 73 73 65 72   pLeft);.  asser
5a50: 74 28 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70  t( pColl!=0 || p
5a60: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  Left->iColumn==-
5a70: 31 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  1 );.  if( pColl
5a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
5a90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65   collation is de
5aa0: 66 69 6e 65 64 20 66 6f 72 20 74 68 65 20 52 4f  fined for the RO
5ab0: 57 49 44 2e 20 20 55 73 65 20 74 68 65 20 64 65  WID.  Use the de
5ac0: 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43  fault. */.    pC
5ad0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
5ae0: 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  oll;.  }.  if( (
5af0: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
5b00: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20  ITE_COLL_BINARY 
5b10: 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a  || *pnoCase) &&.
5b20: 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79        (pColl->ty
5b30: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
5b40: 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43  NOCASE || !*pnoC
5b50: 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ase) ){.    retu
5b60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
5b70: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64  te3DequoteExpr(d
5b80: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7a 20  b, pRight);.  z 
5b90: 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67 68 74  = (char *)pRight
5ba0: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74  ->token.z;.  cnt
5bb0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b   = 0;.  if( z ){
5bc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
5bd0: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
5be0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
5bf0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
5c00: 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20   cnt++; }.  }.  
5c10: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
5c20: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b  5==(u8)z[cnt] ){
5c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5c40: 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74   }.  *pisComplet
5c50: 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30  e = z[cnt]==wc[0
5c60: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
5c70: 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d  ;.  *pnPattern =
5c80: 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31   cnt;.  return 1
5c90: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5ca0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5cb0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5cc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5cd0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5ce0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5cf0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5d00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5d10: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5d20: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5d30: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5d40: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5d50: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5d60: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5d70: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5d80: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5d90: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5da0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5db0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5dc0: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5dd0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5de0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5df0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5e00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5e10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
5e20: 35 20 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69  5 ||.       sqli
5e30: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e  te3StrNICmp((con
5e40: 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  st char*)pExpr->
5e50: 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c  token.z,"match",
5e60: 35 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  5)!=0 ){.    ret
5e70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
5e80: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
5e90: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
5ea0: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
5eb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5ec0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
5ed0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
5ee0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
5ef0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
5f00: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
5f10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5f20: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
5f30: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
5f40: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
5f50: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
5f60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
5f70: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
5f80: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
5f90: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
5fa0: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
5fb0: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
5fc0: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
5fd0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
5fe0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
5ff0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
6000: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
6010: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
6020: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
6030: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
6040: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
6050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6060: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
6070: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6080: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6090: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
60a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
60b0: 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  )./*.** Return T
60c0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
60d0: 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63   term of an OR c
60e0: 6c 61 75 73 65 20 63 61 6e 20 62 65 20 63 6f 6e  lause can be con
60f0: 76 65 72 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  verted.** into a
6100: 6e 20 49 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  n IN clause.  Th
6110: 65 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  e iCursor and iC
6120: 6f 6c 75 6d 6e 20 64 65 66 69 6e 65 20 74 68 65  olumn define the
6130: 20 6c 65 66 74 2d 68 61 6e 64 0a 2a 2a 20 73 69   left-hand.** si
6140: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 63 6c 61  de of the IN cla
6150: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  use..**.** The c
6160: 6f 6e 74 65 78 74 20 69 73 20 74 68 61 74 20 77  ontext is that w
6170: 65 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  e have multiple 
6180: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 65 71 75  OR-connected equ
6190: 61 6c 69 74 79 20 74 65 72 6d 73 0a 2a 2a 20 6c  ality terms.** l
61a0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
61b0: 20 20 20 20 20 20 20 20 20 20 61 3d 3c 65 78 70            a=<exp
61c0: 72 31 3e 20 4f 52 20 20 61 3d 3c 65 78 70 72 32  r1> OR  a=<expr2
61d0: 3e 20 4f 52 20 62 3d 3c 65 78 70 72 33 3e 20 20  > OR b=<expr3>  
61e0: 4f 52 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  OR ....**.** The
61f0: 20 70 4f 72 54 65 72 6d 20 69 6e 70 75 74 20 74   pOrTerm input t
6200: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
6210: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20  orresponds to a 
6220: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 0a 2a  single term of.*
6230: 2a 20 74 68 69 73 20 4f 52 20 63 6c 61 75 73 65  * this OR clause
6240: 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
6250: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
6260: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 0a 2a   candidate for.*
6270: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  * conversion to 
6280: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
6290: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75  the following mu
62a0: 73 74 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  st be true:.**.*
62b0: 2a 20 20 20 20 20 2a 20 20 54 68 65 20 6c 65 66  *     *  The lef
62c0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
62d0: 68 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  he term must be 
62e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 68 69 63 68  the column which
62f0: 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 69 64  .**        is id
6300: 65 6e 74 69 66 69 65 64 20 62 79 20 69 43 75 72  entified by iCur
6310: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
6320: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 49 66  .**.**     *  If
6330: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
6340: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
6350: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
6360: 61 66 66 69 6e 69 74 69 65 73 0a 2a 2a 20 20 20  affinities.**   
6370: 20 20 20 20 20 6f 66 20 62 6f 74 68 20 72 69 67       of both rig
6380: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
6390: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
63a0: 68 61 74 20 6e 6f 20 74 79 70 65 0a 2a 2a 20 20  hat no type.**  
63b0: 20 20 20 20 20 20 63 6f 6e 76 65 72 73 69 6f 6e        conversion
63c0: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  s are required o
63d0: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54  n the right.  (T
63e0: 69 63 6b 65 74 20 23 32 32 34 39 29 0a 2a 2a 0a  icket #2249).**.
63f0: 2a 2a 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68  ** If both of th
6400: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ese conditions a
6410: 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 72 65  re true, then re
6420: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
6430: 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
6440: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
6450: 20 69 6e 74 20 6f 72 54 65 72 6d 49 73 4f 70 74   int orTermIsOpt
6460: 43 61 6e 64 69 64 61 74 65 28 57 68 65 72 65 54  Candidate(WhereT
6470: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 2c 20 69 6e  erm *pOrTerm, in
6480: 74 20 69 43 75 72 73 6f 72 2c 20 69 6e 74 20 69  t iCursor, int i
6490: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 61  Column){.  int a
64a0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
64b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 54  ;.  assert( pOrT
64c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
64d0: 57 4f 5f 45 51 20 29 3b 0a 20 20 69 66 28 20 70  WO_EQ );.  if( p
64e0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
64f0: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
6500: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6510: 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  .  if( pOrTerm->
6520: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
6530: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 74  olumn ){.    ret
6540: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 66 66  urn 0;.  }.  aff
6550: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
6560: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
6570: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
6580: 68 74 29 3b 0a 20 20 69 66 28 20 61 66 66 52 69  ht);.  if( affRi
6590: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
65a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 66  turn 1;.  }.  af
65b0: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
65c0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
65d0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
65e0: 74 29 3b 0a 20 20 69 66 28 20 61 66 66 52 69 67  t);.  if( affRig
65f0: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
6600: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6610: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
6620: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
6630: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 74  e if the given t
6640: 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63 6c 61  erm of an OR cla
6650: 75 73 65 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  use can be ignor
6660: 65 64 20 64 75 72 69 6e 67 0a 2a 2a 20 61 20 63  ed during.** a c
6670: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
6680: 65 20 61 6c 6c 20 4f 52 20 74 65 72 6d 73 20 61  e all OR terms a
6690: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
66a0: 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  r optimization..
66b0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
66c0: 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  s, return true i
66d0: 66 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  f a call to the 
66e0: 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e 64 69  orTermIsOptCandi
66f0: 64 61 74 65 28 29 0a 2a 2a 20 61 62 6f 76 65 20  date().** above 
6700: 72 65 74 75 72 6e 65 64 20 66 61 6c 73 65 20 62  returned false b
6710: 75 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ut it is not nec
6720: 65 73 73 61 72 79 20 74 6f 20 64 69 73 71 75 61  essary to disqua
6730: 6c 69 66 79 20 74 68 65 0a 2a 2a 20 6f 70 74 69  lify the.** opti
6740: 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
6750: 53 75 70 70 6f 73 65 20 74 68 65 20 6f 72 69 67  Suppose the orig
6760: 69 6e 61 6c 20 4f 52 20 70 68 72 61 73 65 20 77  inal OR phrase w
6770: 61 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  as this:.**.**  
6780: 20 20 20 20 20 20 20 20 20 61 3d 34 20 20 4f 52           a=4  OR
6790: 20 20 61 3d 31 31 20 20 4f 52 20 20 61 3d 62 0a    a=11  OR  a=b.
67a0: 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 6e 61  **.** During ana
67b0: 6c 79 73 69 73 2c 20 74 68 65 20 74 68 69 72 64  lysis, the third
67c0: 20 74 65 72 6d 20 67 65 74 73 20 66 6c 69 70 70   term gets flipp
67d0: 65 64 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 75  ed around and du
67e0: 70 6c 69 63 61 74 65 0a 2a 2a 20 73 6f 20 74 68  plicate.** so th
67f0: 61 74 20 77 65 20 61 72 65 20 6c 65 66 74 20 77  at we are left w
6800: 69 74 68 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ith this:.**.** 
6810: 20 20 20 20 20 20 20 20 20 20 61 3d 34 20 20 4f            a=4  O
6820: 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61 3d 62  R  a=11  OR  a=b
6830: 20 20 4f 52 20 20 62 3d 61 0a 2a 2a 0a 2a 2a 20    OR  b=a.**.** 
6840: 53 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74  Since the last t
6850: 77 6f 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  wo terms are dup
6860: 6c 69 63 61 74 65 73 2c 20 6f 6e 6c 79 20 6f 6e  licates, only on
6870: 65 20 6f 66 20 74 68 65 6d 0a 2a 2a 20 68 61 73  e of them.** has
6880: 20 74 6f 20 71 75 61 6c 69 66 79 20 69 6e 20 6f   to qualify in o
6890: 72 64 65 72 20 66 6f 72 20 74 68 65 20 77 68 6f  rder for the who
68a0: 6c 65 20 70 68 72 61 73 65 20 74 6f 20 71 75 61  le phrase to qua
68b0: 6c 69 66 79 2e 20 20 57 68 65 6e 0a 2a 2a 20 74  lify.  When.** t
68c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
68d0: 61 6c 6c 65 64 2c 20 77 65 20 6b 6e 6f 77 20 74  alled, we know t
68e0: 68 61 74 20 70 4f 72 54 65 72 6d 20 64 69 64 20  hat pOrTerm did 
68f0: 6e 6f 74 20 71 75 61 6c 69 66 79 2e 0a 2a 2a 20  not qualify..** 
6900: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
6910: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
6920: 65 20 69 66 20 70 4f 72 54 65 72 6d 20 68 61 73  e if pOrTerm has
6930: 20 61 20 64 75 70 6c 69 63 61 74 65 20 74 68 61   a duplicate tha
6940: 74 0a 2a 2a 20 6d 69 67 68 74 20 71 75 61 6c 69  t.** might quali
6950: 66 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  fy.  If there is
6960: 20 61 20 64 75 70 6c 69 63 61 74 65 20 74 68 61   a duplicate tha
6970: 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
6980: 65 6e 0a 2a 2a 20 64 69 73 71 75 61 6c 69 66 69  en.** disqualifi
6990: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ed, then return 
69a0: 74 72 75 65 2e 20 20 49 66 20 74 68 65 72 65 20  true.  If there 
69b0: 61 72 65 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  are no duplicate
69c0: 73 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 64 75 70  s, or.** the dup
69d0: 6c 69 63 61 74 65 20 68 61 73 20 61 6c 73 6f 20  licate has also 
69e0: 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65  been disqualifie
69f0: 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  d, return false.
6a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
6a10: 72 54 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69 63  rTermHasOkDuplic
6a20: 61 74 65 28 57 68 65 72 65 43 6c 61 75 73 65 20  ate(WhereClause 
6a30: 2a 70 4f 72 2c 20 57 68 65 72 65 54 65 72 6d 20  *pOr, WhereTerm 
6a40: 2a 70 4f 72 54 65 72 6d 29 7b 0a 20 20 69 66 28  *pOrTerm){.  if(
6a50: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
6a60: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
6a70: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
6a80: 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  s the original t
6a90: 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c 69 63  erm.  The duplic
6aa0: 61 74 65 20 69 73 20 74 6f 20 74 68 65 20 6c 65  ate is to the le
6ab0: 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20 68 61  ft had.    ** ha
6ac0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61  s not yet been a
6ad0: 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68 75 73  nalyzed and thus
6ae0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
6af0: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64 2e 20  n disqualified. 
6b00: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
6b10: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f 72 54  .  }.  if( (pOrT
6b20: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
6b30: 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a  ERM_VIRTUAL)!=0.
6b40: 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b       && (pOr->a[
6b50: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
6b60: 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ].wtFlags & TERM
6b70: 5f 4f 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20  _OR_OK)!=0 ){.  
6b80: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64    /* This is a d
6b90: 75 70 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20  uplicate term.  
6ba0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61  The original qua
6bb0: 6c 69 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f  lified so this o
6bc0: 6e 65 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  ne.    ** does n
6bd0: 6f 74 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20  ot have to. */. 
6be0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6bf0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69  .  /* This is ei
6c00: 74 68 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e  ther a singleton
6c10: 20 74 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74   term or else it
6c20: 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
6c30: 66 6f 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74  for.  ** which t
6c40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20  he original did 
6c50: 6e 6f 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69  not qualify.  Ei
6c60: 74 68 65 72 20 77 61 79 20 77 65 20 61 72 65 20  ther way we are 
6c70: 64 6f 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72  done for. */.  r
6c80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
6c90: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
6ca0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
6cb0: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
6cc0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
6cd0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
6ce0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
6cf0: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
6d00: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
6d10: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
6d20: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
6d30: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
6d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
6d50: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
6d60: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
6d70: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
6d80: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
6d90: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
6da0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
6db0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
6dc0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
6dd0: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
6de0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
6df0: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
6e00: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
6e10: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
6e20: 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  >".  If the expr
6e30: 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20  ession is of.** 
6e40: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
6e50: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
6e60: 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d   and Y are colum
6e70: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
6e80: 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73  ginal.** express
6e90: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
6ea0: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
6eb0: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  al expression of
6ec0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
6ed0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
6ee0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
6ef0: 61 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65  ause and analyze
6f00: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  d separately..*/
6f10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6f20: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
6f30: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
6f40: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
6f50: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
6f60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
6f70: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
6f80: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
6f90: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
6fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6fb0: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
6fc0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
6fd0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
6fe0: 20 2a 70 54 65 72 6d 3b 0a 20 20 45 78 70 72 4d   *pTerm;.  ExprM
6ff0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
7000: 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
7010: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
7020: 71 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b  qLeft;.  Bitmask
7030: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 42 69   prereqAll;.  Bi
7040: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
7050: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74   = 0;.  int nPat
7060: 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f  tern;.  int isCo
7070: 6d 70 6c 65 74 65 3b 0a 20 20 69 6e 74 20 6e 6f  mplete;.  int no
7080: 43 61 73 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a  Case;.  int op;.
7090: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
70a0: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pWC->pParse;. 
70b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
70c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
70d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
70e0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
70f0: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
7100: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7110: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70  ;.  pMaskSet = p
7120: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
7130: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
7140: 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65  Expr;.  prereqLe
7150: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
7160: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
7170: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
7180: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
7190: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
71a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
71b0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
71c0: 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  ;.    pTerm->pre
71d0: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
71e0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
71f0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
7200: 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20 20  List).          
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  | exprSelectTabl
7230: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7240: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29   pExpr->pSelect)
7250: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
7260: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
7270: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
7280: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
7290: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
72a0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
72b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
72c0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
72d0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
72e0: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
72f0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7300: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
7310: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7320: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
7330: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
7340: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
7350: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
7360: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
7370: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
7380: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
7390: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
73a0: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
73b0: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
73c0: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
73f0: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
7400: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
7410: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
7420: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
7430: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
7440: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
7450: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
7460: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
7470: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7480: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
7490: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
74a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
74b0: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
74c0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
74d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
74e0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
74f0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
7500: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
7510: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
7520: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
7530: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
7540: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
7550: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
7560: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
7570: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
7580: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7590: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
75a0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
75b0: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
75c0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
75d0: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
75e0: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
75f0: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
7600: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
7610: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
7620: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
7630: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
7640: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7650: 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  p(db, pExpr);.  
7660: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
7670: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7690: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
76a0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
76b0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
76c0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
76d0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
76e0: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
76f0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
7700: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
7710: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
7720: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
7730: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
7740: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
7750: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
7760: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
7770: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
7780: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
7790: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
77a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
77b0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
77c0: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
77d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
77e0: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
77f0: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
7800: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
7810: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
7820: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
7830: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
7840: 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  pDup->pLeft;.   
7850: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
7860: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
7870: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
7880: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
7890: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
78a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
78b0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
78c0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
78d0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
78e0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
78f0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
7900: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
7910: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
7920: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7930: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
7940: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
7950: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
7960: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
7970: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
7980: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
7990: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
79a0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
79b0: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
79c0: 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  plements..  */. 
79d0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
79e0: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
79f0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
7a00: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
7a10: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
7a20: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
7a30: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
7a40: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
7a50: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
7a60: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
7a70: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
7a80: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
7a90: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
7aa0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
7ab0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
7ac0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
7ad0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7ae0: 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c 20 73 71  r(db, ops[i], sq
7af0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7b00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a   pExpr->pLeft),.
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7b30: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7b40: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
7b50: 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  r), 0);.      id
7b60: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
7b70: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
7b80: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
7b90: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
7ba0: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
7bb0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
7bc0: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
7bd0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
7be0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
7bf0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7c00: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
7c10: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
7c20: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
7c30: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
7c40: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
7c50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7c60: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
7c70: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
7c80: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7c90: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
7ca0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
7cb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7cc0: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
7cd0: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65  Attempt to conve
7ce0: 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  rt OR-connected 
7cf0: 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e  terms into an IN
7d00: 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61   operator so tha
7d10: 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20  t.  ** they can 
7d20: 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69  make use of indi
7d30: 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20  ces.  Example:. 
7d40: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
7d50: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
7d60: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
7d70: 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  expr3.  **.  ** 
7d80: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
7d90: 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  o.  **.  **     
7da0: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
7db0: 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20  r2,expr3).  **. 
7dc0: 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
7dd0: 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d  ation must be om
7de0: 69 74 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55  itted if OMIT_SU
7df0: 42 51 55 45 52 59 20 69 73 20 64 65 66 69 6e 65  BQUERY is define
7e00: 64 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74  d because.  ** t
7e10: 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
7e20: 74 68 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61  the the IN opera
7e30: 74 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 73  tor is part of s
7e40: 75 62 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ub-queries..  */
7e50: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
7e60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
7e70: 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20      int ok;.    
7e80: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e  int i, j;.    in
7e90: 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73  t iColumn, iCurs
7ea0: 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61  or;.    WhereCla
7eb0: 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65  use sOr;.    Whe
7ec0: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7ed0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
7ee0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7ef0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30  TERM_DYNAMIC)==0
7f00: 20 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   );.    whereCla
7f10: 75 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57  useInit(&sOr, pW
7f20: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
7f30: 53 65 74 29 3b 0a 20 20 20 20 77 68 65 72 65 53  Set);.    whereS
7f40: 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72  plit(&sOr, pExpr
7f50: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78  , TK_OR);.    ex
7f60: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
7f70: 63 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73  c, &sOr);.    as
7f80: 73 65 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e  sert( sOr.nTerm>
7f90: 3d 32 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  =2 );.    j = 0;
7fa0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7fb0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
7fc0: 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65   or_not_possible
7fd0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
7fe0: 61 73 73 65 72 74 28 20 6a 3c 73 4f 72 2e 6e 54  assert( j<sOr.nT
7ff0: 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 43 6f  erm );.      iCo
8000: 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  lumn = sOr.a[j].
8010: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8020: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 73 4f      iCursor = sO
8030: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f  r.a[j].leftCurso
8040: 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69 43  r;.      ok = iC
8050: 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20  ursor>=0;.      
8060: 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d  for(i=sOr.nTerm-
8070: 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61  1, pOrTerm=sOr.a
8080: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d  ; i>=0 && ok; i-
8090: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
80a0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
80b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
80c0: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
80d0: 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f    goto or_not_po
80e0: 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ssible;.        
80f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 72  }.        if( or
8100: 54 65 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61  TermIsOptCandida
8110: 74 65 28 70 4f 72 54 65 72 6d 2c 20 69 43 75 72  te(pOrTerm, iCur
8120: 73 6f 72 2c 20 69 43 6f 6c 75 6d 6e 29 20 29 7b  sor, iColumn) ){
8130: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
8140: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
8150: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
8160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 72 54     }else if( orT
8170: 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69 63 61 74  ermHasOkDuplicat
8180: 65 28 26 73 4f 72 2c 20 70 4f 72 54 65 72 6d 29  e(&sOr, pOrTerm)
8190: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
81a0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
81b0: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
81c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
81d0: 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a          ok = 0;.
81e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
81f0: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f  }.    }while( !o
8200: 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d  k && (sOr.a[j++]
8210: 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
8220: 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c  COPIED)!=0 && j<
8230: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20  2 );.    if( ok 
8240: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  ){.      ExprLis
8250: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  t *pList = 0;.  
8260: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20      Expr *pNew, 
8270: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78 70  *pDup;.      Exp
8280: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r *pLeft = 0;.  
8290: 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54      for(i=sOr.nT
82a0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73  erm-1, pOrTerm=s
82b0: 4f 72 2e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Or.a; i>=0; i--,
82c0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
82d0: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
82e0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
82f0: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8300: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8310: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8320: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
8330: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8340: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
8350: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8360: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
8370: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
8380: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  p, 0);.        p
8390: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
83a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
83b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
83c0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
83d0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
83e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
83f0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
8400: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
8410: 28 64 62 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70  (db, TK_IN, pDup
8420: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
8430: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
8440: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
8450: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
8460: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
8470: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
8480: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
8490: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
84a0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
84b0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
84c0: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
84d0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
84e0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
84f0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
8500: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
8510: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
8520: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
8530: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
8540: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
8550: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
8560: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
8570: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
8580: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
8590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
85a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
85b0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
85c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
85d0: 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69    }.or_not_possi
85e0: 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65 43 6c  ble:.    whereCl
85f0: 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72 29 3b  auseClear(&sOr);
8600: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
8610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
8620: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
8630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8640: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
8650: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
8660: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
8670: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
8680: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
8690: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
86a0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
86b0: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
86c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
86d0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
86e0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
86f0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
8700: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
8710: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
8720: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
8730: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
8740: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
8750: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
8760: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
8770: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
8780: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
8790: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
87a0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65   */.  if( isLike
87b0: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
87c0: 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c  Expr, &nPattern,
87d0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
87e0: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78  oCase) ){.    Ex
87f0: 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  pr *pLeft, *pRig
8800: 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  ht;.    Expr *pS
8810: 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20  tr1, *pStr2;.   
8820: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
8830: 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  , *pNewExpr2;.  
8840: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69    int idxNew1, i
8850: 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65  dxNew2;..    pLe
8860: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
8870: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
8880: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
8890: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
88a0: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20  Expr;.    pStr1 
88b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
88c0: 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47  Parse, TK_STRING
88d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
88e0: 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20  if( pStr1 ){.   
88f0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
8900: 6f 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e  opy(db, &pStr1->
8910: 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e  token, &pRight->
8920: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53  token);.      pS
8930: 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e  tr1->token.n = n
8940: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70  Pattern;.      p
8950: 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50  Str1->flags = EP
8960: 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d  _Dequoted;.    }
8970: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
8980: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8990: 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20  pStr1);.    if( 
89a0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
89b0: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
89c0: 20 2a 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65   *pC;.      asse
89d0: 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e  rt( pStr2->token
89e0: 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43  .dyn );.      pC
89f0: 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e   = (u8*)&pStr2->
8a00: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
8a10: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
8a20: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
8a30: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
8a40: 69 66 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43  if( c=='@' ) isC
8a50: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
8a60: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
8a70: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
8a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
8a90: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
8aa0: 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  }.    pNewExpr1 
8ab0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
8ac0: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71  Parse, TK_GE, sq
8ad0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8ae0: 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30  pLeft), pStr1, 0
8af0: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
8b00: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
8b10: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
8b20: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
8b30: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
8b40: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
8b50: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
8b60: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
8b70: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
8b80: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
8b90: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
8ba0: 72 73 65 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69  rse, TK_LT, sqli
8bb0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
8bc0: 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b  eft), pStr2, 0);
8bd0: 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
8be0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
8bf0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
8c00: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
8c10: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
8c20: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
8c30: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
8c40: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
8c50: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
8c60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
8c70: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
8c80: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
8c90: 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
8ca0: 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
8cb0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
8cc0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
8cd0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
8ce0: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
8cf0: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
8d00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
8d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
8d20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
8d30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8d40: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8d50: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
8d60: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
8d70: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
8d80: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
8d90: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
8da0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
8db0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
8dc0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
8dd0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
8de0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
8df0: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
8e00: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
8e10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
8e20: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
8e30: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
8e40: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
8e50: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
8e60: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
8e70: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
8e80: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
8e90: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
8ea0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
8eb0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
8ec0: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
8ed0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
8ee0: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
8ef0: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
8f00: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
8f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
8f20: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
8f30: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
8f40: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
8f50: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
8f60: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
8f70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
8f80: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
8f90: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
8fa0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
8fb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
8fc0: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
8fd0: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
8fe0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
8ff0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
9000: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
9010: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41  e3Expr(db, TK_MA
9020: 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  TCH, 0, sqlite3E
9030: 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
9040: 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  t), 0);.      id
9050: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9060: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9070: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
9080: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
9090: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
90a0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
90b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
90c0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
90d0: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
90e0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
90f0: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
9100: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
9110: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
9120: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
9130: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
9140: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
9150: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
9160: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
9170: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
9180: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
9190: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
91a0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
91b0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
91c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
91d0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
91e0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
91f0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
9200: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
9210: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
9220: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
9230: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
9240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9250: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
9260: 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
9270: 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
9280: 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
9290: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
92a0: 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
92b0: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
92c0: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
92d0: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
92e0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
92f0: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
9300: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
9310: 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  UE if any of the
9320: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
9330: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e  pList->a[iFirst.
9340: 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  ..] contain.** a
9350: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
9360: 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  y table other th
9370: 61 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62  an the iBase tab
9380: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
9390: 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65  t referencesOthe
93a0: 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c  rTables(.  ExprL
93b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
93c0: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65       /* Search e
93d0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
93e0: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72  s list */.  Expr
93f0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
9400: 74 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67  t,    /* Mapping
9410: 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20   from tables to 
9420: 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74  bitmaps */.  int
9430: 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
9440: 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61         /* Be sea
9450: 72 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20  rching with the 
9460: 69 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73  iFirst-th expres
9470: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42  sion */.  int iB
9480: 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ase             
9490: 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65      /* Ignore re
94a0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
94b0: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42   table */.){.  B
94c0: 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d  itmask allowed =
94d0: 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
94e0: 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68  et, iBase);.  wh
94f0: 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73  ile( iFirst<pLis
9500: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
9510: 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73  if( (exprTableUs
9520: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
9530: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d  ist->a[iFirst++]
9540: 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29  .pExpr)&allowed)
9550: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
9560: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
9570: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9580: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9590: 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70  ine decides if p
95a0: 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  Idx can be used 
95b0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  to satisfy the O
95c0: 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73  RDER BY.** claus
95d0: 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69  e.  If it can, i
95e0: 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66  t returns 1.  If
95f0: 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74   pIdx cannot sat
9600: 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45  isfy the.** ORDE
9610: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69  R BY clause, thi
9620: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
9630: 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  s 0..**.** pOrde
9640: 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20  rBy is an ORDER 
9650: 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61  BY clause from a
9660: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9670: 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a  t.  pTab is the.
9680: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
9690: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
96a0: 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61  lause of that sa
96b0: 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  me SELECT statem
96c0: 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74  ent and.** the t
96d0: 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f  able has a curso
96e0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73  r number of "bas
96f0: 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20  e".  pIdx is an 
9700: 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a  index on pTab..*
9710: 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74  *.** nEqCol is t
9720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9730: 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61  umns of pIdx tha
9740: 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71  t are used as eq
9750: 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72  uality.** constr
9760: 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74  aints.  Any of t
9770: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  hese columns may
9780: 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d   be missing from
9790: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
97a0: 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
97b0: 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20  match can still 
97c0: 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a  be a success..**
97d0: 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66  .** All terms of
97e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68   the ORDER BY th
97f0: 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  at match against
9800: 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
9810: 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43  be either.** ASC
9820: 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d   or DESC.  (Term
9830: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
9840: 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68  Y clause past th
9850: 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55  e end of a UNIQU
9860: 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f  E.** index do no
9870: 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66  t need to satisf
9880: 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  y this constrain
9890: 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20  t.)  The *pbRev 
98a0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
98b0: 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45  to 1 if the ORDE
98c0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
98d0: 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69  ll DESC and it i
98e0: 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a  s set to 0 if.**
98f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9900: 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e  ause is all ASC.
9910: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
9920: 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20  sSortingIndex(. 
9930: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9940: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9950: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9960: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
9970: 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70  askSet,  /* Mapp
9980: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69  ing from table i
9990: 6e 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70  ndices to bitmap
99a0: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
99b0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx,            /
99c0: 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61  * The index we a
99d0: 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20  re testing */.  
99e0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
99f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9a00: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
9a10: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
9a20: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
9a30: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
9a40: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
9a50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
9a60: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
9a70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9a80: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
9a90: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
9aa0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
9ab0: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
9ac0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
9ad0: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
9ae0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
9af0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
9b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9b10: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
9b20: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
9b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9b40: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
9b50: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
9b60: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
9b70: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
9ba0: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
9bb0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9bc0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
9bd0: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
9be0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9bf0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
9c00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9c10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
9c20: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
9c30: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
9c40: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
9c50: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
9c60: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
9c70: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9c80: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
9c90: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
9ca0: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
9cb0: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
9cc0: 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
9cd0: 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
9ce0: 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
9cf0: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
9d00: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
9d10: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
9d20: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
9d30: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
9d40: 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
9d50: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
9d60: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
9d70: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
9d80: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
9d90: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
9da0: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49  j<nTerm && i<=pI
9db0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
9dc0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
9dd0: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
9de0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
9df0: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
9e00: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
9e10: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
9e20: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9e30: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
9e40: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
9e50: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
9e60: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
9e70: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
9e80: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f  iColumn;       /
9e90: 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
9ea0: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
9eb0: 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
9ec0: 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
9ed0: 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72  der;    /* 1 for
9ee0: 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
9ef0: 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
9f00: 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
9f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
9f20: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ; /* Name of the
9f30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9f40: 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
9f50: 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  ex term */..    
9f60: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
9f70: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
9f80: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
9f90: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
9fa0: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
9fb0: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
9fc0: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
9fd0: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
9fe0: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
9ff0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
a000: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
a010: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
a020: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  use */.      bre
a030: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
a040: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
a050: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
a060: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
a070: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
a080: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
a090: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
a0a0: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43    if( i<pIdx->nC
a0b0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
a0c0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
a0d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
a0e0: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
a0f0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
a100: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
a110: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
a120: 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
a130: 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
a140: 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
a150: 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
a160: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d  azColl[i];.    }
a170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c  else{.      iCol
a180: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
a190: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  iSortOrder = 0;.
a1a0: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43        zColl = pC
a1b0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
a1c0: 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  }.    if( pExpr-
a1d0: 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
a1e0: 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  n || sqlite3StrI
a1f0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
a200: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
a210: 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74    /* Term j of t
a220: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
a230: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
a240: 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68  h column i of th
a250: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
a260: 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b   if( i<nEqCol ){
a270: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
a280: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  n index column t
a290: 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
a2a0: 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74  ed by == fails t
a2b0: 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20  o match an.     
a2c0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74     ** ORDER BY t
a2d0: 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e  erm, that is OK.
a2e0: 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68    Just ignore th
a2f0: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  at column of the
a300: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a   index.        *
a310: 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
a320: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
a330: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
a340: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
a350: 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  /* Index column 
a360: 69 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20  i is the rowid. 
a370: 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73   All other terms
a380: 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20   match. */.     
a390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
a3b0: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
a3c0: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
a3d0: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
a3e0: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
a3f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
a400: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
a410: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
a420: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
a430: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
a440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
a450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a460: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
a470: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
a480: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
a490: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
a4a0: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
a4b0: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
a4c0: 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65  ssert( iSortOrde
a4d0: 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64  r==0 || iSortOrd
a4e0: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  er==1 );.    ter
a4f0: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f  mSortOrder = iSo
a500: 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d  rtOrder ^ pTerm-
a510: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
a520: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
a530: 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f        if( termSo
a540: 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64  rtOrder!=sortOrd
a550: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
a560: 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c   Indices can onl
a570: 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  y be used if all
a580: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
a590: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20  past the.       
a5a0: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   ** equality con
a5b0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
a5c0: 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20   either DESC or 
a5d0: 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ASC. */.        
a5e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
a5f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a600: 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74     sortOrder = t
a610: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ermSortOrder;.  
a620: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
a630: 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66   pTerm++;.    if
a640: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ( iColumn<0 && !
a650: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
a660: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
a670: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
a680: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
a690: 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
a6a0: 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d  lumn is the prim
a6b0: 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72  ary key and ever
a6c0: 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20  ything matches. 
a6d0: 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61       ** so far a
a6e0: 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f  nd none of the O
a6f0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
a700: 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72   the right refer
a710: 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20  ence other.     
a720: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
a730: 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20  e join, then we 
a740: 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74  are assured that
a750: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62   the index can b
a760: 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a  e used .      **
a770: 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65   to sort because
a780: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a790: 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73   is unique and s
a7a0: 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  o none of the ot
a7b0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  her.      ** col
a7c0: 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61  umns will make a
a7d0: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20  ny difference.  
a7e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d      */.      j =
a7f0: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   nTerm;.    }.  
a800: 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  }..  *pbRev = so
a810: 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66  rtOrder!=0;.  if
a820: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
a830: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
a840: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
a850: 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65  lause are covere
a860: 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20  d by this index 
a870: 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  so.    ** this i
a880: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
a890: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f   for sorting. */
a8a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a8b0: 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
a8c0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
a8d0: 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i==pIdx->nCol
a8e0: 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65  umn.      && !re
a8f0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
a900: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
a910: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
a920: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
a930: 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64  erms of this ind
a940: 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72  ex match some pr
a950: 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45  efix of the ORDE
a960: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
a970: 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
a980: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e   is UNIQUE and n
a990: 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74  o terms on the t
a9a0: 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ail of the ORDER
a9b0: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
a9c0: 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  e reference othe
a9d0: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
a9e0: 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  in.  If this is 
a9f0: 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20  all true then.  
aa00: 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62    ** the order b
aa10: 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65  y clause is supe
aa20: 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20  rfluous. */.    
aa30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
aa40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
aa50: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
aa60: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
aa70: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
aa80: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
aa90: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
aaa0: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
aab0: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
aac0: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
aad0: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
aae0: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
aaf0: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
ab00: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
ab10: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
ab20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
ab30: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
ab40: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
ab50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
ab60: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
ab70: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
ab80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
ab90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
aba0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
abb0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
abc0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
abd0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
abe0: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
abf0: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  aps */.  int *pb
ac00: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
ac10: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
ac20: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
ac30: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
ac40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ;..  assert( pOr
ac50: 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
ac60: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
ac70: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d  nExpr>0 );.  p =
ac80: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
ac90: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e  pExpr;.  if( p->
aca0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
acb0: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65   p->iTable==base
acc0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
acd0: 2d 31 0a 20 20 20 20 26 26 20 21 72 65 66 65 72  -1.    && !refer
ace0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
acf0: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
ad00: 53 65 74 2c 20 31 2c 20 62 61 73 65 29 20 29 7b  Set, 1, base) ){
ad10: 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f  .    *pbRev = pO
ad20: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
ad30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75  tOrder;.    retu
ad40: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
ad50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
ad60: 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65  repare a crude e
ad70: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c  stimate of the l
ad80: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
ad90: 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  input value..** 
ada0: 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64  The results need
adb0: 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20   not be exact.  
adc0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  This is only use
add0: 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  d for estimating
ade0: 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  .** the total co
adf0: 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67  st of performing
ae00: 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68   operations with
ae10: 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c   O(logN) or O(Nl
ae20: 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69  ogN).** complexi
ae30: 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69  ty.  Because N i
ae40: 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20  s just a guess, 
ae50: 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74  it is no great t
ae60: 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67  ragedy if.** log
ae70: 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66  N is a little of
ae80: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  f..*/.static dou
ae90: 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c  ble estLog(doubl
aea0: 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c  e N){.  double l
aeb0: 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c  ogN = 1;.  doubl
aec0: 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c  e x = 10;.  whil
aed0: 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f  e( N>x ){.    lo
aee0: 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a  gN += 1;.    x *
aef0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = 10;.  }.  retu
af00: 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn logN;.}../*.*
af10: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
af20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
af30: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
af40: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
af50: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
af60: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
af70: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
af80: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
af90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
afa0: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
afb0: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
afc0: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
afd0: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
afe0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
aff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b000: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
b010: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
b020: 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  G).static void T
b030: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
b040: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
b050: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
b060: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
b070: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
b080: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
b090: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
b0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
b0b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
b0c0: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
b0d0: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
b0e0: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
b0f0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
b100: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
b110: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
b120: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
b130: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
b140: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
b150: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
b160: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
b170: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
b180: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
b190: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
b1a0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
b1b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
b1c0: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
b1d0: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
b1e0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
b1f0: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
b200: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
b210: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
b220: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
b230: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
b240: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
b250: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
b260: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
b270: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
b280: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
b290: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
b2a0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
b2b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
b2c0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
b2d0: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
b2e0: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
b2f0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
b300: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
b310: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
b320: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
b330: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
b340: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
b350: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
b360: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
b370: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
b380: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
b390: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
b3a0: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
b3b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
b3c0: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
b3d0: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
b3e0: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
b3f0: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
b400: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
b410: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
b420: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
b430: 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cost);.}.#else.#
b440: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
b450: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
b460: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
b470: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
b480: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b490: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b4a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
b4b0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
b4c0: 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
b4d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
b4e0: 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
b4f0: 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
b500: 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
b510: 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
b520: 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
b530: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
b540: 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
b550: 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
b560: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
b570: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
b580: 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
b590: 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
b5a0: 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
b5b0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
b5c0: 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
b5d0: 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
b5e0: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
b5f0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
b600: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
b610: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
b620: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
b630: 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
b640: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
b650: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
b660: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
b670: 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
b680: 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
b690: 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
b6a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
b6b0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
b6c0: 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
b6d0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
b6e0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
b6f0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
b700: 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
b710: 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
b720: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
b730: 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
b740: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
b750: 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
b760: 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
b770: 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
b780: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
b790: 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
b7a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b7b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
b7c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b7d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
b7e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b800: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
b810: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
b820: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
b830: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  ,     /* The FRO
b840: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
b850: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
b860: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
b870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
b880: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
b890: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
b8a0: 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
b8b0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
b8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b8d0: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
b8e0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42   */.  int orderB
b8f0: 79 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  yUsable,        
b900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
b910: 77 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c  we can potential
b920: 20 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74   sort */.  sqlit
b930: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
b940: 70 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64  ppIdxInfo /* Ind
b950: 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ex information p
b960: 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e  assed to xBestIn
b970: 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  dex */.){.  Tabl
b980: 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  e *pTab = pSrc->
b990: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pTab;.  sqlite3_
b9a0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 54  vtab *pVtab = pT
b9b0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab->pVtab;.  sql
b9c0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
b9d0: 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
b9e0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b9f0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
ba00: 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
ba10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
ba20: 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
ba30: 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
ba40: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
ba50: 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
ba60: 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
ba70: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
ba80: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  i, j;.  int nOrd
ba90: 65 72 42 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  erBy;.  int rc;.
baa0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
bab0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
bac0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
bad0: 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
bae0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
baf0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
bb00: 20 66 6f 72 20 74 68 69 73 20 76 69 72 74 75 61   for this virtua
bb10: 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c  l table, then al
bb20: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20  locate.  ** and 
bb30: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
bb40: 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  w.  */.  pIdxInf
bb50: 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a  o = *ppIdxInfo;.
bb60: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
bb70: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65  0 ){.    int nTe
bb80: 72 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  rm;.    WHERETRA
bb90: 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
bba0: 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
bbb0: 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e  %s...\n", pTab->
bbc0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
bbd0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
bbe0: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
bbf0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
bc00: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
bc10: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
bc20: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
bc30: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  .    for(i=nTerm
bc40: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
bc50: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
bc60: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
bc70: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
bc80: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
bc90: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
bca0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
bcb0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f  sert( (pTerm->eO
bcc0: 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e  perator&(pTerm->
bcd0: 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30  eOperator-1))==0
bce0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
bcf0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
bd00: 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
bd10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bd20: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
bd30: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
bd40: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
bd50: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
bd60: 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63  N|WO_ISNULL) ) c
bd70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
bd80: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  Term++;.    }.. 
bd90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44     /* If the ORD
bda0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
bdb0: 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
bdc0: 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
bdd0: 74 20 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  t .    ** virtua
bde0: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
bdf0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
be00: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
be10: 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  t of.    ** the 
be20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
be30: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
be40: 20 20 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42    */.    nOrderB
be50: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
be60: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
be70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
be80: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
be90: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
bea0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
beb0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
bec0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
bed0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
bee0: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
bef0: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
bf00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
bf10: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f  .      if( i==pO
bf20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
bf30: 0a 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42  .        nOrderB
bf40: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
bf50: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
bf60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   }..    /* Alloc
bf70: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
bf80: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
bf90: 74 75 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ture.    */.    
bfa0: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
bfb0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
bfc0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
bfd0: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
c000: 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
c010: 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
c020: 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
c050: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
c060: 65 72 42 79 20 29 3b 0a 20 20 20 20 69 66 28 20  erBy );.    if( 
c070: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
c080: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c090: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
c0a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
c0b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b       return 0.0;
c0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 64  .    }.    *ppId
c0d0: 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f  xInfo = pIdxInfo
c0e0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
c0f0: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
c100: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
c110: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
c120: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
c130: 20 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64     ** many field
c140: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
c150: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
c160: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
c170: 78 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68  x from.    ** ch
c180: 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
c190: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
c1a0: 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
c1b0: 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 2a  n order to.    *
c1c0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
c1d0: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a  se fields..    *
c1e0: 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  /.    pIdxCons =
c1f0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
c200: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
c210: 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
c220: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
c230: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
c240: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
c250: 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
c260: 6d 5d 3b 0a 20 20 20 20 70 55 73 61 67 65 20 3d  m];.    pUsage =
c270: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
c280: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
c290: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
c2a0: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
c2b0: 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  .    *(int*)&pId
c2c0: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
c2d0: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  nt = nTerm;.    
c2e0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
c2f0: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
c300: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
c310: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
c320: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
c330: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
c340: 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
c350: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
c360: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
c370: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
c380: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
c390: 78 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a 28  xOrderBy;.    *(
c3a0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
c3b0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
c3c0: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
c3d0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
c3e0: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
c430: 65 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d  e;..    for(i=j=
c440: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
c450: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
c460: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
c470: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
c480: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
c490: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
c4a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
c4b0: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
c4c0: 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
c4d0: 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
c4e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c4f0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
c500: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
c510: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
c520: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
c530: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
c540: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
c550: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
c560: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
c570: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
c580: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
c590: 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
c5a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  tColumn;.      p
c5b0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
c5c0: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
c5d0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
c5e0: 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
c5f0: 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 2f  perator;.      /
c600: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
c610: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
c620: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
c630: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
c640: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
c650: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
c660: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
c670: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
c680: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
c690: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
c6a0: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
c6b0: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
c6c0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
c6d0: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
c6e0: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
c6f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
c700: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
c710: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
c720: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c730: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
c740: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
c750: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
c760: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
c770: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
c780: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
c790: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
c7a0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
c7b0: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
c7c0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
c7d0: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
c7e0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
c7f0: 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CH );.      asse
c800: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
c810: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
c820: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
c830: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
c840: 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  );.      j++;.  
c850: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
c860: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
c870: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
c880: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
c890: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
c8a0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
c8b0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
c8c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
c8d0: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
c8e0: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
c8f0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
c900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
c910: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
c920: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
c930: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
c940: 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
c950: 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
c960: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
c970: 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
c980: 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
c990: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
c9a0: 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
c9b0: 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
c9c0: 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
c9d0: 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
c9e0: 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
c9f0: 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
ca00: 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
ca10: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
ca20: 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
ca30: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
ca40: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
ca50: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
ca60: 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
ca70: 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
ca80: 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
ca90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
caa0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
cab0: 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
cac0: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
cad0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
cae0: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
caf0: 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
cb00: 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
cb10: 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
cb20: 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
cb30: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
cb40: 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 20    assert( pVtab 
cb50: 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  );.#if 0.  if( p
cb60: 54 61 62 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b  Tab->pVtab==0 ){
cb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cb80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
cb90: 64 65 66 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25  defined module %
cba0: 73 20 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c  s for table %s",
cbb0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
cbc0: 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70  zModuleArg[0], p
cbd0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
cbe0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d   return 0.0;.  }
cbf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
cc00: 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
cc10: 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
cc20: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
cc30: 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75   all .  ** outpu
cc40: 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
cc50: 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  ero..  **.  ** a
cc60: 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
cc70: 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ble is true for 
cc80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72  constraints wher
cc90: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
cca0: 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61  .  ** side conta
ccb0: 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e  ins only referen
ccc0: 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f  ces to tables to
ccd0: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
cce0: 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61   current.  ** ta
ccf0: 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
cd00: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e  ords, if the con
cd10: 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
cd20: 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
cd30: 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  *           colu
cd40: 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20  mn = expr.  **. 
cd50: 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
cd60: 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
cd70: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
cd80: 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
cd90: 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61  is .  ** only va
cda0: 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
cdb0: 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
cdc0: 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
cdd0: 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
cde0: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
cdf0: 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  ing column..  **
ce00: 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74  .  ** The aConst
ce10: 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63  raints[] array c
ce20: 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
ce30: 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
ce40: 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
ce50: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20  current table.  
ce60: 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79  That way we only
ce70: 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65   have to compute
ce80: 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76   it once.  ** ev
ce90: 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67  en though we mig
cea0: 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74  ht try to pick t
ceb0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75  he best index mu
cec0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20  ltiple times..  
ced0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
cee0: 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
cef0: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
cf00: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
cf10: 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  the.  ** join mi
cf20: 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
cf30: 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
cf40: 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
cf50: 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61  ble flag.  ** ea
cf60: 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ch time..  */.  
cf70: 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
cf80: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
cf90: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
cfa0: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
cfb0: 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20  raint;.  pUsage 
cfc0: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
cfd0: 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
cfe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
cff0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
d000: 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
d010: 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78  +){.    j = pIdx
d020: 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
d030: 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  t;.    pTerm = &
d040: 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70  pWC->a[j];.    p
d050: 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
d060: 3d 20 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  =  (pTerm->prere
d070: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
d080: 79 29 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 0a  y)==0 ?1:0;.  }.
d090: 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
d0a0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
d0b0: 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
d0c0: 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
d0d0: 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
d0e0: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
d0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
d100: 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
d110: 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78  Str);.  }.  pIdx
d120: 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
d130: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
d140: 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78  xNum = 0;.  pIdx
d150: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
d160: 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  IdxStr = 0;.  pI
d170: 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
d180: 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70  onsumed = 0;.  p
d190: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
d1a0: 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
d1b0: 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a 20  BIG_DBL / 2.0;. 
d1c0: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78   nOrderBy = pIdx
d1d0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a  Info->nOrderBy;.
d1e0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
d1f0: 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72 64  nOrderBy && !ord
d200: 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20 20  erByUsable ){.  
d210: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
d220: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30  fo->nOrderBy = 0
d230: 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69 64 29 73  ;.  }..  (void)s
d240: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
d250: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57  pParse->db);.  W
d260: 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73  HERETRACE(("xBes
d270: 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22  tIndex for %s\n"
d280: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
d290: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
d2a0: 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  UTS(pIdxInfo);. 
d2b0: 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
d2c0: 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
d2d0: 28 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f  (pVtab, pIdxInfo
d2e0: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
d2f0: 55 54 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  UTPUTS(pIdxInfo)
d300: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
d310: 33 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65  3SafetyOn(pParse
d320: 2d 3e 64 62 29 3b 0a 0a 20 20 69 66 28 20 72 63  ->db);..  if( rc
d330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d340: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d350: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
d360: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d370: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
d380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
d390: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d3b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
d3c0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
d3d0: 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
d3e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
d3f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d400: 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
d410: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
d420: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
d430: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56  e(pParse->db, pV
d440: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
d450: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
d460: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
d470: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
d480: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
d490: 20 20 20 20 69 66 28 20 21 70 49 64 78 49 6e 66      if( !pIdxInf
d4a0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
d4b0: 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73 61  ].usable && pUsa
d4c0: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
d4d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
d4e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d4f0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
d500: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
d510: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
d520: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
d530: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
d540: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
d550: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 28 69 6e     }.  }..  *(in
d560: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
d570: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
d580: 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  y;.  return pIdx
d590: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
d5a0: 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ost;.}.#endif /*
d5b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
d5c0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
d5d0: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73  .** Find the bes
d5e0: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65  t index for acce
d5f0: 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
d600: 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  ar table.  Retur
d610: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
d620: 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61  o the index, fla
d630: 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
d640: 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73   how the index s
d650: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74  hould be used, t
d660: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
d670: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
d680: 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63  ints, and the "c
d690: 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e  ost" for this in
d6a0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  dex..**.** The l
d6b0: 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78  owest cost index
d6c0: 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
d6d0: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
d6e0: 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
d6f0: 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
d700: 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f   I/O need to pro
d710: 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
d720: 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63   using the selec
d730: 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61  ted index..** Fa
d740: 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
d750: 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
d760: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
d770: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
d780: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d790: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
d7a0: 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
d7b0: 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
d7c0: 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
d7d0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
d7e0: 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
d7f0: 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
d800: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
d810: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
d820: 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
d830: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
d840: 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
d850: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
d860: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
d870: 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
d880: 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
d890: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
d8a0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
d8b0: 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  ment, then this 
d8c0: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f  function only co
d8d0: 6e 73 69 64 65 72 73 20 73 74 72 61 74 65 67 69  nsiders strategi
d8e0: 65 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  es using the .**
d8f0: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
d900: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
d910: 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72  ound, then the r
d920: 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a  eturned cost is.
d930: 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ** SQLITE_BIG_DB
d940: 4c 2e 20 49 66 20 61 20 73 74 72 61 74 65 67 79  L. If a strategy
d950: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
d960: 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65  at uses the name
d970: 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65  d index, .** the
d980: 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63 61  n the cost is ca
d990: 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20  lculated in the 
d9a0: 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  usual way..**.**
d9b0: 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45   If a NOT INDEXE
d9c0: 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74 74  D clause was att
d9d0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
d9e0: 6c 65 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  le in the SELECT
d9f0: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20   .** statement, 
da00: 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
da10: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
da20: 48 6f 77 65 76 65 72 2c 20 74 68 65 20 73 65 6c  However, the sel
da30: 65 63 74 65 64 20 0a 2a 2a 20 73 74 61 74 65 67  ected .** stateg
da40: 79 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65  y may still take
da50: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
da60: 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69  e tables built-i
da70: 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78  n rowid.** index
da80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
da90: 6c 65 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20  le bestIndex(.  
daa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dac0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
dad0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
dae0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
daf0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
db00: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
db10: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
db20: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
db30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
db40: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
db50: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
db60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
db70: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
db80: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
db90: 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
dba0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
dbb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
dbc0: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
dbd0: 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64  .  Index **ppInd
dbe0: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ex,            /
dbf0: 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20  * Make *ppIndex 
dc00: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73  point to the bes
dc10: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  t index */.  int
dc20: 20 2a 70 57 73 46 6c 61 67 73 2c 20 20 20 20 20   *pWsFlags,     
dc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20           /* Put 
dc40: 77 73 46 6c 61 67 73 20 64 65 73 63 72 69 62 69  wsFlags describi
dc50: 6e 67 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  ng scan strategy
dc60: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
dc70: 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20  pnEq            
dc80: 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68         /* Put th
dc90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
dca0: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
dcb0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68   here */.){.  Wh
dcc0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
dcd0: 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78    Index *bestIdx
dce0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
dcf0: 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65   Index that give
dd00: 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  s the lowest cos
dd10: 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f  t */.  double lo
dd20: 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
dd30: 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
dd40: 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20  f using bestIdx 
dd50: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 57 73 46  */.  int bestWsF
dd60: 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
dd70: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
dd80: 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64  ated with bestId
dd90: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e  x */.  int bestN
dda0: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
ddb0: 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65     /* Best value
ddc0: 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e   for nEq */.  in
ddd0: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
dde0: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
ddf0: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
de00: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
de10: 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
de20: 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
de30: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
de40: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
de50: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b  ng */.  int rev;
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
de80: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
de90: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 77 73  rder */.  int ws
dea0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
deb0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
dec0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
ded0: 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Probe */.  int n
dee0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
def0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
df00: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
df10: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
df20: 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  t eqTermMask;   
df30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
df40: 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
df50: 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
df60: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df80: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
df90: 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 57 48 45  pProbe */..  WHE
dfa0: 52 45 54 52 41 43 45 28 28 22 62 65 73 74 49 6e  RETRACE(("bestIn
dfb0: 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52  dex: tbl=%s notR
dfc0: 65 61 64 79 3d 25 6c 6c 78 5c 6e 22 2c 20 70 53  eady=%llx\n", pS
dfd0: 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
dfe0: 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f  notReady));.  lo
dff0: 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54  westCost = SQLIT
e000: 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 70 50 72  E_BIG_DBL;.  pPr
e010: 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  obe = pSrc->pTab
e020: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 69 66 28 20  ->pIndex;.  if( 
e030: 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
e040: 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
e050: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
e060: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e   the table has n
e070: 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  o indices and th
e080: 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73  ere are no terms
e090: 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20   in the where.  
e0a0: 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  ** clause that r
e0b0: 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49  efer to the ROWI
e0c0: 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  D, then we will 
e0d0: 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f  never be able to
e0e0: 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e   do.  ** anythin
e0f0: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66  g other than a f
e100: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f  ull table scan o
e110: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57  n this table.  W
e120: 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20  e might as.  ** 
e130: 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73  well put it firs
e140: 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72  t in the join or
e150: 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20  der.  That way, 
e160: 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20 62  perhaps it can b
e170: 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65  e.  ** reference
e180: 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65  d by other table
e190: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  s in the join.. 
e1a0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 6f 62 65   */.  if( pProbe
e1b0: 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64  ==0 &&.     find
e1c0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
e1d0: 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
e1e0: 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  IN|WO_LT|WO_LE|W
e1f0: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30  O_GT|WO_GE,0)==0
e200: 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72   &&.     (pOrder
e210: 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62  By==0 || !sortab
e220: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
e230: 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70  pOrderBy, pWC->p
e240: 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29 20  MaskSet, &rev)) 
e250: 29 7b 0a 20 20 20 20 2a 70 57 73 46 6c 61 67 73  ){.    *pWsFlags
e260: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64   = 0;.    *ppInd
e270: 65 78 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45  ex = 0;.    *pnE
e280: 71 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  q = 0;.    retur
e290: 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n 0.0;.  }..  /*
e2a0: 20 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77   Check for a row
e2b0: 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64  id=EXPR or rowid
e2c0: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
e2d0: 61 69 6e 74 73 2e 20 49 66 20 74 68 65 72 65 20  aints. If there 
e2e0: 77 61 73 0a 20 20 2a 2a 20 61 6e 20 49 4e 44 45  was.  ** an INDE
e2f0: 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
e300: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
e310: 61 62 6c 65 2c 20 73 6b 69 70 20 74 68 69 73 20  able, skip this 
e320: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  step..  */.  if(
e330: 20 21 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29   !pSrc->pIndex )
e340: 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  {.    pTerm = fi
e350: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
e360: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
e370: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
e380: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29  .    if( pTerm )
e390: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
e3a0: 78 70 72 3b 0a 20 20 20 20 20 20 2a 70 70 49 6e  xpr;.      *ppIn
e3b0: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  dex = 0;.      b
e3c0: 65 73 74 57 73 46 6c 61 67 73 20 3d 20 57 48 45  estWsFlags = WHE
e3d0: 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
e3e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
e3f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
e400: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  ){.        /* Ro
e410: 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20  wid== is always 
e420: 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20  the best pick.  
e430: 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e  Look no further.
e440: 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20    Because only. 
e450: 20 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67         ** a sing
e460: 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61  le row is genera
e470: 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61  ted, output is a
e480: 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20  lways in sorted 
e490: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
e4a0: 20 2a 70 57 73 46 6c 61 67 73 20 3d 20 57 48 45   *pWsFlags = WHE
e4b0: 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48  RE_ROWID_EQ | WH
e4c0: 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
e4d0: 20 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20      *pnEq = 1;. 
e4e0: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
e4f0: 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20  E(("... best is 
e500: 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20  rowid\n"));.    
e510: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
e520: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e530: 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  (pExpr = pTerm->
e540: 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30  pExpr)->pList!=0
e550: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
e560: 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20  owid IN (LIST): 
e570: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
e580: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
e590: 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20  ber of list.    
e5a0: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
e5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 6f 77    */.        low
e5c0: 65 73 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d  estCost = pExpr-
e5d0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  >pList->nExpr;. 
e5e0: 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73         lowestCos
e5f0: 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65  t *= estLog(lowe
e600: 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d  stCost);.      }
e610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
e620: 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43   Rowid IN (SELEC
e630: 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67  T): cost is Nlog
e640: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
e650: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
e660: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
e670: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
e680: 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57  inner select.  W
e690: 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  e have no way to
e6a0: 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20   estimate.      
e6b0: 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20    ** that value 
e6c0: 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67  so make a wild g
e6d0: 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uess. */.       
e6e0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30   lowestCost = 20
e6f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
e700: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
e710: 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a  . rowid IN cost:
e720: 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74   %.9g\n", lowest
e730: 43 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Cost));.    }.  
e740: 0a 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  .    /* Estimate
e750: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74   the cost of a t
e760: 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77  able scan.  If w
e770: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  e do not know ho
e780: 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 65 6e  w many.    ** en
e790: 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65  tries are in the
e7a0: 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69   table, use 1 mi
e7b0: 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73  llion as a guess
e7c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73  ..    */.    cos
e7d0: 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72  t = pProbe ? pPr
e7e0: 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
e7f0: 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20   : 1000000;.    
e800: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
e810: 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65   table scan base
e820: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
e830: 63 6f 73 74 29 29 3b 0a 20 20 20 20 77 73 46 6c  cost));.    wsFl
e840: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
e850: 44 5f 52 41 4e 47 45 3b 0a 20 20 0a 20 20 20 20  D_RANGE;.  .    
e860: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
e870: 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61  straints on a ra
e880: 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e  nge of rowids in
e890: 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20   a table scan.. 
e8a0: 20 20 20 2a 2f 0a 20 20 20 20 70 54 65 72 6d 20     */.    pTerm 
e8b0: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
e8c0: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
e8d0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
e8e0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
e8f0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29  .    if( pTerm )
e900: 7b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64  {.      if( find
e910: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
e920: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
e930: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b  _LT|WO_LE, 0) ){
e940: 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
e950: 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
e960: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 63 6f 73  MIT;.        cos
e970: 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73  t /= 3;  /* Gues
e980: 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50  s that rowid<EXP
e990: 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
e9a0: 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20  -thirds of rows 
e9b0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
e9c0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
e9d0: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
e9e0: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
e9f0: 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  GE, 0) ){.      
ea00: 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
ea10: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
ea20: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
ea30: 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20    /* Guess that 
ea40: 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69  rowid>EXPR elimi
ea50: 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73  nates two-thirds
ea60: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   of rows */.    
ea70: 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
ea80: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
ea90: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
eaa0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
eab0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  cost));.    }els
eac0: 65 7b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  e{.      wsFlags
ead0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
eae0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
eaf0: 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74  le scan does not
eb00: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
eb10: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
eb20: 63 72 65 61 73 65 0a 20 20 20 20 2a 2a 20 74 68  crease.    ** th
eb30: 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20  e cost by NlogN 
eb40: 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70  to cover the exp
eb50: 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e  ense of sorting.
eb60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
eb70: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
eb80: 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  ( sortableByRowi
eb90: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
eba0: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
ebb0: 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
ebc0: 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
ebd0: 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45  RE_ORDERBY|WHERE
ebe0: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20  _ROWID_RANGE;.  
ebf0: 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
ec00: 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
ec10: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
ec20: 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
ec30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ec40: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
ec50: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
ec60: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
ec70: 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20  E(("... sorting 
ec80: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
ec90: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
eca0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ecb0: 0a 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f  .    if( cost<lo
ecc0: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
ecd0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
ece0: 6f 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74 57  ost;.      bestW
ecf0: 73 46 6c 61 67 73 20 3d 20 77 73 46 6c 61 67 73  sFlags = wsFlags
ed00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ed10: 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
ed20: 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
ed30: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
ed40: 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
ed50: 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
ed60: 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
ed70: 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
ed80: 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
ed90: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
eda0: 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
edb0: 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
edc0: 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
edd0: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
ede0: 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
edf0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
ee00: 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
ee10: 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
ee20: 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
ee30: 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
ee40: 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
ee50: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
ee60: 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  {.    eqTermMask
ee70: 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
ee80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54    }else{.    eqT
ee90: 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
eea0: 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
eeb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
eec0: 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20  at each index.. 
eed0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
eee0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 50  pIndex ){.    pP
eef0: 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
ef00: 64 65 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b  dex;.  }.  for(;
ef10: 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
ef20: 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20  (pSrc->pIndex ? 
ef30: 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78  0 : pProbe->pNex
ef40: 74 29 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  t)){.    int i; 
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ef70: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75  unter */.    dou
ef80: 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ble inMultiplier
ef90: 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45   = 1;..    WHERE
efa0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65  TRACE(("... inde
efb0: 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65  x %s:\n", pProbe
efc0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
efd0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
efe0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
eff0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
f000: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20   are satisfied. 
f010: 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20     ** by x=EXPR 
f020: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78  constraints or x
f030: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
f040: 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
f050: 20 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20    wsFlags = 0;. 
f060: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f070: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  robe->nColumn; i
f080: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
f090: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
f0a0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  umn[i];.      pT
f0b0: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
f0c0: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
f0d0: 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
f0e0: 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  k, pProbe);.    
f0f0: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
f100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73   break;.      ws
f110: 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
f120: 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
f130: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
f140: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
f150: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
f160: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
f170: 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c  pr;.        wsFl
f180: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
f190: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
f1a0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
f1b0: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
f1c0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
f1d0: 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d  *= 25;.        }
f1e0: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
f1f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
f200: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
f210: 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72  tiplier *= pExpr
f220: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  ->pList->nExpr +
f230: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
f240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f250: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  cost = pProbe->a
f260: 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
f270: 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c  ultiplier * estL
f280: 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
f290: 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
f2a0: 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
f2b0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
f2c0: 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
f2d0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
f2e0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45  0.         && nE
f2f0: 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
f300: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 77 73 46 6c  mn ){.      wsFl
f310: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
f320: 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  QUE;.    }.    W
f330: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
f340: 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74  .. nEq=%d inMult
f350: 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c  =%.9g cost=%.9g\
f360: 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70 6c  n",nEq,inMultipl
f370: 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20 20  ier,cost));..   
f380: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e   /* Look for ran
f390: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
f3a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45     */.    if( nE
f3b0: 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
f3c0: 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  n ){.      int j
f3d0: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
f3e0: 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20  umn[nEq];.      
f3f0: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
f400: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
f410: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
f420: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
f430: 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  , pProbe);.     
f440: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
f450: 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
f460: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
f470: 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NGE;.        if(
f480: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
f490: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
f4a0: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
f4b0: 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
f4c0: 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
f4d0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
f4e0: 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
f4f0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
f500: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
f510: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
f520: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
f530: 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73   ){.          ws
f550: 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  Flags |= WHERE_B
f560: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
f570: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
f580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f590: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
f5a0: 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63  .... range reduc
f5b0: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
f5c0: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
f5d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
f5e0: 2a 20 41 64 64 20 74 68 65 20 61 64 64 69 74 69  * Add the additi
f5f0: 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72  onal cost of sor
f600: 74 69 6e 67 20 69 66 20 74 68 61 74 20 69 73 20  ting if that is 
f610: 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f  a factor..    */
f620: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
f630: 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
f640: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f650: 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26  COLUMN_IN)==0 &&
f660: 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f  .           isSo
f670: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
f680: 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  e,pWC->pMaskSet,
f690: 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64  pProbe,iCur,pOrd
f6a0: 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29  erBy,nEq,&rev) )
f6b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 73  {.        if( ws
f6c0: 46 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Flags==0 ){.    
f6d0: 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20        wsFlags = 
f6e0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
f6f0: 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  GE;.        }.  
f700: 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
f710: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
f720: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
f730: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46  ){.          wsF
f740: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
f750: 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d  VERSE;.        }
f760: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f770: 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f        cost += co
f780: 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b  st*estLog(cost);
f790: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
f7a0: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64  ACE(("...... ord
f7b0: 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63  erby increases c
f7c0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
f7d0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
f7e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
f7f0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
f800: 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69   can get away wi
f810: 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  th using just th
f820: 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a  e index without.
f830: 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64      ** ever read
f840: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
f850: 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
f860: 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20  ase, then halve 
f870: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
f880: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
f890: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73     */.    if( ws
f8a0: 46 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63  Flags && pSrc->c
f8b0: 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d  olUsed < (((Bitm
f8c0: 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
f8d0: 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
f8e0: 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
f8f0: 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
f900: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
f910: 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   j<pProbe->nColu
f920: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
f930: 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65    int x = pProbe
f940: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
f950: 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
f960: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
f970: 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
f980: 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
f990: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f9a0: 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
f9b0: 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
f9c0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
f9d0: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
f9e0: 32 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  2;.        WHERE
f9f0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69  TRACE(("...... i
fa00: 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20  dx-only reduces 
fa10: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
fa20: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
fa30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
fa40: 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73  f this index has
fa50: 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f   achieved the lo
fa60: 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72  west cost so far
fa70: 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20  , then use it.. 
fa80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73     */.    if( ws
fa90: 46 6c 61 67 73 20 26 26 20 63 6f 73 74 20 3c 20  Flags && cost < 
faa0: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
fab0: 20 20 20 20 62 65 73 74 49 64 78 20 3d 20 70 50      bestIdx = pP
fac0: 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65  robe;.      lowe
fad0: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
fae0: 20 20 20 20 20 62 65 73 74 57 73 46 6c 61 67 73       bestWsFlags
faf0: 20 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20   = wsFlags;.    
fb00: 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b    bestNEq = nEq;
fb10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fb20: 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74   Report the best
fb30: 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a   result.  */.  *
fb40: 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64  ppIndex = bestId
fb50: 78 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  x;.  WHERETRACE(
fb60: 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20  ("best index is 
fb70: 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 77  %s, cost=%.9g, w
fb80: 73 46 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25  sFlags=%x, nEq=%
fb90: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65  d\n",.        be
fba0: 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d  stIdx ? bestIdx-
fbb0: 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29  >zName : "(none)
fbc0: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62  ", lowestCost, b
fbd0: 65 73 74 57 73 46 6c 61 67 73 2c 20 62 65 73 74  estWsFlags, best
fbe0: 4e 45 71 29 29 3b 0a 20 20 2a 70 57 73 46 6c 61  NEq));.  *pWsFla
fbf0: 67 73 20 3d 20 62 65 73 74 57 73 46 6c 61 67 73  gs = bestWsFlags
fc00: 20 7c 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20   | eqTermMask;. 
fc10: 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71   *pnEq = bestNEq
fc20: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73  ;.  return lowes
fc30: 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tCost;.}.../*.**
fc40: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
fc50: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
fc60: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
fc70: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
fc80: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
fc90: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
fca0: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
fcb0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
fcc0: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
fcd0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
fce0: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
fcf0: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
fd00: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
fd10: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
fd20: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
fd30: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
fd40: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
fd50: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
fd60: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
fd70: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
fd80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
fd90: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
fda0: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
fdb0: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
fdc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
fdd0: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
fde0: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
fdf0: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
fe00: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
fe10: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
fe20: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
fe30: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
fe40: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
fe50: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
fe60: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
fe70: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
fe80: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
fe90: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
fea0: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
feb0: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
fec0: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
fed0: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
fee0: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
fef0: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
ff00: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
ff10: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
ff20: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
ff30: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
ff40: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
ff50: 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
ff60: 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
ff70: 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
ff80: 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
ff90: 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
ffa0: 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
ffb0: 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
ffc0: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
ffd0: 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
ffe0: 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
fff0: 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
10000 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
10010 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
10020 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
10030 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
10040 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
10050 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
10060 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
10070 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
10080 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
10090 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
100a0 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
100b0 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
100c0 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
100d0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
100e0 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
100f0 20 41 4c 57 41 59 53 28 28 70 54 65 72 6d 2d 3e   ALWAYS((pTerm->
10100 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
10110 4f 44 45 44 29 3d 3d 30 29 0a 20 20 20 20 20 20  ODED)==0).      
10120 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
10130 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
10140 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
10150 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
10160 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20  mJoin)).  ){.   
10170 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
10180 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
10190 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
101a0 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
101b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
101c0 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
101d0 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
101e0 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
101f0 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
10200 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
10210 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
10220 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
10230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10240 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 74  }../*.** Apply t
10250 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 61 73  he affinities as
10260 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10270 65 20 66 69 72 73 74 20 6e 20 63 6f 6c 75 6d 6e  e first n column
10280 73 20 6f 66 20 69 6e 64 65 78 0a 2a 2a 20 70 49  s of index.** pI
10290 64 78 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  dx to the values
102a0 20 69 6e 20 74 68 65 20 6e 20 72 65 67 69 73 74   in the n regist
102b0 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
102c0 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
102d0 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
102e0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
102f0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
10300 69 6e 74 20 6e 2c 20 49 6e 64 65 78 20 2a 70 49  int n, Index *pI
10310 64 78 29 7b 0a 20 20 69 66 28 20 6e 3e 30 20 29  dx){.  if( n>0 )
10320 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
10330 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
10340 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
10350 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10360 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
10370 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
10380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6e  );.    sqlite3In
10390 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
103a0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  , pIdx);.    sql
103b0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
103c0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
103d0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
103e0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
103f0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
10400 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
10410 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
10420 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
10430 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
10440 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
10450 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
10460 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
10470 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
10480 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
10490 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
104a0 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
104b0 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
104c0 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
104d0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
104e0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
104f0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
10500 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
10510 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
10520 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
10530 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
10540 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
10550 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
10560 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
10570 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
10580 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
10590 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
105a0 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
105b0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
105c0 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
105d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
105e0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
105f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
10600 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
10610 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
10620 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10630 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
10640 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10650 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65  evel, /* When le
10660 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
10670 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
10680 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
10690 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20  t iTarget       
106a0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
106b0 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e  leave results in
106c0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
106d0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
106e0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
106f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10700 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
10710 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   iReg;          
10720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10730 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
10740 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lts */..  assert
10750 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20  ( iTarget>0 );. 
10760 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
10770 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  EQ ){.    iReg =
10780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10790 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
107a0 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
107b0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
107c0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
107d0 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
107e0 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
107f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10800 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
10810 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
10820 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10830 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
10840 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69  int eType;.    i
10850 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
10860 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
10870 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  ..    assert( pX
10880 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
10890 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
108a0 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  t;.    eType = s
108b0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
108c0 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29  x(pParse, pX, 0)
108d0 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  ;.    iTab = pX-
108e0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
108f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10900 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
10910 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43  b, 0);.    VdbeC
10920 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 2e 2a 73  omment((v, "%.*s
10930 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70  ", pX->span.n, p
10940 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20  X->span.z));.   
10950 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e   if( pLevel->nIn
10960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
10970 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
10980 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10990 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
109a0 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b    pLevel->nIn++;
109b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  .    pLevel->aIn
109c0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Loop = sqlite3Db
109d0 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
109e0 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
109f0 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  ->aInLoop,.     
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a20 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
10a30 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
10a40 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  ->nIn);.    pIn 
10a50 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  = pLevel->aInLoo
10a60 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
10a70 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
10a80 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20 31 3b 0a  Level->nIn - 1;.
10a90 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
10aa0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
10ab0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
10ac0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
10ad0 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
10ae0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
10af0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
10b00 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
10b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10b20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
10b30 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
10b40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
10b50 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
10b60 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
10b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10b80 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
10b90 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
10ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
10bb0 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
10bc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
10bd0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
10be0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
10bf0 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
10c00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10c10 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
10c20 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
10c30 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
10c40 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  or an.** index. 
10c50 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   The values for 
10c60 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
10c70 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20  are left on the 
10c80 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
10c90 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
10ca0 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
10cb0 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
10cc0 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
10cd0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
10ce0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
10cf0 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
10d00 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
10d10 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
10d20 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
10d30 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
10d40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
10d50 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
10d60 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
10d70 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
10d80 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
10d90 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
10da0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
10db0 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
10dc0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
10dd0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
10de0 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
10df0 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
10e00 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
10e10 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
10e20 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a   will be left.**
10e30 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20   on the stack - 
10e40 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74  a is the deepest
10e50 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c   and b the shall
10e60 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  owest..**.** In 
10e70 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
10e80 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
10e90 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
10ea0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
10eb0 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
10ec0 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
10ed0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
10ee0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
10ef0 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
10f00 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
10f10 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
10f20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
10f30 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
10f40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
10f50 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
10f60 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
10f70 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
10f80 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
10f90 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
10fa0 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
10fb0 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
10fc0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
10fd0 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
10fe0 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
10ff0 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
11000 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
11010 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
11020 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
11030 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
11040 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
11050 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
11060 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
11070 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
11080 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  ernal.** use..*/
11090 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
110a0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
110b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
110c0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
110d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
110e0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
110f0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
11100 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
11110 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
11120 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
11130 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
11140 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11150 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
11160 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
11170 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
11180 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
11190 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
111a0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
111b0 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg         /* Nu
111c0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
111d0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
111e0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
111f0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
11200 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
11210 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
11220 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
11230 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
11240 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11250 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
11260 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
11270 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
11280 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
11290 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
112a0 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
112b0 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
112c0 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
112d0 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
112e0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
112f0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
11300 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
11310 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
11320 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
11330 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
11340 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
11350 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11370 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11380 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
113b0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r */..  /* Figur
113c0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
113d0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
113e0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
113f0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
11400 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
11410 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
11420 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
11430 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
11440 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
11450 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
11460 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
11470 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
11480 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
11490 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
114a0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
114b0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 70 50  ->nMem + 1;.  pP
114c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
114d0 65 76 65 6c 2d 3e 6e 45 71 20 2b 20 31 20 2b 20  evel->nEq + 1 + 
114e0 6e 45 78 74 72 61 52 65 67 3b 0a 0a 20 20 2f 2a  nExtraReg;..  /*
114f0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
11500 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
11510 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
11520 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
11530 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
11540 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
11550 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
11560 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
11570 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70  Column[j];.    p
11580 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
11590 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
115a0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e  tReady, pLevel->
115b0 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  wsFlags, pIdx);.
115c0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54      if( NEVER(pT
115d0 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  erm==0) ) break;
115e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
115f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
11600 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
11610 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
11620 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
11630 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
11640 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
11650 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
11660 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e+j ){.      sql
11670 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11680 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
11690 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
116a0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
116b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
116c0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
116d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
116e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
116f0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
11700 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
11710 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
11720 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
11730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
11750 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
11760 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
11770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11780 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
11790 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
117a0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
117b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
117c0 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
117d0 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
117e0 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
117f0 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
11800 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
11810 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
11820 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
11830 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
11840 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
11850 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
11860 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
11870 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
11880 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
11890 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
118a0 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
118b0 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
118c0 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
118d0 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
118e0 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11900 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
11910 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
11920 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
11930 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
11940 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
11950 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
11960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11970 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
11980 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
11990 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
119a0 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
119b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
119c0 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
119d0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
119e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
119f0 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
11a00 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
11a10 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
11a20 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
11a30 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f     assert( pInfo
11a40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
11a50 74 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  tr==0 );.       
11a60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11a70 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  b, pInfo);.     
11a80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
11a90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11aa0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
11ab0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
11ac0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
11ad0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
11ae0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
11af0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
11b00 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
11b10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
11b20 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
11b30 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
11b40 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11b50 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
11b60 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
11b70 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
11b80 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
11b90 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
11ba0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
11bb0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
11bc0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
11bd0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
11be0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
11bf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
11c00 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
11c10 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11c20 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
11c30 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
11c40 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
11c50 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
11c60 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
11c70 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
11c80 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
11c90 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
11ca0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
11cb0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
11cc0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
11cd0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
11ce0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
11cf0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
11d00 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
11d10 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
11d20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
11d30 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
11d40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
11d50 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
11d60 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
11d70 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
11d80 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
11d90 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
11da0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
11db0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
11dc0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
11dd0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
11de0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
11df0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
11e00 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
11e10 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
11e20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
11e30 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
11e40 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
11e50 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
11e60 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
11e80 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
11e90 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
11ec0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
11ed0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
11f00 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
11f10 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
11f20 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
11f30 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
11f40 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
11f50 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
11f60 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
11f70 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
11f80 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
11f90 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
11fa0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
11fb0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
11fc0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
11fd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
11fe0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
11ff0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
12000 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
12010 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
12020 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
12030 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
12040 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
12050 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
12060 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
12070 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
12080 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
12090 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
120a0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
120b0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
120c0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
120d0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
120e0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
120f0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
12100 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
12110 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
12120 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
12130 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
12140 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
12150 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
12160 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
12170 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
12180 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12190 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
121a0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
121b0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
121c0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
121d0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
121e0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
121f0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
12200 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
12210 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
12220 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
12230 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
12240 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
12250 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
12260 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
12270 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
12280 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
12290 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
122a0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
122b0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
122c0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
122d0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
122e0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
122f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
12300 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
12310 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
12320 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
12330 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
12340 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
12350 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
12360 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
12370 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
12380 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
12390 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
123a0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
123b0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
123c0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
123d0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
123e0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
123f0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
12400 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
12410 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
12420 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
12430 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
12440 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
12450 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
12460 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
12470 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
12480 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
12490 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
124a0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
124b0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
124c0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
124d0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
124e0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
124f0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
12500 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
12510 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
12520 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
12530 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
12540 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
12550 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
12560 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
12570 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
12580 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
12590 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
125a0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
125b0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
125c0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
125d0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
125e0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
125f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12600 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
12610 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
12620 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
12630 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
12640 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
12650 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
12660 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
12670 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
12680 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
12690 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
126a0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
126b0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
126c0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
126d0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
126e0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
126f0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
12700 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
12710 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
12720 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
12730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12740 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12750 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
12760 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
12770 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
12780 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
12790 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
127a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
127b0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
127c0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
127d0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
127e0 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
127f0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
12800 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
12810 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
12820 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
12830 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
12840 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
12850 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
12860 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
12870 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
12880 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
12890 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
128a0 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
128b0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
128c0 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
128d0 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
128e0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
128f0 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
12900 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
12910 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
12920 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
12930 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
12940 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
12950 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
12960 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
12970 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
12980 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
12990 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
129a0 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
129b0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
129c0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
129d0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
129e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
129f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
12a00 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
12a10 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
12a20 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
12a30 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
12a40 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
12a50 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
12a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
12a70 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
12a80 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
12a90 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
12aa0 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
12ab0 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 63 74 72  ULL */.  u8 wctr
12ac0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 2f  lFlags         /
12ad0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
12ae0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
12af0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
12b00 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12b30 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49  nter */.  WhereI
12b40 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
12b50 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
12b60 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
12b70 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
12b80 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
12b90 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
12ba0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
12bb0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
12bc0 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  gine */.  int ad
12bd0 64 72 42 72 6b 2c 20 61 64 64 72 43 6f 6e 74 20  drBrk, addrCont 
12be0 3d 20 30 3b 20 2f 2a 20 41 64 64 72 65 73 73 65  = 0; /* Addresse
12bf0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f  s used during co
12c00 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  de generation */
12c10 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
12c20 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
12c30 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
12c40 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
12c50 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54  oned */.  WhereT
12c60 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
12c70 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
12c80 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
12c90 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
12ca0 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53  xprMaskSet maskS
12cb0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  et;       /* The
12cc0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
12cd0 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43   set */.  WhereC
12ce0 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
12cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
12d00 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69  E clause is divi
12d10 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74  ded into these t
12d20 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
12d30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12d40 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
12d50 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
12d60 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
12d70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
12d80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
12d90 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
12da0 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
12db0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ist */.  int iFr
12dc0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
12dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
12de0 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c  t unused FROM cl
12df0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ause element */.
12e00 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20    int andFlags; 
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69  AND-ed combinati
12e30 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d  on of all wc.a[]
12e40 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71  .wtFlags */.  sq
12e50 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
12e60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12e70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12e80 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12e90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
12ea0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
12eb0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
12ec0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
12ed0 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
12ee0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
12ef0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
12f00 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
12f10 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
12f20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12f30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
12f40 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
12f50 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
12f60 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12f70 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f 72 64 65   }..  if( ppOrde
12f80 72 42 79 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  rBy ){.    pOrde
12f90 72 42 79 20 3d 20 2a 70 70 4f 72 64 65 72 42 79  rBy = *ppOrderBy
12fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69  ;.  }..  /* Spli
12fb0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
12fc0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
12fd0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
12fe0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
12ff0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
13000 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
13010 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
13020 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
13030 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(&maskSet);.  w
13040 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
13050 77 63 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73  wc, pParse, &mas
13060 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  kSet);.  sqlite3
13070 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
13080 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
13090 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
130a0 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  &wc, pWhere, TK_
130b0 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
130c0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
130d0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
130e0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
130f0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
13100 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
13110 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64   value..  */.  d
13120 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13130 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
13140 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
13150 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  b,  .           
13160 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
13170 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
13180 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
13190 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
131a0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
131b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
131c0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
131d0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
131e0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54  nfo->nLevel = pT
131f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20  abList->nSrc;.  
13200 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
13210 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
13220 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
13230 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
13240 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
13250 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13260 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  v);..  /* Specia
13270 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
13280 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
13290 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
132a0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
132b0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
132c0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
132d0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
132e0 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
132f0 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
13300 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
13310 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
13320 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
13330 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
13340 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13350 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
13360 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
13370 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
13380 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
13390 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
133a0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
133b0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
133c0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
133d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
133e0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
133f0 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
13400 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
13410 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
13420 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
13430 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
13440 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
13450 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
13460 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
13470 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
13480 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
13490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
134a0 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
134b0 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
134c0 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
134d0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
134e0 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
134f0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
13500 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
13510 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
13520 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
13530 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
13540 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
13550 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
13560 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
13570 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
13580 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
13590 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
135a0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
135b0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
135c0 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
135d0 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
135e0 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
135f0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
13600 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
13610 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
13620 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
13630 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
13640 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
13650 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72  rc; i++){.    cr
13660 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65  eateMask(&maskSe
13670 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
13680 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
13690 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
136a0 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
136b0 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
136c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
136d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
136e0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
136f0 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61   m = getMask(&ma
13700 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
13710 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
13720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
13730 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
13740 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
13750 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
13760 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
13770 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
13780 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
13790 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70  .  Note that exp
137a0 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74  rAnalyze() might
137b0 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69  .  ** add new vi
137c0 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f  rtual terms onto
137d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
137e0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
137f0 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61  e do not.  ** wa
13800 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  nt to analyze th
13810 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ese virtual term
13820 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c  s, so start anal
13830 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  yzing at the end
13840 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66  .  ** and work f
13850 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74  orward so that t
13860 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
13870 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
13880 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
13890 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
138a0 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 77 63 29  l(pTabList, &wc)
138b0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
138c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
138d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
138e0 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
138f0 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
13900 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
13910 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
13920 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
13930 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
13940 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
13950 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
13960 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
13970 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
13980 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
13990 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
139a0 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
139b0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
139c0 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48  a[].wsFlags   WH
139d0 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
139e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
139f0 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
13a00 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
13a10 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
13a20 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
13a30 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
13a40 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
13a50 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74   Which term of t
13a60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
13a70 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
13a80 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
13a90 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
13aa0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
13ab0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
13ac0 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
13ad0 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
13ae0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
13af0 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
13b00 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
13b10 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
13b20 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
13b30 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
13b40 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
13b50 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
13b60 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
13b70 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
13b80 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
13b90 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
13ba0 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
13bb0 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52   = ~0;.  WHERETR
13bc0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
13bd0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
13be0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f  ));.  for(i=iFro
13bf0 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  m=0, pLevel=pWIn
13c00 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
13c10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
13c20 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
13c30 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
13c40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13c50 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
13c60 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
13c70 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 2f 2a 20 46 6c 61 67 73 20 64 65 73 63 72 69 62  /* Flags describ
13ca0 69 6e 67 20 73 63 61 6e 20 73 74 72 61 74 65 67  ing scan strateg
13cb0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71  y */.    int nEq
13cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13cd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13ce0 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
13cf0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f  raints */.    do
13d00 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
13d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13d20 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a   cost for pIdx *
13d30 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
13d60 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
13d70 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
13d80 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
13d90 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
13da0 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66   index seen so f
13db0 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  ar */.    int be
13dc0 73 74 57 73 46 6c 61 67 73 20 3d 20 30 3b 20 20  stWsFlags = 0;  
13dd0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
13de0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
13df0 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
13e00 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
13e10 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61          /* nEq a
13e20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
13e30 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62  Best */.    doub
13e40 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
13e50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
13e60 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a  of the pBest */.
13e70 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
13e80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13e90 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
13ea0 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
13eb0 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
13ec0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
13ed0 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
13ee0 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
13ef0 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  once = 0;       
13f00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13f10 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65  when first table
13f20 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20   is seen */.    
13f30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13f40 66 6f 20 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43  fo *pIndex; /* C
13f50 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69  urrent virtual i
13f60 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77  ndex */..    low
13f70 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  estCost = SQLITE
13f80 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f  _BIG_DBL;.    fo
13f90 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
13fa0 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
13fb0 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  [j]; j<pTabList-
13fc0 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nSrc; j++, pTab
13fd0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
13fe0 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b  nt doNotReorder;
13ff0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
14000 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
14010 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
14020 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52  */..      doNotR
14030 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49  eorder =  (pTabI
14040 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
14050 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
14060 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66  S))!=0;.      if
14070 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52  ( once && doNotR
14080 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
14090 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
140a0 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
140b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
140c0 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
140d0 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
140e0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
140f0 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
14100 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14120 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
14130 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66  >pTab );.#ifndef
14140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14150 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
14160 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14170 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  abItem->pTab) ){
14180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14190 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
141a0 49 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66  IdxInfo = &pWInf
141b0 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
141c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d  ;.        cost =
141d0 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
141e0 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70  x(pParse, &wc, p
141f0 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
14200 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f 20 2a     ppOrderBy ? *
14230 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 20 69  ppOrderBy : 0, i
14240 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ==0,.           
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b       ppIdxInfo);
14270 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
14280 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
14290 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 70  TABLE;.        p
142a0 49 6e 64 65 78 20 3d 20 2a 70 70 49 64 78 49 6e  Index = *ppIdxIn
142b0 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  fo;.        if( 
142c0 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
142d0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
142e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  d ){.          w
142f0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
14300 49 52 54 55 41 4c 54 41 42 4c 45 20 7c 20 57 48  IRTUALTABLE | WH
14310 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
14320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
14330 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
14340 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20   nEq = 0;.      
14350 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49    if( (SQLITE_BI
14360 47 5f 44 42 4c 2f 32 2e 30 29 3c 63 6f 73 74 20  G_DBL/2.0)<cost 
14370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14380 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20  The cost is not 
14390 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61  allowed to be la
143a0 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
143b0 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20  _BIG_DBL (the.  
143c0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 61          ** inita
143d0 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73  l value of lowes
143e0 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f  tCost in this lo
143f0 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68  op. If it is, th
14400 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
14410 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74  the (cost<lowest
14420 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77  Cost) test below
14430 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74   will never be t
14440 72 75 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rue and.        
14450 20 20 2a 2a 20 70 4c 65 76 65 6c 2d 3e 70 42 65    ** pLevel->pBe
14460 73 74 49 64 78 20 6e 65 76 65 72 20 73 65 74 2e  stIdx never set.
14470 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
14480 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20           cost = 
14490 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
144a0 32 2e 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2.0);.        }.
144b0 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e        }else .#en
144c0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
144d0 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49      cost = bestI
144e0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63  ndex(pParse, &wc
144f0 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
14500 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14520 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
14530 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
14540 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
14560 49 64 78 2c 20 26 77 73 46 6c 61 67 73 2c 20 26  Idx, &wsFlags, &
14570 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70 49  nEq);.        pI
14580 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
14590 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73 74  }.      if( cost
145a0 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
145b0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b         once = 1;
145c0 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43  .        lowestC
145d0 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
145e0 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
145f0 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 57 73  ;.        bestWs
14600 46 6c 61 67 73 20 3d 20 77 73 46 6c 61 67 73 3b  Flags = wsFlags;
14610 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71  .        bestNEq
14620 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20   = nEq;.        
14630 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
14640 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74     pLevel->pBest
14650 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Idx = pIndex;.  
14660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14670 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
14680 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14690 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
146a0 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
146b0 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20  ts table %d for 
146c0 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74  loop %d\n", best
146d0 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c  J,.           pL
146e0 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29  evel-pWInfo->a))
146f0 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 57  ;.    if( (bestW
14700 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
14710 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
14720 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
14730 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
14740 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 57 73  dFlags &= bestWs
14750 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
14760 6c 2d 3e 77 73 46 6c 61 67 73 20 3d 20 62 65 73  l->wsFlags = bes
14770 74 57 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c  tWsFlags;.    pL
14780 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65  evel->pIdx = pBe
14790 73 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  st;.    pLevel->
147a0 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20  nEq = bestNEq;. 
147b0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f     pLevel->aInLo
147c0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76  op = 0;.    pLev
147d0 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
147e0 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
147f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
14800 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
14810 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ab++;.    }else{
14820 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
14830 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  IdxCur = -1;.   
14840 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20   }.    notReady 
14850 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73  &= ~getMask(&mas
14860 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
14870 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
14880 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  );.    pLevel->i
14890 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 0a 20  From = bestJ;.. 
148a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
148b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 63   if the table sc
148c0 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f  anned by this lo
148d0 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64  op iteration had
148e0 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58   an.    ** INDEX
148f0 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74  ED BY clause att
14900 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61  ached to it, tha
14910 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  t the named inde
14920 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  x is being.    *
14930 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73  * used for the s
14940 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65  can. If not, the
14950 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74  n query compilat
14960 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a  ion has failed..
14970 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e      ** Return an
14980 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
14990 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69     pIdx = pTabLi
149a0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e  st->a[bestJ].pIn
149b0 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
149c0 20 21 70 49 64 78 20 7c 7c 20 21 70 42 65 73 74   !pIdx || !pBest
149d0 20 7c 7c 20 70 49 64 78 3d 3d 70 42 65 73 74 20   || pIdx==pBest 
149e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
149f0 26 26 20 70 42 65 73 74 21 3d 70 49 64 78 20 29  && pBest!=pIdx )
14a00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14a10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14a20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65  "cannot use inde
14a30 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  x: %s", pIdx->zN
14a40 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
14a50 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
14a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
14a70 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
14a80 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
14a90 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f  d ***\n"));..  /
14aa0 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
14ab0 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
14ac0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
14ad0 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
14ae0 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
14af0 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
14b00 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
14b10 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
14b20 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
14b30 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
14b40 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
14b50 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
14b60 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
14b70 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
14b80 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
14b90 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
14ba0 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
14bb0 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
14bc0 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
14bd0 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
14be0 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
14bf0 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
14c00 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
14c10 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
14c20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
14c30 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
14c40 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
14c50 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
14c60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
14c70 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
14c80 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
14c90 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
14ca0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
14cb0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
14cc0 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46  RED)!=0 && (andF
14cd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
14ce0 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  QUE)!=0 ){.    p
14cf0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
14d00 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
14d10 2d 3e 61 5b 30 5d 2e 77 73 46 6c 61 67 73 20 26  ->a[0].wsFlags &
14d20 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
14d30 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
14d40 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
14d50 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
14d60 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
14d70 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
14d80 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
14d90 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
14da0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
14db0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
14dc0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
14dd0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
14de0 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
14df0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
14e00 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
14e10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
14e20 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
14e30 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
14e40 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
14e50 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b  .    Index *pIx;
14e60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
14e70 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54  sed to access pT
14e80 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  ab (if any) */. 
14e90 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
14ea0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
14eb0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
14ec0 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
14ed0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
14ee0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
14ef0 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53  xCur;..#ifndef S
14f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
14f10 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  IN.    if( pPars
14f20 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
14f30 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
14f40 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  g;.      struct 
14f50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
14f60 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
14f70 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
14f80 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ];.      zMsg = 
14f90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
14fa0 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70  b, "TABLE %s", p
14fb0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
14fc0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
14fd0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
14fe0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
14ff0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
15000 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
15010 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
15020 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
15030 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65    if( (pIx = pLe
15040 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b  vel->pIdx)!=0 ){
15050 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
15060 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
15070 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57 49  db, zMsg, "%s WI
15080 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d  TH INDEX %s", zM
15090 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b  sg, pIx->zName);
150a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
150b0 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67 73   pLevel->wsFlags
150c0 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
150d0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
150e0 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ANGE) ){.       
150f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
15100 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
15110 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52 49 4d  , "%s USING PRIM
15120 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
15130 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
15140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15150 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
15160 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
15170 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20  >pBestIdx ){.   
15180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
15190 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64  ex_info *pBestId
151a0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  x = pLevel->pBes
151b0 74 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d  tIdx;.        zM
151c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
151d0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
151e0 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
151f0 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
15200 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
15210 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
15220 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65 73 74  x->idxNum, pBest
15230 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
15240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15250 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 77     if( pLevel->w
15260 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
15270 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
15280 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
15290 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
152a0 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 22  g, "%s ORDER BY"
152b0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
152c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
152d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
152e0 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65  xplain, i, pLeve
152f0 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73  l->iFrom, 0, zMs
15300 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
15310 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
15320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
15330 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49  AIN */.    pTabI
15340 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
15350 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
15360 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
15370 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
15380 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
15390 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
153a0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
153b0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
153c0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
153d0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
153e0 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
153f0 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
15400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15410 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15420 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  E.    if( pLevel
15430 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20  ->pBestIdx ){.  
15440 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
15450 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
15460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15470 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15480 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
15490 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
154a0 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
154b0 74 20 63 68 61 72 2a 29 70 54 61 62 2d 3e 70 56  t char*)pTab->pV
154c0 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  tab, P4_VTAB);. 
154d0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
154e0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
154f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15500 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
15510 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
15520 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
15530 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
15540 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
15550 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
15560 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
15570 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
15580 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
15590 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
155a0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
155b0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
155c0 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
155d0 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
155e0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
155f0 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
15600 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
15610 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
15620 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15630 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c  eChangeP2(v, sql
15640 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15650 64 64 72 28 76 29 2d 32 2c 20 6e 29 3b 0a 20 20  ddr(v)-2, n);.  
15660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
15670 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
15680 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
156a0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
156b0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
156c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
156d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
156e0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
156f0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
15700 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78 20 3d  ;.    if( (pIx =
15710 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d   pLevel->pIdx)!=
15720 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  0 ){.      KeyIn
15730 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
15740 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
15750 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
15760 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
15770 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
15780 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
15790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
157a0 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
157b0 6c 75 6d 6e 73 2c 20 30 2c 20 70 49 78 2d 3e 6e  lumns, 0, pIx->n
157c0 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 20  Column+1);.     
157d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157e0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
157f0 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  d, iIdxCur, pIx-
15800 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
15830 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
15840 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
15850 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
15860 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
15870 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15880 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
15890 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
158a0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
158b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
158c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
158d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
158e0 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
158f0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
15900 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
15910 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
15920 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
15930 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
15940 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
15950 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
15960 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
15970 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
15980 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  )0;.  for(i=0, p
15990 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
159a0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
159b0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
159c0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b  ){.    int j, k;
159d0 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20  .    int iCur = 
159e0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
159f0 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  r;  /* The VDBE 
15a00 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
15a10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65  able */.    Inde
15a20 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f  x *pIdx;       /
15a30 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77  * The index we w
15a40 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a  ill be using */.
15a50 20 20 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b      int addrNxt;
15a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
15a70 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
15a80 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
15a90 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
15aa0 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
15ab0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  ;       /* The V
15ac0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
15ad0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
15ae0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
15af0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
15b00 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
15b10 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  nly */.    int b
15b20 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Rev;          /*
15b30 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
15b40 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
15b50 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20  rse order */..  
15b60 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
15b70 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
15b80 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43  ->iFrom];.    iC
15b90 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
15ba0 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78  Cursor;.    pIdx
15bb0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
15bc0 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
15bd0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
15be0 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76      bRev = (pLev
15bf0 65 6c 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  el->wsFlags & WH
15c00 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
15c10 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  .    omitTable =
15c20 20 28 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67   (pLevel->wsFlag
15c30 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
15c40 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  LY)!=0;..    /* 
15c50 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
15c60 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
15c70 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
15c80 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  tructions.    **
15c90 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
15ca0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
15cb0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
15cc0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
15cd0 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63      ** Jump to c
15ce0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
15cf0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
15d00 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
15d10 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a  he.    ** loop..
15d20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68      **.    ** Wh
15d30 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
15d40 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
15d50 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
15d60 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
15d70 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20      ** means to 
15d80 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
15d90 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
15da0 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
15db0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  en.    ** there 
15dc0 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
15dd0 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
15de0 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
15df0 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 20 20  rNxt" label.    
15e00 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
15e10 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 20  s "addrBrk"..   
15e20 20 2a 2f 0a 20 20 20 20 61 64 64 72 42 72 6b 20   */.    addrBrk 
15e30 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
15e40 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
15e50 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
15e60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15e70 20 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c     addrCont = pL
15e80 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
15e90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15ea0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
15eb0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
15ec0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
15ed0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
15ee0 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
15ef0 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
15f00 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
15f10 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
15f20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
15f30 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
15f40 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
15f50 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
15f60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15f70 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
15f80 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
15f90 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
15fa0 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
15fb0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15fc0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
15fd0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
15fe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ff0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
16000 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
16010 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
16020 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
16030 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
16040 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a   flag"));.    }.
16050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16060 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16070 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  E.    if( pLevel
16080 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20  ->pBestIdx ){.  
16090 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20      /* Case 0:  
160a0 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
160b0 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
160c0 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
160d0 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 20 20 2a  nd VNext.      *
160e0 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
160f0 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
16100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
16110 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
16120 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
16130 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  lter */.      sq
16140 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
16150 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
16160 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
16170 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72       int nConstr
16180 61 69 6e 74 20 3d 20 70 42 65 73 74 49 64 78 2d  aint = pBestIdx-
16190 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
161a0 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
161b0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
161c0 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
161d0 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
16210 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
16220 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74  ;.      const st
16230 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
16240 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61  ex_constraint *a
16250 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20  Constraint =.   
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16290 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72  BestIdx->aConstr
162a0 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 69 52 65  aint;..      iRe
162b0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
162c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
162d0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
162e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
162f0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
16300 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
16310 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
16320 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  j++){.        fo
16330 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
16340 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
16350 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
16360 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
16370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16380 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
16390 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
163a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
163b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
163c0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
163d0 63 68 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  che );.         
163e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
163f0 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b  de(pParse, wc.a[
16400 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52  iTerm].pExpr->pR
16410 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b  ight, iReg+j+1);
16420 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
16430 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
16440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16450 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72    if( k==nConstr
16460 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
16470 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16480 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
16490 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20  bleColCache );. 
164a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
164b0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
164c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
164d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
164e0 74 65 67 65 72 2c 20 70 42 65 73 74 49 64 78 2d  teger, pBestIdx-
164f0 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  >idxNum, iReg);.
16500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16510 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
16520 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67  teger, j-1, iReg
16530 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
16540 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16550 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
16560 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c  , addrBrk, iReg,
16570 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74   pBestIdx->idxSt
16580 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
16590 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
165a0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
165b0 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e  dxStr ? P4_MPRIN
165c0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
165d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
165e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
165f0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
16600 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
16610 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e 65 65     pBestIdx->nee
16620 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
16630 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
16640 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
16650 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
16660 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69  f( aUsage[j].omi
16670 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
16680 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
16690 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f  traint[j].iTermO
166a0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
166b0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
166c0 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d  vel, &wc.a[iTerm
166d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
166e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
166f0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78  el->op = OP_VNex
16700 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
16710 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
16720 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
16730 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16740 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65  tAddr(v);.    }e
16750 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
16760 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16770 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69  LTABLE */..    i
16780 66 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61  f( pLevel->wsFla
16790 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
167a0 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
167b0 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
167c0 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
167d0 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
167e0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
167f0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
16800 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
16810 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
16820 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
16830 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
16840 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
16850 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
16860 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
16870 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
16880 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
16890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
168a0 74 20 72 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  t r1;.      int 
168b0 72 74 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65  rtmp = sqlite3Ge
168c0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
168d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
168e0 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
168f0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
16900 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
16910 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16920 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
16930 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
16940 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
16950 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
16960 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
16970 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
16980 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
16990 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
169a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
169b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
169c0 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a 20  pLevel, rtmp);. 
169d0 20 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70       addrNxt = p
169e0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
169f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16a00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
16a10 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 61 64 64  stBeInt, r1, add
16a20 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rNxt);.      sql
16a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16a40 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
16a50 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  iCur, addrNxt, r
16a60 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16a70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16a80 70 50 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a 20  pParse, rtmp);. 
16a90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16aa0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
16ab0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
16ac0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
16ad0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 77  se if( pLevel->w
16ae0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
16af0 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
16b00 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
16b10 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
16b20 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
16b30 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
16b40 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  ID field..      
16b50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
16b60 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
16b70 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
16b80 20 20 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64        int memEnd
16b90 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
16ba0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
16bb0 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
16bc0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
16bd0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
16be0 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
16bf0 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
16c00 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
16c10 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
16c20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
16c30 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
16c40 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
16c50 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
16c60 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
16c70 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
16c80 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53  tart;.        pS
16c90 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
16ca0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
16cb0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
16cc0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
16cd0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cf0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
16d00 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
16d10 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
16d20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
16d30 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Temp;        /* 
16d40 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f  Registers for ho
16d50 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  lding the start 
16d60 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20  boundary */..   
16d70 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
16d80 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
16d90 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
16da0 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
16db0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ng .        ** s
16dc0 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
16dd0 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
16de0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
16df0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
16e00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
16e10 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
16e20 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
16e30 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
16e40 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20  P_SeekGt,.      
16e50 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
16e60 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
16e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16e80 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
16e90 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Lt,.            
16ea0 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50   /* TK_GE */  OP
16eb0 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 20 20  _SeekGe.        
16ec0 7d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  };.        asser
16ed0 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
16ee0 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
16ef0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
16f00 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ing.. */.       
16f10 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
16f20 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
16f30 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
16f40 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
16f50 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
16f60 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
16f70 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
16f80 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
16f90 0a 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ..        pX = p
16fa0 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20  Start->pExpr;.  
16fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
16fc0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
16fd0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
16fe0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
16ff0 29 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  );.        r1 = 
17000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17010 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
17020 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
17030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17040 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
17050 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
17060 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
17070 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rk, r1);.       
17080 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17090 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20   "pk"));.       
170a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
170b0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
170c0 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
170d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
170e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
170f0 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
17100 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
17110 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
17120 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
17150 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
17160 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
17170 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 7d  ddrBrk);.      }
17180 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20  .      if( pEnd 
17190 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
171a0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20  *pX;.        pX 
171b0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
171c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
171d0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
171e0 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65  assert( pEnd->le
171f0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
17200 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 45 6e 64  ;.        memEnd
17210 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
17220 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
17230 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
17240 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
17250 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
17260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
17270 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
17280 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
17290 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
172a0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
172b0 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
172c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
172d0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
172e0 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
172f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17300 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
17310 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
17320 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
17330 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
17340 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17350 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
17360 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
17370 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
17380 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
17390 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
173a0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
173b0 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
173c0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
173d0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
173e0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
173f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
17400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17410 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
17420 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Cur, r1);.      
17430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17440 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
17450 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
17460 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
17470 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17480 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
17490 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
174a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
174b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
174c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
174d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
174e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
174f0 66 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61  f( pLevel->wsFla
17500 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
17510 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  MN_RANGE|WHERE_C
17520 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20  OLUMN_EQ) ){.   
17530 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20     /* Case 3: A 
17540 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
17550 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  dex..      **.  
17560 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
17570 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17580 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
17590 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
175a0 79 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  y .      **     
175b0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
175c0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
175d0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
175e0 20 74 68 65 20 4e 0a 20 20 20 20 20 20 2a 2a 20   the N.      ** 
175f0 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
17600 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
17610 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
17620 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
17630 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
17640 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17650 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
17660 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
17670 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  xed.      **    
17680 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
17690 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
176a0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
176b0 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
176c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
176d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
176e0 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
176f0 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
17700 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  est must.      *
17710 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
17720 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
17730 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
17740 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
17750 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
17760 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
17770 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
17780 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
17790 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 20 20   are all .      
177a0 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
177b0 69 7a 65 64 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  ized:.      **. 
177c0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
177d0 20 20 20 78 3d 35 0a 20 20 20 20 20 20 2a 2a 20     x=5.      ** 
177e0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
177f0 4e 44 20 79 3d 31 30 0a 20 20 20 20 20 20 2a 2a  ND y=10.      **
17800 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
17810 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 20 20 2a  AND y<10.      *
17820 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
17830 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
17840 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  0.      **      
17850 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
17860 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
17870 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
17880 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
17890 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
178a0 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
178b0 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 20 20  sed, only.      
178c0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
178d0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 20 20 2a  =5 term:.      *
178e0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
178f0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
17900 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  10.      **.    
17910 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
17920 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
17930 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
17940 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
17950 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
17960 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
17970 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
17980 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
17990 69 73 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 20  is at.      **  
179a0 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
179b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
179c0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
179d0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
179e0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
179f0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
17a00 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
17a10 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
17a20 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
17a30 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
17a40 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  in order.      *
17a50 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
17a60 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
17a70 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
17a80 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
17a90 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
17aa0 69 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d  int aStartOp[] =
17ab0 20 7b 0a 20 20 20 20 20 20 20 20 30 2c 0a 20 20   {.        0,.  
17ac0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
17ad0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
17ae0 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74        /* 2: (!st
17af0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
17b00 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21  && startEq &&  !
17b10 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
17b20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
17b30 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
17b40 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
17b50 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
17b60 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
17b70 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
17b80 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
17b90 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
17ba0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
17bb0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
17bc0 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
17bd0 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
17be0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
17bf0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
17c00 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
17c10 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
17c20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
17c30 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
17c40 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
17c50 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
17c60 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
17c70 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
17c80 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
17c90 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
17ca0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 7d  bRev) */.      }
17cb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 45 6e 64  ;.      int aEnd
17cc0 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
17cd0 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
17ce0 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
17cf0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
17d00 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78  /.        OP_Idx
17d10 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
17d20 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
17d30 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
17d40 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64  */.        OP_Id
17d50 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
17d60 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
17d70 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
17d80 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
17d90 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
17da0 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69  el->nEq;.      i
17db0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
17dc0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
17dd0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
17de0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
17df0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  n(x).. */.      
17e00 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
17e30 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
17e40 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
17e50 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e70 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
17e80 2f 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  /.      WhereTer
17e90 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
17ea0 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
17eb0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
17ec0 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
17ed0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
17ee0 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
17ef0 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
17f00 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
17f10 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
17f20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f40 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
17f50 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
17f60 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20  = or <= */.     
17f70 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f90 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
17fa0 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
17fb0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  r <= */.      in
17fc0 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
17fd0 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
17fe0 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
17ff0 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
18000 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72       int nConstr
18010 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
18020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
18030 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
18040 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  */.      int op;
18050 0a 0a 20 20 20 20 20 20 6b 20 3d 20 70 49 64 78  ..      k = pIdx
18060 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
18070 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66       /* Column f
18080 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  or inequality co
18090 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
180a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
180b0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
180c0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
180d0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
180e0 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
180f0 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
18100 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
18110 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
18120 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 20   registers.     
18130 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
18140 72 65 67 42 61 73 65 2e 0a 20 20 20 20 20 20 2a  regBase..      *
18150 2f 0a 20 20 20 20 20 20 72 65 67 42 61 73 65 20  /.      regBase 
18160 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
18170 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
18180 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52  Level, &wc, notR
18190 65 61 64 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  eady, 2);.      
181a0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
181b0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
181c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
181d0 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
181e0 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
181f0 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
18200 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 70   .      ** was p
18210 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
18220 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
18230 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
18240 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 20  n(x) ..." .     
18250 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
18260 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
18270 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
18280 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
18290 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
182a0 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
182b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
182c0 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
182d0 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  ed.      ** shou
182e0 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
182f0 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
18300 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
18310 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20 20 2a  n 'x' is.      *
18320 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
18330 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
18340 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
18350 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
18360 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 72  .      ** this r
18370 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
18380 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
18390 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
183a0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  ( (wctrlFlags&WH
183b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
183c0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
183d0 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67 73 26 57  Level->wsFlags&W
183e0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20  HERE_ORDERBY).  
183f0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
18400 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
18410 20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73    ){.        ass
18420 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
18430 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
18440 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
18450 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
18460 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
18470 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
18480 0a 20 20 20 20 20 20 20 20 69 73 4d 69 6e 51 75  .        isMinQu
18490 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ery = 1;.      }
184a0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  ..      /* Find 
184b0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
184c0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
184d0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
184e0 64 20 65 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  d end .      ** 
184f0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
18500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18510 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67  ( pLevel->wsFlag
18520 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
18530 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  MIT ){.        p
18540 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54  RangeEnd = findT
18550 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
18560 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
18570 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29  LT|WO_LE), pIdx)
18580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18590 69 66 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c  if( pLevel->wsFl
185a0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
185b0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
185c0 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
185d0 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
185e0 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
185f0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
18600 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
18610 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
18620 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
18630 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
18640 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
18650 65 78 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ex, or.      ** 
18660 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  a forward order 
18670 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e  scan on a descen
18680 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65  ding index, inte
18690 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20  rchange the .   
186a0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
186b0 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
186c0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
186d0 65 45 6e 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  eEnd)..      */.
186e0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d        if( bRev==
186f0 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65  (pIdx->aSortOrde
18700 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
18710 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20  O_ASC) ){.      
18720 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
18730 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
18740 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
18750 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
18760 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
18770 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
18780 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
18790 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
187a0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
187b0 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
187c0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
187d0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GE );.      te
187e0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
187f0 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
18800 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
18810 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
18820 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
18830 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
18840 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
18850 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
18860 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
18870 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
18880 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
18890 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20  E|WO_GE);.      
188a0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
188b0 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
188c0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
188d0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
188e0 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
188f0 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
18900 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
18910 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65       /* Seek the
18920 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
18930 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18940 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
18950 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
18960 6e 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nEq;.      if( p
18970 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
18980 20 20 20 20 20 20 69 6e 74 20 64 63 63 20 3d 20        int dcc = 
18990 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
189a0 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 20  olCache;.       
189b0 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
189c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  {.          pPar
189d0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
189e0 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  che++;.        }
189f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18a10 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
18a20 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
18a30 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
18a40 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
18a50 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 64 63 63  leColCache = dcc
18a60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18a70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18a80 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
18a90 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
18aa0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  .        nConstr
18ab0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  aint++;.      }e
18ac0 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
18ad0 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ry ){.        sq
18ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18af0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
18b00 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
18b10 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
18b20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72  ++;.        star
18b30 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tEq = 0;.       
18b40 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
18b50 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ts = 1;.      }.
18b60 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
18b70 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
18b80 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
18b90 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20 20 20  aint, pIdx);.   
18ba0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
18bb0 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
18bc0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
18bd0 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
18be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
18bf0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
18c00 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
18c10 77 69 6e 64 20 29 3b 0a 20 20 20 20 20 20 74 65  wind );.      te
18c20 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
18c30 61 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ast );.      tes
18c40 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
18c50 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 74 65  ekGt );.      te
18c60 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
18c70 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 20 20 74  eekGe );.      t
18c80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
18c90 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 20 20  SeekLe );.      
18ca0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
18cb0 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 20  _SeekLt );.     
18cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18cd0 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  p4(v, op, iIdxCu
18ce0 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
18cf0 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ase, .          
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18d10 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
18d20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34  nConstraint), P4
18d30 5f 49 4e 54 33 32 29 3b 0a 0a 20 20 20 20 20 20  _INT32);..      
18d40 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
18d50 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
18d60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
18d70 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18d80 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
18d90 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20   (if any)..     
18da0 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74   */.      nConst
18db0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
18dc0 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
18dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18de0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18df0 73 65 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  se, pRangeEnd->p
18e00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65  Expr->pRight, re
18e10 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
18e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18e30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
18e40 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
18e50 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
18e60 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
18e70 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
18e80 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64  Base, nEq+1, pId
18e90 78 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e  x);.        nCon
18ea0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
18eb0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 6f 70   }..      /* Top
18ec0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
18ed0 79 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65  y */.      pLeve
18ee0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
18ef0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18f00 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  );..      /* Che
18f10 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
18f20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
18f30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
18f40 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 6f 70  nge. */.      op
18f50 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67   = aEndOp[(pRang
18f60 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28  eEnd || nEq) * (
18f70 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20  1 + bRev)];.    
18f80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18f90 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 20  OP_Noop );.     
18fa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
18fb0 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20  P_IdxGE );.     
18fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
18fd0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20  P_IdxLT );.     
18fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ff0 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  p4(v, op, iIdxCu
19000 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
19010 61 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ase,.           
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
19030 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
19040 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f  Constraint), P4_
19050 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71  INT32);.      sq
19060 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19070 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76  5(v, endEq!=bRev
19080 20 3f 31 3a 30 29 3b 0a 0a 20 20 20 20 20 20 2f   ?1:0);..      /
19090 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
190a0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
190b0 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
190c0 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
190d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
190e0 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  e column that th
190f0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
19100 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55  trains is not NU
19110 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  LL..      ** If 
19120 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
19130 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
19140 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
19150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 31       */.      r1
19160 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19170 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19180 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
19190 65 76 65 6c 2d 3e 77 73 46 6c 61 67 73 20 26 20  evel->wsFlags & 
191a0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
191b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
191c0 65 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61  e( pLevel->wsFla
191d0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
191e0 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 69 66  IMIT );.      if
191f0 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67  ( pLevel->wsFlag
19200 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
19210 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
19220 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
19230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19240 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
19250 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
19260 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
19270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19280 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
19290 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20  addrCont);.     
192a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 65   }..      /* See
192b0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
192c0 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
192d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  */.      if( !om
192e0 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
192f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19300 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
19310 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 31  wid, iIdxCur, r1
19320 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19330 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19340 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72  OP_Seek, iCur, r
19350 31 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  1);  /* Deferred
19360 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d   seek */.      }
19370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19380 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19390 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 20  rse, r1);..     
193a0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
193b0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
193c0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
193d0 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
193e0 20 20 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63        ** WHERE c
193f0 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
19400 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
19410 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
19420 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
19430 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
19440 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
19450 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
19460 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
19470 78 43 75 72 3b 0a 20 20 20 20 20 20 64 69 73 61  xCur;.      disa
19480 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19490 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
194a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
194b0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
194c0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
194d0 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61 67  ( pLevel->wsFlag
194e0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
194f0 4f 52 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OR ){.      /* C
19500 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 4:  Two or m
19510 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
19520 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
19530 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
19540 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
19550 78 61 6d 70 6c 65 3a 0a 20 20 20 20 20 20 2a 2a  xample:.      **
19560 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
19570 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
19580 63 2c 64 29 3b 0a 20 20 20 20 20 20 2a 2a 20 20  c,d);.      **  
19590 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
195a0 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 20   ON t1(a);.     
195b0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
195c0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
195d0 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
195e0 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
195f0 28 63 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20  (c);.      **.  
19600 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
19610 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
19620 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
19630 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
19640 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19650 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
19660 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
19670 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
19680 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
19690 20 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20       ** The top 
196a0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 63  of the loop is c
196b0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 63 72  onstructed by cr
196c0 65 61 74 69 6e 67 20 61 20 52 6f 77 53 65 74 20  eating a RowSet 
196d0 6f 62 6a 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  object.      ** 
196e0 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  and populating i
196f0 74 2e 20 20 54 68 65 6e 20 6c 6f 6f 70 69 6e 67  t.  Then looping
19700 20 6f 76 65 72 20 65 6c 65 6d 65 6e 74 73 20 6f   over elements o
19710 66 20 74 68 65 20 72 6f 77 73 65 74 2e 0a 20 20  f the rowset..  
19720 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19730 20 20 20 20 20 20 20 4e 75 6c 6c 20 31 0a 20 20         Null 1.  
19740 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
19750 66 69 6c 6c 20 52 6f 77 53 65 74 20 31 20 77 69  fill RowSet 1 wi
19760 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
19770 20 61 3d 35 20 75 73 69 6e 67 20 69 31 0a 20 20   a=5 using i1.  
19780 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
19790 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69  fill Rowset 1 wi
197a0 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
197b0 20 62 3d 37 20 75 73 69 6e 67 20 69 32 0a 20 20   b=7 using i2.  
197c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
197d0 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69  fill Rowset 1 wi
197e0 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
197f0 20 63 3d 31 31 20 61 6e 64 20 64 3d 31 33 20 69   c=11 and d=13 i
19800 33 20 61 6e 64 20 74 31 0a 20 20 20 20 20 20 2a  3 and t1.      *
19810 2a 20 20 20 20 20 41 3a 20 52 6f 77 53 65 74 52  *     A: RowSetR
19820 65 61 64 20 31 2c 20 42 2c 20 32 0a 20 20 20 20  ead 1, B, 2.    
19830 20 20 2a 2a 20 20 20 20 20 20 20 20 53 65 65 6b    **        Seek
19840 20 20 20 20 20 20 20 69 2c 20 32 0a 20 20 20 20         i, 2.    
19850 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
19860 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
19870 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
19880 74 68 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  this:.      **. 
19890 20 20 20 20 20 2a 2a 20 20 20 20 20 43 3a 20 47       **     C: G
198a0 6f 74 6f 20 20 20 20 20 20 20 30 2c 20 41 0a 20  oto       0, A. 
198b0 20 20 20 20 20 2a 2a 20 20 20 20 20 42 3a 0a 20       **     B:. 
198c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
198d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  e{.      /* Case
198e0 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   5:  There is no
198f0 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
19900 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
19910 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20  plete.      **  
19920 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
19930 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
19940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19950 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
19960 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  le==0 );.      a
19970 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29  ssert( bRev==0 )
19980 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
19990 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
199a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
199b0 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
199c0 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
199d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
199e0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
199f0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
19a00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
19a10 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
19a20 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
19a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
19a40 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
19a50 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  (&maskSet, iCur)
19a60 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
19a70 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
19a80 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
19a90 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
19aa0 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20  mpletely.    ** 
19ab0 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
19ac0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
19ad0 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f  f tables..    */
19ae0 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
19af0 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
19b00 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  j=wc.nTerm; j>0;
19b10 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
19b20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
19b30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
19b50 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
19b60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19b70 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
19b80 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
19b90 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
19ba0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
19bb0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
19bc0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
19bd0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
19be0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
19bf0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
19c00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
19c10 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
19c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19c30 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  E!=0 );.      if
19c40 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
19c50 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
19c60 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
19c70 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
19c80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19c90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
19ca0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
19cb0 63 68 65 20 2b 3d 20 6b 3b 0a 20 20 20 20 20 20  che += k;.      
19cc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
19cd0 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
19ce0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
19cf0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
19d00 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
19d10 6c 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b 3b  leColCache -= k;
19d20 0a 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20  .      k = 1;.  
19d30 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19d40 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19d50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19d60 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
19d70 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
19d80 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
19d90 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
19da0 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
19db0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
19dc0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
19dd0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
19de0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
19df0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
19e00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
19e10 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  .      pLevel->a
19e20 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
19e30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19e40 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
19e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19e60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19e70 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
19e80 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
19e90 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
19ea0 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
19eb0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
19ec0 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e  3ExprClearColumn
19ed0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c  Cache(pParse, pL
19ee0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
19ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19f00 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68  rClearColumnCach
19f10 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  e(pParse, pLevel
19f20 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
19f30 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
19f40 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72  , j=0; j<wc.nTer
19f50 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
19f60 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
19f70 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
19f80 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
19f90 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  L );.        tes
19fa0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
19fb0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
19fc0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ED );.        if
19fd0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
19fe0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
19ff0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
1a000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a010 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1a020 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
1a030 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
1a040 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1a050 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
1a060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a070 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1a080 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
1a090 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
1a0a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1a0b0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
1a0c0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
1a0d0 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  CODED;.      }. 
1a0e0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1a0f0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a   SQLITE_TEST  /*
1a100 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   For testing and
1a110 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
1a120 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f  nly */.  /* Reco
1a130 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  rd in the query 
1a140 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  plan information
1a150 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65   about the curre
1a160 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e  nt table.  ** an
1a170 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  d the index used
1a180 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69   to access it (i
1a190 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20  f any).  If the 
1a1a0 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a  table itself.  *
1a1b0 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69  * is not used, i
1a1c0 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  ts name is just 
1a1d0 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64  '{}'.  If no ind
1a1e0 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  ex is used.  ** 
1a1f0 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73  the index is lis
1a200 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66  ted as "{}".  If
1a210 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
1a220 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a   is used the.  *
1a230 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20  * index name is 
1a240 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  '*'..  */.  for(
1a250 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1a260 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1a270 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e   char *z;.    in
1a280 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  t n;.    pLevel 
1a290 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
1a2a0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
1a2b0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
1a2c0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
1a2d0 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a   z = pTabItem->z
1a2e0 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a  Alias;.    if( z
1a2f0 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74  ==0 ) z = pTabIt
1a300 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  em->pTab->zName;
1a310 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
1a320 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
1a330 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
1a340 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
1a350 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b  uery_plan)-10 ){
1a360 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
1a370 6c 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  l->wsFlags & WHE
1a380 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_IDX_ONLY ){. 
1a390 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
1a3a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1a3b0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c  n[nQPlan], "{}",
1a3c0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   2);.        nQP
1a3d0 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  lan += 2;.      
1a3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1a3f0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
1a400 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
1a410 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ], z, n);.      
1a420 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
1a430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1a440 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1a450 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
1a460 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1a470 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 77 73 46  ase( pLevel->wsF
1a480 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
1a490 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73  ID_EQ );.    tes
1a4a0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 77  tcase( pLevel->w
1a4b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
1a4c0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
1a4d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 77 73    if( pLevel->ws
1a4e0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  Flags & (WHERE_R
1a4f0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
1a500 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
1a510 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
1a520 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1a530 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29  QPlan], "* ", 2)
1a540 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
1a550 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
1a560 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d  f( pLevel->pIdx=
1a570 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 ){.      memc
1a580 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
1a590 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
1a5a0 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20  "{} ", 3);.     
1a5b0 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20   nQPlan += 3;.  
1a5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1a5d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1a5e0 33 30 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  30(pLevel->pIdx-
1a5f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
1a600 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
1a610 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
1a620 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
1a630 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
1a640 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1a650 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
1a660 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e  ->pIdx->zName, n
1a670 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
1a680 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  n += n;.        
1a690 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
1a6a0 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
1a6b0 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ';.      }.    
1a6c0 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  }.  }.  while( n
1a6d0 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74  QPlan>0 && sqlit
1a6e0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1a6f0 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a  Plan-1]==' ' ){.
1a700 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
1a710 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d  y_plan[--nQPlan]
1a720 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1a730 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1a740 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51  QPlan] = 0;.  nQ
1a750 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Plan = 0;.#endif
1a760 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
1a770 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64  // Testing and d
1a780 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1a790 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  y */..  /* Recor
1a7a0 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  d the continuati
1a7b0 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  on address in th
1a7c0 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
1a7d0 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a  cture.  Then.  *
1a7e0 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * clean up and r
1a7f0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57  eturn..  */.  pW
1a800 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
1a810 3d 20 61 64 64 72 43 6f 6e 74 3b 0a 20 20 77 68  = addrCont;.  wh
1a820 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
1a830 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  wc);.  return pW
1a840 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
1a850 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
1a860 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
1a870 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72  ginError:.  wher
1a880 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
1a890 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  );.  whereInfoFr
1a8a0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
1a8b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1a8c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
1a8d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
1a8e0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
1a8f0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
1a900 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1a910 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
1a920 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
1a930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
1a940 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
1a950 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
1a960 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
1a970 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
1a980 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1a990 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1a9a0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a9b0 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
1a9c0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
1a9d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
1a9e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a9f0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1aa00 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
1aa10 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
1aa20 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
1aa30 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63  prClearColumnCac
1aa40 68 65 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a  he(pParse, -1);.
1aa50 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74    for(i=pTabList
1aa60 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20  ->nSrc-1; i>=0; 
1aa70 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
1aa80 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
1aa90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aaa0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1aab0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
1aac0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
1aad0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
1aae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aaf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
1ab00 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
1ab10 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
1ab20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ab30 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1ab40 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
1ab50 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
1ab60 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  l->nIn ){.      
1ab70 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
1ab80 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
1ab90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aba0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1abb0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
1abc0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
1abd0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e  pLevel->nIn, pIn
1abe0 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  =&pLevel->aInLoo
1abf0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
1ac00 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
1ac10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ac20 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
1ac30 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
1ac40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ac50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1ac60 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
1ac70 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
1ac80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ac90 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1aca0 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
1acb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1acc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1acd0 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
1ace0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1acf0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ad00 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
1ad10 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
1ad20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1ad30 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
1ad40 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
1ad50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ad60 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
1ad70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1ad80 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oin);.      sqli
1ad90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1ada0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
1adb0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
1adc0 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
1add0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
1ade0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1adf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1ae00 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
1ae10 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
1ae20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1ae30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ae40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1ae50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
1ae60 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1ae70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1ae80 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
1ae90 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
1aea0 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
1aeb0 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
1aec0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
1aed0 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
1aee0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
1aef0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1af00 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
1af10 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
1af20 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
1af30 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
1af40 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
1af50 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
1af60 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
1af70 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
1af80 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1af90 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
1afa0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1afb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1afc0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1afd0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1afe0 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
1aff0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
1b000 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
1b010 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
1b020 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
1b030 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1b040 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
1b050 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
1b060 75 65 3b 0a 20 20 20 20 69 66 28 20 21 70 57 49  ue;.    if( !pWI
1b070 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
1b080 26 20 28 70 4c 65 76 65 6c 2d 3e 77 73 46 6c 61  & (pLevel->wsFla
1b090 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1b0a0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
1b0b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b0c0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
1b0d0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1b0e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
1b0f0 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d  ( pLevel->pIdx!=
1b100 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1b110 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1b120 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
1b130 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
1b140 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1b150 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
1b160 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
1b170 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
1b180 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
1b190 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
1b1a0 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
1b1b0 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
1b1c0 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
1b1d0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
1b1e0 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
1b1f0 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
1b200 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
1b210 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
1b220 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
1b230 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
1b240 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
1b250 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
1b260 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
1b270 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
1b280 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
1b290 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1b2a0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
1b2b0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
1b2c0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
1b2d0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
1b2e0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
1b2f0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
1b300 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1b310 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
1b320 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
1b330 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
1b340 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
1b350 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
1b360 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
1b370 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
1b380 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
1b390 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
1b3a0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
1b3b0 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
1b3c0 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
1b3d0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
1b3e0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
1b3f0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
1b400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b410 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b   pLevel->pIdx ){
1b420 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
1b430 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
1b440 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
1b450 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
1b460 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
1b470 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e    int useIndexOn
1b480 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 77 73 46  ly = pLevel->wsF
1b490 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1b4a0 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73  _ONLY;..      as
1b4b0 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
1b4c0 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
1b4d0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
1b4e0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
1b4f0 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
1b500 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1b510 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
1b520 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
1b530 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
1b540 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
1b550 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
1b560 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
1b570 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1b580 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1b590 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
1b5a0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1b5b0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1b5c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1b5d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
1b5e0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
1b5f0 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
1b600 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
1b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b620 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
1b630 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
1b640 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b650 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b670 20 20 20 61 73 73 65 72 74 28 21 75 73 65 49 6e     assert(!useIn
1b680 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64  dexOnly || j<pId
1b690 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  x->nColumn);.   
1b6a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b6b0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
1b6c0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
1b6d0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
1b6e0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
1b6f0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
1b700 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
1b710 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b720 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1b730 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75  =OP_NullRow && u
1b740 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20  seIndexOnly ){. 
1b750 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
1b760 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
1b770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b780 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b790 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
1b7a0 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f    */.  whereInfo
1b7b0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
1b7c0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.