/ Hex Artifact Content
Login

Artifact ac555c8f6ef71a80944b31dcb212f7127c9ae30c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 37  : where.c,v 1.37
0340: 34 20 32 30 30 39 2f 30 33 2f 30 35 20 30 33 3a  4 2009/03/05 03:
0350: 34 38 3a 30 37 20 73 68 61 6e 65 20 45 78 70 20  48:07 shane Exp 
0360: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0370: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  qliteInt.h"../*.
0380: 2a 2a 20 54 72 61 63 65 20 6f 75 74 70 75 74 20  ** Trace output 
0390: 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65  macros.*/.#if de
03a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03b0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
03c0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 69 6e 74 20  LITE_DEBUG).int 
03d0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
03e0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  e = 0;.#endif.#i
03f0: 66 20 30 0a 23 20 64 65 66 69 6e 65 20 57 48 45  f 0.# define WHE
0400: 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28 73  RETRACE(X)  if(s
0410: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
0420: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0430: 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64  intf X.#else.# d
0440: 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43 45  efine WHERETRACE
0450: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  (X).#endif../* F
0460: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
0470: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0480: 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 57  ct WhereClause W
0490: 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70 65  hereClause;.type
04a0: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
04b0: 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61 73  MaskSet WhereMas
04c0: 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73 74  kSet;.typedef st
04d0: 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f  ruct WhereOrInfo
04e0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74 79   WhereOrInfo;.ty
04f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0500: 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65 41  reAndInfo WhereA
0510: 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66 20  ndInfo;.typedef 
0520: 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73 74  struct WhereCost
0530: 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a   WhereCost;../*.
0540: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e  ** The query gen
0550: 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61  erator uses an a
0560: 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65  rray of instance
0570: 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  s of this struct
0580: 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69  ure to.** help i
0590: 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75  t analyze the su
05a0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20  bexpressions of 
05b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05c0: 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a  .  Each WHERE.**
05d0: 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65   clause subexpre
05e0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
05f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ed from the othe
0600: 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74  rs by AND operat
0610: 6f 72 73 2e 0a 2a 2a 20 28 4e 6f 74 65 3a 20 74  ors..** (Note: t
0620: 68 65 20 73 61 6d 65 20 64 61 74 61 20 73 74 72  he same data str
0630: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 72  ucture is also r
0640: 65 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20  eused to hold a 
0650: 67 72 6f 75 70 20 6f 66 20 74 65 72 6d 73 0a 2a  group of terms.*
0660: 2a 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  * separated by O
0670: 52 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 42 75  R operators.  Bu
0680: 74 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  t at the top-lev
0690: 65 6c 2c 20 65 76 65 72 79 74 68 69 6e 67 20 69  el, everything i
06a0: 73 20 41 4e 44 0a 2a 2a 20 73 65 70 61 72 61 74  s AND.** separat
06b0: 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57  ed.).**.** All W
06c0: 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f  hereTerms are co
06d0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73  llected into a s
06e0: 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73  ingle WhereClaus
06f0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a  e structure.  .*
0700: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0710: 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a  identity holds:.
0720: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65  **.**        Whe
0730: 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68  reTerm.pWC->a[Wh
0740: 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20  ereTerm.idx] == 
0750: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20  WhereTerm.**.** 
0760: 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f  When a term is o
0770: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
0780: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58  *              X
0790: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a   <op> <expr>.**.
07a0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
07b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20  column name and 
07c0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63  <op> is one of c
07d0: 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73  ertain operators
07e0: 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54  ,.** then WhereT
07f0: 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61  erm.leftCursor a
0800: 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c  nd WhereTerm.u.l
0810: 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64  eftColumn record
0820: 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e   the.** cursor n
0830: 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e  umber and column
0840: 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20   number for X.  
0850: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
0860: 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  tor records.** t
0870: 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20  he <op> using a 
0880: 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67  bitmask encoding
0890: 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78   defined by WO_x
08a0: 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a  xx below.  The.*
08b0: 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61  * use of a bitma
08c0: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  sk encoding for 
08d0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c  the operator all
08e0: 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63 68  ows us to search
08f0: 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20  .** quickly for 
0900: 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68  terms that match
0910: 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20   any of several 
0920: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
0930: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65  ors..**.** A Whe
0940: 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73  reTerm might als
0950: 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  o be two or more
0960: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
0970: 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a  ted by OR:.**.**
0980: 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c           (t1.X <
0990: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28  op> <expr>) OR (
09a0: 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  t1.Y <op> <expr>
09b0: 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  ) OR .....**.** 
09c0: 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63  In this second c
09d0: 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74  ase, wtFlag as t
09e0: 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73  he TERM_ORINFO s
09f0: 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72  et and eOperator
0a00: 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74  ==WO_OR.** and t
0a10: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
0a20: 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69  OrInfo field poi
0a30: 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79  nts to auxiliary
0a40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
0a50: 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65  t.** is collecte
0a60: 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a  d about the.**.*
0a70: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74  * If a term in t
0a80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0a90: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65  does not match e
0aa0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
0ab0: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74   previous.** cat
0ac0: 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f  egories, then eO
0ad0: 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65  perator==0.  The
0ae0: 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72   WhereTerm.pExpr
0af0: 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20   field is still 
0b00: 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72  set.** to the or
0b10: 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73  iginal subexpres
0b20: 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64  sion content and
0b30: 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74 20   wtFlags is set 
0b40: 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  up appropriately
0b50: 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72  .** but no other
0b60: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57   fields in the W
0b70: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
0b80: 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a  are meaningful..
0b90: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72  **.** When eOper
0ba0: 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52  ator!=0, prereqR
0bb0: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
0bc0: 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f  ll record sets o
0bd0: 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  f cursor numbers
0be0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f  ,.** but they do
0bf0: 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   so indirectly. 
0c00: 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d   A single WhereM
0c10: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
0c20: 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63   translates.** c
0c30: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74  ursor number int
0c40: 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74  o bits and the t
0c50: 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73  ranslated bit is
0c60: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
0c70: 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e  rereq.** fields.
0c80: 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f    The translatio
0c90: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64  n is used in ord
0ca0: 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74  er to maximize t
0cb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
0cc0: 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66  bits that will f
0cd0: 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  it in a Bitmask.
0ce0: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
0cf0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
0d00: 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74  be.** spread out
0d10: 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65   over the non-ne
0d20: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e  gative integers.
0d30: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
0d40: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  he cursor.** num
0d50: 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c  bers might be 3,
0d60: 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32   8, 9, 10, 20, 2
0d70: 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20  3, 41, and 45.  
0d80: 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  The WhereMaskSet
0d90: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74  .** translates t
0da0: 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72 73  hese sparse curs
0db0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
0dc0: 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65  consecutive inte
0dd0: 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e  gers.** beginnin
0de0: 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65  g with 0 in orde
0df0: 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65  r to make the be
0e00: 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20  st possible use 
0e10: 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  of the available
0e20: 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20  .** bits in the 
0e30: 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e  Bitmask.  So, in
0e40: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
0e50: 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ve, the cursor n
0e60: 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20  umbers.** would 
0e70: 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69  be mapped into i
0e80: 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75 67  ntegers 0 throug
0e90: 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  h 7..**.** The n
0ea0: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
0eb0: 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69  n a join is limi
0ec0: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
0ed0: 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20  r of bits.** in 
0ee0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
0ef0: 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20  prereqAll.  The 
0f00: 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62 69  default is 64 bi
0f10: 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65  ts, hence SQLite
0f20: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65  .** is only able
0f30: 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e   to process join
0f40: 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65 77  s with 64 or few
0f50: 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79  er tables..*/.ty
0f60: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0f70: 72 65 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d  reTerm WhereTerm
0f80: 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65 54 65  ;.struct WhereTe
0f90: 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm {.  Expr *pEx
0fa0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr;            /
0fb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
0fc0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
0fd0: 68 61 74 20 69 73 20 74 68 69 73 20 74 65 72 6d  hat is this term
0fe0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
0ff0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1000: 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b   Disable pWC->a[
1010: 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68  iParent] when th
1020: 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64  is term disabled
1030: 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75   */.  int leftCu
1040: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rsor;         /*
1050: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
1060: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1070: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f  expr>" */.  unio
1080: 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74  n {.    int left
1090: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
10a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
10b0: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
10c0: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20   <expr>" */.    
10d0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
10e0: 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61  Info;   /* Extra
10f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20   information if 
1100: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
1110: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64   */.    WhereAnd
1120: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20  Info *pAndInfo; 
1130: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61  /* Extra informa
1140: 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f  tion if eOperato
1150: 72 3d 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d  r==WO_AND */.  }
1160: 20 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61   u;.  u16 eOpera
1170: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
1180: 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64   A WO_xx value d
1190: 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a  escribing <op> *
11a0: 2f 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20  /.  u8 wtFlags; 
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c0: 45 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67  ERM_xxx bit flag
11d0: 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f  s.  See below */
11e0: 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20  .  u8 nChild;   
11f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1200: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e  mber of children
1210: 20 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62   that must disab
1220: 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65  le us */.  Where
1230: 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
1240: 20 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65     /* The clause
1250: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1260: 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61  rt of */.  Bitma
1270: 73 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20  sk prereqRight; 
1280: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
1290: 20 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20   tables used by 
12a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f  pExpr->pRight */
12b0: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
12c0: 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69  qAll;      /* Bi
12d0: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
12e0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 45  referenced by pE
12f0: 78 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  xpr */.};../*.**
1300: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
1310: 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46  of WhereTerm.wtF
1320: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1330: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20  TERM_DYNAMIC    
1340: 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74  0x01   /* Need t
1350: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  o call sqlite3Ex
1360: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1370: 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  pr) */.#define T
1380: 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30  ERM_VIRTUAL    0
1390: 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62  x02   /* Added b
13a0: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
13b0: 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f    Do not code */
13c0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f  .#define TERM_CO
13d0: 44 45 44 20 20 20 20 20 20 30 78 30 34 20 20 20  DED      0x04   
13e0: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  /* This term is 
13f0: 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f  already coded */
1400: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f  .#define TERM_CO
1410: 50 49 45 44 20 20 20 20 20 30 78 30 38 20 20 20  PIED     0x08   
1420: 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a  /* Has a child *
1430: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f  /.#define TERM_O
1440: 52 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20  RINFO     0x10  
1450: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65   /* Need to free
1460: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
1470: 2e 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20  .pOrInfo object 
1480: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
1490: 41 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20  ANDINFO    0x20 
14a0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65    /* Need to fre
14b0: 65 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  e the WhereTerm.
14c0: 75 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a  u.pAndInfo obj *
14d0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f  /.#define TERM_O
14e0: 52 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20  R_OK      0x40  
14f0: 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20   /* Used during 
1500: 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR-clause proces
1510: 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sing */../*.** A
1520: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1530: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1540: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
1550: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1560: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
1570: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
1580: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1590: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
15a0: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a   WhereTerms..*/.
15b0: 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75  struct WhereClau
15c0: 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  se {.  Parse *pP
15d0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
15e0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
15f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1600: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
1610: 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f  t;  /* Mapping o
1620: 66 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  f table cursor n
1630: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
1640: 6b 73 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20  ks */.  u8 op;  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74   /* Split operat
1670: 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54  or.  TK_AND or T
1680: 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  K_OR */.  int nT
1690: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16b0: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  terms */.  int n
16c0: 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Slot;           
16d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20   entries in a[] 
16f0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1700: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a;            /*
1710: 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69   Each a[] descri
1720: 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  bes a term of th
1730: 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a  e WHERE cluase *
1740: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53  /.  WhereTerm aS
1750: 74 61 74 69 63 5b 34 5d 3b 20 20 20 20 2f 2a 20  tatic[4];    /* 
1760: 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73  Initial static s
1770: 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a  pace for a[] */.
1780: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1790: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17a0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17b0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
17c0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
17d0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
17e0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
17f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1800: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1810: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1820: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1830: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1840: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1850: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1860: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1870: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1880: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1890: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18a0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18b0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
18c0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
18d0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
18e0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
18f0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1900: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1910: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1920: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1930: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1940: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1950: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1960: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1970: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1980: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1990: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19a0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
19c0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
19d0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
19e0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
19f0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a00: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a10: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a20: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a30: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a40: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a50: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1a60: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1a70: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1a80: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1a90: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1aa0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1ab0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1ac0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1ad0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1ae0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1af0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b00: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b10: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b20: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b30: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b40: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b50: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1b60: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1b70: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1b80: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1b90: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1ba0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bb0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1bc0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1be0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1bf0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c00: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c10: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c20: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c30: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c50: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1c60: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1c70: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1c80: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1c90: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ca0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cb0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1cc0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1cd0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1ce0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1cf0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d00: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d10: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d20: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d30: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d40: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d50: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1d60: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1d70: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1d80: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1d90: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1da0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1db0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1dc0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1dd0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1de0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1df0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e00: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e20: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e30: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e40: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e50: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1e60: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1e70: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1e80: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1e90: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ea0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1ed0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1ee0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1ef0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f10: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f20: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f30: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f40: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f50: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1f60: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1f70: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1f80: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1f90: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fa0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1fb0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
1fc0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
1fd0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
1fe0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
1ff0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2000: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2010: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2020: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  y */.  double nR
2030: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2040: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2050: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
2060: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
2070: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
2080: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
2090: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
20a0: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
20b0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
20c0: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
20d0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
20e0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
20f0: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
2100: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
2110: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
2120: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
2130: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
2140: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
2150: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
2160: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2170: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2180: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2190: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
21a0: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
21b0: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
21c0: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
21d0: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
21e0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
21f0: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
2200: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
2210: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
2220: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
2230: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
2240: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
2250: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
2260: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
2270: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2280: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2290: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
22a0: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
22b0: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
22c0: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
22d0: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
22e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47  .#define WO_SING
22f0: 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f  LE 0x0ff       /
2300: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f  * Mask of all no
2310: 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20  n-compound WO_* 
2320: 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  values */../*.**
2330: 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61   Value for wsFla
2340: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
2350: 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73  estIndex() and s
2360: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72  tored in.** Wher
2370: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20  eLevel.wsFlags. 
2380: 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74   These flags det
2390: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61  ermine which sea
23a0: 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65  rch.** strategie
23b0: 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
23c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61  e..**.** The lea
23d0: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
23e0: 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76  2 bits is reserv
23f0: 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72  ed as a mask for
2400: 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76   WO_ values abov
2410: 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c  e..** The WhereL
2420: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2430: 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65  ld is usually se
2440: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
2450: 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42  |WO_ISNULL..** B
2460: 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ut if the table 
2470: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
2480: 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  le of a left joi
2490: 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  n, WhereLevel.ws
24a0: 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  Flags.** is set 
24b0: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
24c0: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
24d0: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61  wsFlags field ca
24e0: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
24f0: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
2500: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
2510: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
2520: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
2530: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
2540: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
2550: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
2560: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
2570: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2580: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
2590: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
25a0: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
25b0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
25c0: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30  ID_EQ     0x0000
25d0: 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45  1000  /* rowid=E
25e0: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
25f0: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
2600: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2610: 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20  GE  0x00002000  
2620: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
2630: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
2640: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2650: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
2660: 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45  00010000  /* x=E
2670: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
2680: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
2690: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
26a0: 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78  0x00020000  /* x
26b0: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45  <EXPR and/or x>E
26c0: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
26d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20  HERE_COLUMN_IN  
26e0: 20 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a    0x00040000  /*
26f0: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
2700: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44  define WHERE_IND
2710: 45 58 45 44 20 20 20 20 20 20 30 78 30 30 30 37  EXED      0x0007
2720: 30 30 30 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e  0000  /* Anythin
2730: 67 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  g that uses an i
2740: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
2750: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20  WHERE_IN_ABLE   
2760: 20 20 20 30 78 30 30 30 37 31 30 30 30 20 20 2f     0x00071000  /
2770: 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72  * Able to suppor
2780: 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  t an IN operator
2790: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
27a0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30  E_TOP_LIMIT    0
27b0: 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c  x00100000  /* x<
27c0: 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20  EXPR or x<=EXPR 
27d0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
27e0: 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f  efine WHERE_BTM_
27f0: 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30 30  LIMIT    0x00200
2800: 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f  000  /* x>EXPR o
2810: 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x>=EXPR constr
2820: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
2830: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
2840: 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20 2f     0x00800000  /
2850: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
2860: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
2870: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f  .#define WHERE_O
2880: 52 44 45 52 42 59 20 20 20 20 20 20 30 78 30 31  RDERBY      0x01
2890: 30 30 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75  000000  /* Outpu
28a0: 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  t will appear in
28b0: 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a   correct order *
28c0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28d0: 52 45 56 45 52 53 45 20 20 20 20 20 20 30 78 30  REVERSE      0x0
28e0: 32 30 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e  2000000  /* Scan
28f0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2900: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2910: 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20  RE_UNIQUE       
2920: 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53  0x04000000  /* S
2930: 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74  elects no more t
2940: 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23  han one row */.#
2950: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52  define WHERE_VIR
2960: 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30  TUALTABLE 0x0800
2970: 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72  0000  /* Use vir
2980: 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65  tual-table proce
2990: 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65  ssing */.#define
29a0: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
29b0: 20 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20      0x10000000  
29c0: 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74  /* OR using mult
29d0: 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a  iple indices */.
29e0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
29f0: 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  e a preallocated
2a00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2a10: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2a20: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2a30: 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43  seInit(.  WhereC
2a40: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
2a50: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43     /* The WhereC
2a60: 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74  lause to be init
2a70: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72  ialized */.  Par
2a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2a90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2aa0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2ab0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
2ac0: 70 4d 61 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61  pMaskSet   /* Ma
2ad0: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
2ae0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
2af0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29  to bitmasks */.)
2b00: 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65 20  {.  pWC->pParse 
2b10: 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43 2d  = pParse;.  pWC-
2b20: 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61 73  >pMaskSet = pMas
2b30: 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65  kSet;.  pWC->nTe
2b40: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
2b50: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
2b60: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
2b70: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
2b80: 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46  aStatic;.}../* F
2b90: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2ba0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2bb0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2bc0: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
2bd0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2be0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
2bf0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
2c00: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
2c10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2c20: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
2c30: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2c40: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
2c50: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
2c60: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
2c70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2c80: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
2c90: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
2ca0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
2cb0: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
2cc0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
2cd0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2ce0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
2cf0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
2d00: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
2d10: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2d20: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
2d30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
2d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
2d50: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
2d60: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
2d70: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
2d80: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
2d90: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
2da0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2db0: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
2dc0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
2dd0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2de0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
2df0: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
2e00: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
2e10: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
2e20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2e30: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
2e40: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
2e50: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
2e60: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
2e70: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
2e80: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
2e90: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
2ea0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
2eb0: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
2ec0: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
2ed0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
2ee0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
2ef0: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
2f00: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
2f10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2f20: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
2f30: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
2f40: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
2f50: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
2f60: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
2f70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
2f80: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
2f90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2fa0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
2fb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2fc0: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
2fd0: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
2fe0: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
2ff0: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3000: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
3010: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
3020: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
3030: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
3040: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
3050: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
3060: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
3070: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
3080: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
3090: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
30a0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
30b0: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
30c0: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
30d0: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
30e0: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
30f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3100: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
3110: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
3120: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
3130: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
3140: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
3150: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
3160: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
3170: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
3180: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
3190: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
31a0: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
31b0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
31c0: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
31d0: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
31e0: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
31f0: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
3200: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
3210: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
3220: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
3230: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
3240: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
3250: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
3260: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
3270: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
3280: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
3290: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
32a0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
32b0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
32c0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
32d0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
32e0: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
32f0: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
3300: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
3310: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
3320: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
3330: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
3340: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
3350: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
3360: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
3370: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
3380: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3390: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
33a0: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
33b0: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
33c0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
33d0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
33e0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20   int idx;.  if( 
33f0: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
3400: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
3410: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
3420: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
3430: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
3440: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
3450: 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  WC->a = sqlite3D
3460: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
3470: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3480: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
3490: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
34a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
34b0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
34c0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
34d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
34e0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
34f0: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
3500: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
3510: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
3520: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
3530: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
3540: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
3550: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
3560: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
3570: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
3580: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c  e3DbFree(db, pOl
3590: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
35a0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74  C->nSlot = sqlit
35b0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
35c0: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f  b, pWC->a)/sizeo
35d0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20  f(pWC->a[0]);.  
35e0: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
35f0: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
3600: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d  Term++];.  pTerm
3610: 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70  ->pExpr = p;.  p
3620: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20  Term->wtFlags = 
3630: 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d  wtFlags;.  pTerm
3640: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
3650: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
3660: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  -1;.  return idx
3670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3680: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
3690: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
36a0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
36b0: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
36c0: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
36d0: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
36e0: 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  y the AND operat
36f0: 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  or or some other
3700: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65  .** operator spe
3710: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70  cified in the op
3720: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65   parameter.  The
3730: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
3740: 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c  ucture.** is fil
3750: 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72  led with pointer
3760: 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  s to subexpressi
3770: 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ons.  For exampl
3780: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52  e:.**.**    WHER
3790: 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e  E  a=='hello' AN
37a0: 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29  D coalesce(b,11)
37b0: 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64  <10 AND (c+12!=d
37c0: 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20   OR c==22).**   
37d0: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
37e0: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
37f0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3800: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
3810: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  **            sl
3820: 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  ot[0]           
3830: 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20   slot[1]        
3840: 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a         slot[2].*
3850: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3860: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
3870: 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74  n pExpr is unalt
3880: 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20  ered.  All this 
3890: 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
38a0: 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65  is make slot[] e
38b0: 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20  ntries point to 
38c0: 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74  substructure wit
38d0: 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a  hin pExpr..**.**
38e0: 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   In the previous
38f0: 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e   sentence and in
3900: 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73   the diagram, "s
3910: 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f  lot[]" refers to
3920: 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61  .** the WhereCla
3930: 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20  use.a[] array.  
3940: 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79  The slot[] array
3950: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
3960: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
3970: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
3980: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
3990: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
39a0: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
39b0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
39c0: 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a  pExpr, int op){.
39d0: 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29    pWC->op = (u8)
39e0: 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  op;.  if( pExpr=
39f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
3a00: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  f( pExpr->op!=op
3a10: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
3a20: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
3a30: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Expr, 0);.  }els
3a40: 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  e{.    whereSpli
3a50: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c  t(pWC, pExpr->pL
3a60: 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68  eft, op);.    wh
3a70: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
3a80: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29  xpr->pRight, op)
3a90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
3aa0: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70  nitialize an exp
3ab0: 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
3ac0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
3ad0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
3ae0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
3af0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
3b00: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
3b10: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
3b20: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
3b30: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
3b40: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
3b50: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
3b60: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
3b70: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
3b80: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
3b90: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
3ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
3bb0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
3bc0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
3bd0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
3be0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
3bf0: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
3c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3c10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3c20: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
3c30: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
3c40: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
3c50: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
3c60: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
3c70: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
3c80: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
3c90: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
3ca0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
3cb0: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
3cc0: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
3cd0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
3ce0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
3cf0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
3d00: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
3d10: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
3d20: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
3d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
3d40: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
3d50: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
3d60: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
3d70: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
3d80: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
3d90: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
3da0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
3db0: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
3dc0: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
3dd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3de0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
3df0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
3e00: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
3e10: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
3e20: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
3e30: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
3e40: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
3e50: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
3e60: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
3e70: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
3e80: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
3e90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
3ea0: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
3eb0: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
3ec0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
3ed0: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
3ee0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
3ef0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
3f00: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
3f10: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
3f20: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
3f30: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
3f40: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
3f50: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
3f60: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
3f70: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
3f80: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
3f90: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
3fa0: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
3fb0: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
3fc0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
3fd0: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
3fe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3ff0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
4000: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
4010: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
4020: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
4030: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
4040: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
4050: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
4060: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4070: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4080: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
4090: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
40a0: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
40b0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
40c0: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
40d0: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
40e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
40f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4100: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
4110: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4120: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
4130: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4140: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
4150: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
4160: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
4170: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
4180: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
4190: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
41a0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
41b0: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
41c0: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
41d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
41e0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
41f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4200: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
4210: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
4220: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
4230: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4240: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
4250: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
4260: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4270: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4280: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
4290: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
42a0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
42b0: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
42c0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
42d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
42e0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
42f0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
4300: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
4310: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
4320: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4330: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
4340: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
4350: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4360: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
4370: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
4380: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4390: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
43a0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
43b0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
43c0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
43d0: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
43e0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
43f0: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
4400: 70 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  pS ){.    mask |
4410: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4420: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4430: 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  S->pEList);.    
4440: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4450: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4460: 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  Set, pS->pGroupB
4470: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4480: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4490: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
44a0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
44b0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
44c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
44d0: 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   pS->pWhere);.  
44e0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
44f0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4500: 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b  t, pS->pHaving);
4510: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
4520: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
4530: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
4540: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
4550: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
4560: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
4570: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
4580: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
4590: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
45a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
45b0: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
45c0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
45d0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
45e0: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20  "<=", ">=", and 
45f0: 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "IN"..*/.static 
4600: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
4610: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
4620: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
4630: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
4640: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
4650: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
4660: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4670: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
4680: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
4690: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
46a0: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
46b0: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
46c0: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
46d0: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
46e0: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
46f0: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
4700: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
4710: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
4720: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
4730: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
4740: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
4750: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
4760: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
4770: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
4780: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
4790: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
47a0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
47b0: 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  * If a collation
47c0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73   sequence is ass
47d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74  ociated with eit
47e0: 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20  her the left or 
47f0: 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66  right.** side of
4800: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c   the comparison,
4810: 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f   it remains asso
4820: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4830: 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a  same side after.
4840: 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69  ** the commutati
4850: 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74  on. So "Y collat
4860: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
4870: 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f  ecomes .** "X co
4880: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
4890: 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  Y". This is beca
48a0: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
48b0: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
48c0: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
48d0: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
48e0: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
48f0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
4900: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
4910: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
4920: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
4930: 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f  son the EP_ExpCo
4940: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
4950: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
4960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
4970: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
4980: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4990: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
49a0: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
49b0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
49c0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a  EP_ExpCollate);.
49d0: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
49e0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
49f0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4a00: 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  late);.  assert(
4a10: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
4a20: 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e  ->op) && pExpr->
4a30: 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70  op!=TK_IN );.  p
4a40: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
4a50: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
4a60: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
4a70: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4a80: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
4a90: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
4aa0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
4ab0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
4ac0: 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65  );.  SWAP(CollSe
4ad0: 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  q*,pExpr->pRight
4ae0: 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70  ->pColl,pExpr->p
4af0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20  Left->pColl);.  
4b00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4b10: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
4b20: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e  Right->flags & ~
4b30: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c  EP_ExpCollate) |
4b40: 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70   expLeft;.  pExp
4b50: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4b60: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
4b70: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
4b80: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69  Collate) | expRi
4b90: 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72  ght;.  SWAP(Expr
4ba0: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
4bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
4bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
4bd0: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
4be0: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
4bf0: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
4c00: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
4c10: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
4c20: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
4c30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
4c40: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
4c50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
4c60: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
4c70: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
4c80: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
4c90: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
4ca0: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
4cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
4cc0: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
4cd0: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
4ce0: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
4cf0: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
4d00: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
4d10: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
4d20: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
4d30: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
4d40: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
4d50: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
4d60: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
4d70: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
4d80: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
4d90: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
4da0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
4db0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
4dc0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
4dd0: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
4de0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
4df0: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
4e00: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
4e10: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
4e20: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
4e30: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
4e40: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
4e50: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4e60: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
4e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
4e80: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
4e90: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
4ea0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
4eb0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
4ec0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
4ed0: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
4ee0: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
4ef0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
4f00: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
4f10: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
4f20: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4f30: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
4f40: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
4f50: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
4f60: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
4f70: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
4f80: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
4f90: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
4fa0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
4fb0: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
4fc0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
4fd0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
4fe0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
4ff0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
5000: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e  c WhereTerm *fin
5010: 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c  dTerm(.  WhereCl
5020: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
5030: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
5040: 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  se to be searche
5050: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5070: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
5080: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43   LHS */.  int iC
5090: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
50a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
50b0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74   of LHS */.  Bit
50c0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
50d0: 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e     /* RHS must n
50e0: 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20  ot overlap with 
50f0: 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75  this mask */.  u
5100: 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  32 op,          
5110: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5120: 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73  WO_xx values des
5130: 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72  cribing operator
5140: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5150: 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x           /* M
5160: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
5170: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
5180: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
5190: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
51a0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b   *pTerm;.  int k
51b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ;.  assert( iCur
51c0: 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57  >=0 );.  op &= W
51d0: 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65  O_ALL;.  for(pTe
51e0: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
51f0: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
5200: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
5210: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
5220: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
5230: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65    && (pTerm->pre
5240: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
5250: 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ady)==0.       &
5260: 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  & pTerm->u.leftC
5270: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
5280: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
5290: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29  >eOperator & op)
52a0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
52b0: 20 69 66 28 20 70 49 64 78 20 26 26 20 70 54 65   if( pIdx && pTe
52c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
52d0: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
52e0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
52f0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5300: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
5310: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
5320: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
5330: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
5340: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
5350: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
5360: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
5370: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
5380: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
5390: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
53a0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
53b0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
53c0: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
53d0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;..        /* Fi
53e0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c  gure out the col
53f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5400: 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e  required from an
5410: 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20   index for.     
5420: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
5430: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
5440: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
5450: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
5460: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
5470: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
5480: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
5490: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
54a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
54b0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
54c0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
54d0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
54e0: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
54f0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ht);.        ass
5500: 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61  ert(pColl || pPa
5510: 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20  rse->nErr);..   
5520: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49       for(j=0; pI
5530: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
5540: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
5550: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
5560: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
5570: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
5580: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5590: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
55a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
55b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
55c0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
55d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
55e0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
55f0: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTerm;.    }.  }
5600: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5610: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5620: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
5630: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
5640: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
5650: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
5660: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
5670: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
5680: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
5690: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
56a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
56b0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
56c0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
56d0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
56e0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
56f0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5700: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5720: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5730: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5740: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5750: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5760: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
5770: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
5780: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
57a0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
57b0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
57c0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
57d0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
57e0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
57f0: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
5800: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5810: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5820: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5830: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5840: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5850: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
5860: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
5870: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
5880: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
5890: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
58a0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
58b0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
58c0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
58d0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
58e0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
58f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5900: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
5910: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5920: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5930: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5940: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5950: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
5960: 20 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c   int *pnPattern,
5970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5980: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
5990: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
59a0: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
59b0: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
59c0: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
59d0: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
59e0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
59f0: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
5a00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5a10: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
5a20: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
5a30: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
5a40: 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  st char *z;     
5a50: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
5a60: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
5a70: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
5a80: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
5a90: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
5aa0: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
5ab0: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
5ac0: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
5ad0: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
5ae0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
5af0: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
5b00: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5b10: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
5b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5b30: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
5b40: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5b70: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
5b80: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
5b90: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5bb0: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
5bc0: 63 74 65 72 73 20 2a 2f 0a 20 20 43 6f 6c 6c 53  cters */.  CollS
5bd0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
5be0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
5bf0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
5c00: 4c 48 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  LHS */.  sqlite3
5c10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5c20: 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
5c30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
5c40: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
5c50: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
5c60: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20  pExpr, pnoCase, 
5c70: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
5c80: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  n 0;.  }.#ifdef 
5c90: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20  SQLITE_EBCDIC.  
5ca0: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72  if( *pnoCase ) r
5cb0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
5cc0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
5cd0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67  >x.pList;.  pRig
5ce0: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
5cf0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52  .pExpr;.  if( pR
5d00: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ight->op!=TK_STR
5d10: 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ING ){.    retur
5d20: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74  n 0;.  }.  pLeft
5d30: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70   = pList->a[1].p
5d40: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
5d50: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
5d60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5d70: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
5d80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
5d90: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
5da0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
5db0: 6c 6c 21 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e  ll!=0 || pLeft->
5dc0: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20  iColumn==-1 );. 
5dd0: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b   if( pColl==0 ){
5de0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
5df0: 74 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20  tion is defined 
5e00: 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 20 20  for the ROWID.  
5e10: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 2e  Use the default.
5e20: 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   */.    pColl = 
5e30: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
5e40: 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d   }.  if( (pColl-
5e50: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
5e60: 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e  LL_BINARY || *pn
5e70: 6f 43 61 73 65 29 20 26 26 0a 20 20 20 20 20 20  oCase) &&.      
5e80: 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51  (pColl->type!=SQ
5e90: 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45  LITE_COLL_NOCASE
5ea0: 20 7c 7c 20 21 2a 70 6e 6f 43 61 73 65 29 20 29   || !*pnoCase) )
5eb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5ec0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
5ed0: 75 6f 74 65 45 78 70 72 28 64 62 2c 20 70 52 69  uoteExpr(db, pRi
5ee0: 67 68 74 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61  ght);.  z = (cha
5ef0: 72 20 2a 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r *)pRight->toke
5f00: 6e 2e 7a 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a  n.z;.  cnt = 0;.
5f10: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 77    if( z ){.    w
5f20: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
5f30: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
5f40: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
5f50: 21 3d 77 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b  !=wc[2] ){ cnt++
5f60: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e  ; }.  }.  if( cn
5f70: 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38  t==0 || 255==(u8
5f80: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
5f90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5fa0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
5fb0: 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26  z[cnt]==wc[0] &&
5fc0: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5fd0: 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e 74  *pnPattern = cnt
5fe0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
5ff0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6000: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
6010: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
6020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6030: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
6040: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
6050: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
6060: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
6070: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
6080: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
6090: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
60a0: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
60b0: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
60c0: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
60d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
60e0: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
60f0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
6100: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
6110: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
6120: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
6130: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
6140: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
6150: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
6170: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c  r->token.n!=5 ||
6180: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
6190: 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74 20 63  trNICmp((const c
61a0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
61b0: 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29 21 3d  n.z,"match",5)!=
61c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
61d0: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
61e0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
61f0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
6200: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
6210: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6220: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
6230: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
6240: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
6250: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6260: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6270: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6280: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6290: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
62a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
62b0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
62c0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
62d0: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
62e0: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
62f0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
6300: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
6310: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
6320: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
6330: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
6340: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
6350: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
6360: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
6370: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
6380: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
6390: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
63a0: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
63b0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
63c0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
63d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
63e0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
63f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6400: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6410: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
6420: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
6430: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
6440: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
6450: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
6460: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
6470: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
6480: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
6490: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
64a0: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
64c0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
64d0: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
64e0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
64f0: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
6500: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
6510: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
6520: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
6530: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
6540: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
6550: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
6560: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
6570: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
6580: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
6590: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
65a0: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
65b0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
65c0: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
65d0: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
65e0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
65f0: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
6600: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6610: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
6620: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
6630: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
6640: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
6650: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
6660: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
6670: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
6680: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
6690: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
66a0: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
66b0: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
66c0: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
66d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
66e0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
66f0: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
6700: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
6710: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
6720: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
6730: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
6740: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
6750: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6760: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
6770: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
6780: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
6790: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
67a0: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
67b0: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
67c0: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
67d0: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
67e0: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
67f0: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
6800: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
6810: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6820: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
6830: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
6840: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
6850: 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73  lumn of C.** a s
6860: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
6870: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
6880: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
6890: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
68a0: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
68b0: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
68c0: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
68d0: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
68e0: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
68f0: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
6900: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
6910: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6920: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6930: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
6940: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
6950: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
6960: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
6970: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6980: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
6990: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
69a0: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
69b0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
69c0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
69d0: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
69e0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
69f0: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
6a00: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
6a10: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6a20: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
6a30: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
6a40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
6a50: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
6a60: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
6a70: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
6a80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
6a90: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
6aa0: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
6ab0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
6ac0: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
6ad0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
6ae0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
6af0: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
6b00: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
6b10: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
6b20: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
6b30: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
6b40: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
6b50: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
6b60: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
6b70: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
6b80: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
6b90: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
6ba0: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
6bb0: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
6bc0: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
6bd0: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
6be0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6bf0: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
6c00: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
6c10: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
6c20: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
6c30: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
6c40: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
6c50: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
6c60: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
6c70: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
6c80: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
6c90: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
6ca0: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
6cb0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
6cc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
6cd0: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
6ce0: 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69  at.** is somethi
6cf0: 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  ng the bestIndex
6d00: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
6d10: 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73  determine.  This
6d20: 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c   analysis.** onl
6d30: 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68  y looks at wheth
6d40: 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72  er subterms appr
6d50: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
6d60: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
6d70: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
6d80: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
6d90: 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73   all satisfy cas
6da0: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
6db0: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
6dc0: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
6dd0: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
6de0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
6df0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
6e00: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
6e10: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
6e20: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
6e30: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
6e40: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
6e50: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
6e60: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
6e70: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
6e80: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
6e90: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
6ea0: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
6eb0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
6ec0: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
6ed0: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
6ee0: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
6ef0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
6f00: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
6f10: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
6f20: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
6f30: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
6f40: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
6f50: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
6f60: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
6f70: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
6f80: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
6f90: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
6fa0: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
6fb0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
6fc0: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
6fd0: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
6fe0: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
6ff0: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
7000: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
7010: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7020: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
7030: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
7040: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
7050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7060: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
7070: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
7080: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
7090: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
70a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
70b0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
70c0: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
70d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
70e0: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7100: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
7110: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7120: 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65  ed */.){.  Parse
7130: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
7140: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7150: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7160: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
7170: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7180: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7190: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
71a0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
71b0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
71c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
71d0: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
71e0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
71f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
7200: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7220: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7230: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
7240: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
7250: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
7260: 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c  MaskSet; /* Tabl
7270: 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  e use masks */. 
7280: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
72b0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
72c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
72d0: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
72e0: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
72f0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
7300: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
7310: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
7320: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
7330: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
7340: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
7350: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
7360: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
7370: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7380: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
7390: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
73a0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
73b0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
73c0: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
73d0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
73e0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
73f0: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
7400: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
7410: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
7420: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
7430: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
7440: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
7450: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
7460: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
7470: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
7480: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
7490: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
74a0: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
74b0: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
74c0: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
74d0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
74e0: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
74f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
7500: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
7510: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
7520: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
7530: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
7540: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
7550: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
7560: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
7570: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
7580: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7590: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
75a0: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
75b0: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
75c0: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
75d0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
75e0: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
75f0: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
7600: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
7610: 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  rWc, pWC->pParse
7620: 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  , pMaskSet);.  w
7630: 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c  hereSplit(pOrWc,
7640: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
7650: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
7660: 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20  (pSrc, pOrWc);. 
7670: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7680: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
7690: 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d    assert( pOrWc-
76a0: 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20  >nTerm>=2 );..  
76b0: 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20  /*.  ** Compute 
76c0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
76d0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
76e0: 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20  isfy cases 1 or 
76f0: 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61  2..  */.  indexa
7700: 62 6c 65 20 3d 20 63 68 6e 67 54 6f 49 4e 20 3d  ble = chngToIN =
7710: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
7720: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
7730: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
7740: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
7750: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
7760: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
7770: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
7780: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
7790: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
77a0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
77b0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
77c0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
77d0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
77e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
77f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7800: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
7810: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
7820: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
7830: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
7840: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
7850: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7860: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
7870: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
7880: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
7890: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
78a0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
78b0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
78c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
78d0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
78e0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
78f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
7900: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
7910: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
7920: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
7930: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
7940: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
7950: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
7960: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
7970: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
7980: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
7990: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
79a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
79b0: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
79c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
79d0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
79e0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
79f0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
7a00: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
7a10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
7a20: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7a30: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7a40: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7a50: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
7a60: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
7a70: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
7a80: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
7a90: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
7aa0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7ab0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7ac0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7ad0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7ae0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7af0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7b00: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7b10: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
7b20: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
7b30: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
7b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7b50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7b60: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
7b70: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7b80: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
7b90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
7ba0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
7bb0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
7bc0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
7bd0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
7be0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
7bf0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
7c00: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
7c10: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
7c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
7c30: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
7c40: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
7c50: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
7c60: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7c70: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
7c80: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
7c90: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
7ca0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
7cb0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
7cc0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
7cd0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
7ce0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
7cf0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
7d00: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
7d10: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
7d20: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
7d30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
7d40: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
7d50: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
7d60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7d70: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
7d80: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
7d90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
7da0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
7db0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
7dc0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
7dd0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
7de0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
7df0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
7e00: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
7e10: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
7e20: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
7e30: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
7e40: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
7e50: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
7e60: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
7e70: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
7e80: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
7e90: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
7ea0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
7eb0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
7ec0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
7ed0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
7ee0: 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  fied..  */.  if(
7ef0: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
7f00: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
7f10: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
7f20: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
7f30: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
7f40: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
7f50: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
7f60: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
7f70: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
7f80: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
7f90: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
7fa0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
7fb0: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
7fc0: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
7fd0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
7fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ff0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8000: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
8010: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
8020: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
8030: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
8040: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
8050: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
8060: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
8070: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
8080: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
8090: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
80a0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
80b0: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
80c0: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
80d0: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
80e0: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
80f0: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
8100: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
8110: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
8120: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
8130: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
8140: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
8150: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
8160: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
8170: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
8180: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
8190: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
81a0: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
81b0: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
81c0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
81d0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
81e0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
81f0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8200: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
8210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
8220: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
8230: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
8240: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8250: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 6f  >leftCursor==iCo
8260: 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
8270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68  .        if( (ch
8280: 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b  ngToIN & getMask
8290: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
82a0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
82b0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
82c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
82d0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
82e0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
82f0: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
8300: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
8310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8330: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
8340: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
8350: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8360: 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54  (chngToIN&(chngT
8370: 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  oIN-1))==0 );.  
8380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
8390: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
83a0: 70 4d 61 73 6b 53 65 74 2c 20 69 43 6f 6c 75 6d  pMaskSet, iColum
83b0: 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  n) );.        br
83c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
83d0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
83e0: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b  = 1;.      for(;
83f0: 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e   i>=0 && okToChn
8400: 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54  gToIN; i--, pOrT
8410: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
8420: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8430: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
8440: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
8450: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8460: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
8470: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
8480: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
8490: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
84a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
84b0: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
84c0: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
84d0: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
84e0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
84f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8500: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
8510: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
8520: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8530: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
8540: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
8550: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
8560: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
8570: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
8580: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
8590: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
85a0: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
85b0: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
85c0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
85d0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
85e0: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
85f0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8600: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
8610: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
8620: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
8630: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8640: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
8650: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8660: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
8670: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8680: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
8690: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
86a0: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
86b0: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
86c0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
86d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
86e0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
86f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8700: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8720: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8730: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
8740: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
8750: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
8760: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
8770: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
8780: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
8790: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
87a0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
87b0: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
87c0: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
87d0: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
87e0: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
87f0: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
8800: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
8810: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
8820: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
8830: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
8840: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
8850: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8860: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
8870: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
8880: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
8890: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
88a0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
88b0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
88c0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
88d0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
88e0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
88f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8900: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
8910: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
8920: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8930: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8940: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
8950: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
8960: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
8970: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
8980: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8990: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
89a0: 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  ator==WO_EQ );. 
89b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89c0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
89d0: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20  or==iCursor );. 
89e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89f0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
8a00: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b  lumn==iColumn );
8a10: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
8a20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8a30: 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  b, pOrTerm->pExp
8a40: 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  r->pRight, 0);. 
8a50: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
8a60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8a70: 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65  pend(pWC->pParse
8a80: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30  , pList, pDup, 0
8a90: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
8aa0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
8ab0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
8ac0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
8ad0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
8ae0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8af0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
8b00: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
8b10: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
8b20: 64 62 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  db, TK_IN, pDup,
8b30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
8b40: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
8b50: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
8b60: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
8b70: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
8b80: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
8b90: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8ba0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
8bb0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
8bc0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
8bd0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
8be0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
8bf0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
8c00: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
8c10: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
8c20: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8c30: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
8c40: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
8c50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
8c60: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
8c70: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
8c80: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
8c90: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
8ca0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
8cb0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
8cc0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
8cd0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
8ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8cf0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8d00: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
8d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
8d20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
8d30: 30 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  0;  /* case 1 tr
8d40: 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20  umps case 2 */. 
8d50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
8d60: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
8d70: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
8d80: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
8d90: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
8da0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
8db0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
8dc0: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
8dd0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
8de0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
8df0: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
8e00: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
8e10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8e20: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
8e30: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
8e40: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
8e50: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
8e60: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
8e70: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
8e80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
8e90: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
8ea0: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
8eb0: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
8ec0: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
8ed0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
8ee0: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
8ef0: 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  r>"..**.** If th
8f00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8f10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
8f20: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
8f30: 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a  h X and Y are.**
8f40: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
8f50: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
8f60: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
8f70: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
8f80: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66  rtual.** term of
8f90: 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70   the form "Y <op
8fa0: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
8fb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8fc0: 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65  e and.** analyze
8fd0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54  d separately.  T
8fe0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
8ff0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9000: 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61  TERM_COPIED.** a
9010: 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20  nd the new term 
9020: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
9030: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63  ERM_DYNAMIC (bec
9040: 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a  ause it's pExpr.
9050: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  ** needs to be f
9060: 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68  reed with the Wh
9070: 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54  ereClause) and T
9080: 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63  ERM_VIRTUAL (bec
9090: 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20  ause it.** is a 
90a0: 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66  commuted copy of
90b0: 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20   a prior term.) 
90c0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
90d0: 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a  rm has nChild=1.
90e0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20  ** and the copy 
90f0: 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65  has idxParent se
9100: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
9110: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  f the original t
9120: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
9130: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
9140: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
9150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9160: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9170: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
9180: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
9190: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
91a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
91b0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
91c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
91d0: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
91e0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
91f0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9210: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
9220: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57   analyzed */.  W
9230: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
9240: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  skSet;          
9250: 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20  /* Set of table 
9260: 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20  index masks */. 
9270: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
92a0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
92b0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
92c0: 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20  prereqLeft;     
92d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
92e0: 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65  equesites of the
92f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f   pExpr->pLeft */
9300: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
9310: 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  qAll;           
9320: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
9330: 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f  ites of pExpr */
9340: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
9350: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Right = 0;.  int
9360: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74   nPattern;.  int
9370: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 69   isComplete;.  i
9380: 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 69 6e 74  nt noCase;.  int
9390: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
93b0: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
93c0: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
93d0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
93e0: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
93f0: 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ;     /* Parsing
9400: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
9410: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9420: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
9430: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9440: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
9450: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9460: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9470: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
9480: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9490: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43    pMaskSet = pWC
94a0: 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->pMaskSet;.  pE
94b0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
94c0: 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  pr;.  prereqLeft
94d0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
94e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
94f0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
9500: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
9510: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
9520: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
9530: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
9540: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
9550: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9560: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
9570: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
9580: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
9590: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
95a0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
95b0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
95c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
95d0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
95e0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
95f0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9600: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
9610: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
9620: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
9630: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
9640: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
9650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
9660: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9670: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
9680: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9690: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
96a0: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
96b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
96c0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
96d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
96e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
96f0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
9700: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
9710: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
9720: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
9730: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
9740: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
9750: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
9760: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
9770: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
9780: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
9790: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
97a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
97b0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
97c0: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
97d0: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
97e0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
97f0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
9800: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
9810: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
9820: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
9830: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9840: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
9850: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20 28  lowedOp(op) && (
9860: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9870: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
9880: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
9890: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
98a0: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
98b0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
98c0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
98d0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
98e0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
98f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9900: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
9910: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
9920: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
9930: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
9940: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
9950: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
9960: 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  ask(op);.    }. 
9970: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
9980: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
9990: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
99a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
99b0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
99c0: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  p;.      if( pTe
99d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
99e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
99f0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
9a00: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
9a10: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
9a20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
9a30: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9a40: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
9a50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9a60: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
9a70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
9a80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9a90: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
9aa0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
9ab0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
9ac0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
9ad0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
9ae0: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
9af0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
9b00: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
9b10: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
9b20: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
9b30: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
9b40: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9b50: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
9b60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
9b70: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9b80: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
9b90: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65  COPIED;.      }e
9ba0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
9bb0: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
9bc0: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
9bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
9be0: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
9bf0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
9c00: 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c  pLeft = pDup->pL
9c10: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
9c20: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
9c30: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
9c40: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
9c50: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
9c60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
9c70: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
9c80: 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  = prereqLeft;.  
9c90: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
9ca0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
9cb0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
9cc0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
9cd0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b  rMask(pDup->op);
9ce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
9cf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9d00: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
9d10: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
9d20: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
9d30: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
9d40: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
9d50: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
9d60: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
9d70: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
9d80: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
9d90: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
9da0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
9db0: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
9dc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
9dd0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
9de0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
9df0: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
9e00: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
9e10: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
9e20: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
9e30: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
9e40: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
9e50: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
9e60: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
9e70: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
9e80: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
9e90: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
9ea0: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
9eb0: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
9ec0: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
9ed0: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
9ee0: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
9ef0: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
9f00: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
9f10: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
9f20: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
9f30: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
9f40: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
9f50: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
9f60: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
9f70: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
9f80: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
9f90: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
9fa0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9fb0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
9fc0: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
9fd0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
9fe0: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
9ff0: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
a000: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
a010: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a020: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
a030: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a040: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
a050: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
a060: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
a070: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
a080: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
a090: 64 62 2c 20 6f 70 73 5b 69 5d 2c 20 73 71 6c 69  db, ops[i], sqli
a0a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a0b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c  Expr->pLeft, 0),
a0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a0e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a0f0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
a100: 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  pr, 0), 0);.    
a110: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
a120: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
a130: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
a140: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
a150: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
a160: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
a170: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
a180: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
a190: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
a1a0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
a1b0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
a1c0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
a1d0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a1e0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
a1f0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
a200: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
a210: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
a220: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
a230: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
a240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
a250: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
a260: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a270: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
a280: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
a290: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
a2a0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
a2b0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
a2c0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
a2d0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
a2e0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
a2f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
a300: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
a310: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
a320: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
a330: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
a340: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 7d 0a  , idxTerm);.  }.
a350: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a360: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
a370: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
a380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
a390: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
a3a0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
a3b0: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
a3c0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
a3d0: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
a3e0: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
a3f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b  .  **.  ** A lik
a400: 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65  e pattern of the
a410: 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61   form "x LIKE 'a
a420: 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64  bc%'" is changed
a430: 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74   into constraint
a440: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  s.  **.  **     
a450: 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e       x>='abc' AN
a460: 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20  D x<'abd' AND x 
a470: 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a  LIKE 'abc%'.  **
a480: 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63  .  ** The last c
a490: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
a4a0: 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20  prefix "abc" is 
a4b0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66  incremented to f
a4c0: 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72  orm the.  ** ter
a4d0: 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
a4e0: 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20  on "abd"..  */. 
a4f0: 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   if( isLikeOrGlo
a500: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
a510: 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43   &nPattern, &isC
a520: 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65  omplete, &noCase
a530: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 57  ).         && pW
a540: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
a550: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
a560: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45  , *pRight;.    E
a570: 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74  xpr *pStr1, *pSt
a580: 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r2;.    Expr *pN
a590: 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78  ewExpr1, *pNewEx
a5a0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
a5b0: 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a  New1, idxNew2;..
a5c0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
a5d0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
a5e0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67  .pExpr;.    pRig
a5f0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
a600: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
a610: 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73 71 6c  .    pStr1 = sql
a620: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
a630: 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20  , TK_STRING, 0, 
a640: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
a650: 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71  Str1 ){.      sq
a660: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
a670: 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e  b, &pStr1->token
a680: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
a690: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e  );.      pStr1->
a6a0: 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65  token.n = nPatte
a6b0: 72 6e 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d  rn;.      pStr1-
a6c0: 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44 65 71 75  >flags = EP_Dequ
a6d0: 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oted;.    }.    
a6e0: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
a6f0: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
a700: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
a710: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a720: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
a730: 70 43 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73  pC;.      /* ass
a740: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
a750: 6e 2e 64 79 6e 20 29 3b 20 2a 2f 0a 20 20 20 20  n.dyn ); */.    
a760: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
a770: 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74  r2->token.z[nPat
a780: 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 63  tern-1];.      c
a790: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
a7a0: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
a7b0: 20 20 20 20 69 66 28 20 63 3d 3d 27 40 27 20 29      if( c=='@' )
a7c0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
a7d0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
a7e0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
a7f0: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
a800: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
a810: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 78      }.    pNewEx
a820: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
a830: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
a840: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
a850: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 70 53 74  (db,pLeft,0),pSt
a860: 72 31 2c 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  r1,0);.    idxNe
a870: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
a880: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
a890: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
a8a0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
a8b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a8c0: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
a8d0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a8e0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
a8f0: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
a900: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
a910: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20  (pParse, TK_LT, 
a920: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a930: 62 2c 70 4c 65 66 74 2c 30 29 2c 70 53 74 72 32  b,pLeft,0),pStr2
a940: 2c 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32  ,0);.    idxNew2
a950: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a960: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
a970: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
a980: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
a990: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
a9a0: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
a9b0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a9c0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
a9d0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
a9e0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a9f0: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
aa00: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
aa10: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
aa20: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
aa30: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
aa40: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
aa50: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
aa60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
aa70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
aa90: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
aaa0: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
aab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
aac0: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
aad0: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
aae0: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
aaf0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
ab00: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
ab10: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
ab20: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
ab30: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
ab40: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
ab50: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
ab60: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
ab70: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
ab80: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
ab90: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
aba0: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
abb0: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
abc0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
abd0: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
abe0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
abf0: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
ac00: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
ac10: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
ac20: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
ac30: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
ac40: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
ac50: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
ac60: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
ac70: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
ac80: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
ac90: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
aca0: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
acb0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
acc0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
acd0: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
ace0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
acf0: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
ad00: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
ad10: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
ad20: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
ad30: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
ad40: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
ad50: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
ad60: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
ad70: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
ad80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
ad90: 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  b, TK_MATCH, 0, 
ada0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
adb0: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
adc0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
add0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
ade0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
adf0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
ae00: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
ae10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
ae20: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
ae30: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
ae40: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
ae50: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
ae60: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
ae70: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
ae80: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
ae90: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
aea0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
aeb0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
aec0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
aed0: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
aee0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
aef0: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
af00: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
af10: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
af20: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
af30: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
af40: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
af50: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
af60: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
af70: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
af80: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
af90: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
afa0: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
afb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
afc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
afd0: 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  ABLE */..  /* Pr
afe0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
aff0: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
b000: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
b010: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
b020: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
b030: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
b040: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
b050: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
b060: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
b070: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
b080: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b090: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
b0a0: 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74  essions in pList
b0b0: 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63  ->a[iFirst...] c
b0c0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65  ontain.** a refe
b0d0: 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62  rence to any tab
b0e0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  le other than th
b0f0: 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a  e iBase table..*
b100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 66  /.static int ref
b110: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
b120: 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  es(.  ExprList *
b130: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
b140: 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65 73  /* Search expres
b150: 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73  sions in ths lis
b160: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
b170: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
b180: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
b190: 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61   tables to bitma
b1a0: 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  ps */.  int iFir
b1b0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
b1c0: 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e    /* Be searchin
b1d0: 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72 73  g with the iFirs
b1e0: 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  t-th expression 
b1f0: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20  */.  int iBase  
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b210: 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e  * Ignore referen
b220: 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
b230: 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  e */.){.  Bitmas
b240: 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74  k allowed = ~get
b250: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69  Mask(pMaskSet, i
b260: 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Base);.  while( 
b270: 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45  iFirst<pList->nE
b280: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  xpr ){.    if( (
b290: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
b2a0: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
b2b0: 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70  a[iFirst++].pExp
b2c0: 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29  r)&allowed)!=0 )
b2d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
b2e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b2f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
b300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
b310: 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63  ecides if pIdx c
b320: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61  an be used to sa
b330: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
b340: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49  BY.** clause.  I
b350: 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74  f it can, it ret
b360: 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78  urns 1.  If pIdx
b370: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
b380: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
b390: 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75  clause, this rou
b3a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a  tine returns 0..
b3b0: 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
b3c0: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
b3d0: 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45  ause from a SELE
b3e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70  CT statement.  p
b3f0: 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65  Tab is the.** le
b400: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e  ft-most table in
b410: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b420: 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53 45   of that same SE
b430: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
b440: 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nd.** the table 
b450: 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  has a cursor num
b460: 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20  ber of "base".  
b470: 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78  pIdx is an index
b480: 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   on pTab..**.** 
b490: 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  nEqCol is the nu
b4a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
b4b0: 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72 65  of pIdx that are
b4c0: 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69 74   used as equalit
b4d0: 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73  y.** constraints
b4e0: 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20  .  Any of these 
b4f0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d  columns may be m
b500: 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  issing from the 
b510: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
b520: 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68  se and the match
b530: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20   can still be a 
b540: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41  success..**.** A
b550: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
b560: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 6d 61  ORDER BY that ma
b570: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
b580: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 69  index must be ei
b590: 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44  ther.** ASC or D
b5a0: 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20  ESC.  (Terms of 
b5b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b5c0: 75 73 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  use past the end
b5d0: 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20   of a UNIQUE.** 
b5e0: 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65  index do not nee
b5f0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  d to satisfy thi
b600: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20  s constraint.)  
b610: 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65  The *pbRev value
b620: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20   is.** set to 1 
b630: 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
b640: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45  clause is all DE
b650: 53 43 20 61 6e 64 20 69 74 20 69 73 20 73 65 74  SC and it is set
b660: 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20   to 0 if.** the 
b670: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b680: 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73  is all ASC..*/.s
b690: 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74  tatic int isSort
b6a0: 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ingIndex(.  Pars
b6b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b6c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b6d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b6e0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
b6f0: 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  et, /* Mapping f
b700: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
b710: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
b720: 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  aps */.  Index *
b730: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
b740: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
b750: 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a   are testing */.
b760: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
b770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
b780: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
b790: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  he table to be s
b7a0: 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  orted */.  ExprL
b7b0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
b7c0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
b7d0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
b7e0: 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20  nt nEqCol,      
b7f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b800: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
b810: 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72  s with == constr
b820: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
b830: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
b840: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
b850: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
b860: 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  SC */.){.  int i
b870: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
b880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b890: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
b8a0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d   int sortOrder =
b8b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b8c0: 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78   /* XOR of index
b8d0: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f   and ORDER BY so
b8e0: 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a  rt direction */.
b8f0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
b920: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
b930: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
b940: 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20  st_item *pTerm; 
b950: 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20     /* A term of 
b960: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b970: 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  use */.  sqlite3
b980: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b990: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
b9a0: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e  rderBy!=0 );.  n
b9b0: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
b9c0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
b9d0: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
b9e0: 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f  /* Match terms o
b9f0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
ba00: 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f  lause against co
ba10: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
ba20: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
ba30: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64  ** Note that ind
ba40: 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e  ices have pIdx->
ba50: 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20  nColumn regular 
ba60: 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a  columns plus.  *
ba70: 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c  * one additional
ba80: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69   column containi
ba90: 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54  ng the rowid.  T
baa0: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a  he rowid column.
bab0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
bac0: 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65  x is also allowe
bad0: 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  d to match again
bae0: 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  st the ORDER BY.
baf0: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
bb00: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  /.  for(i=j=0, p
bb10: 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Term=pOrderBy->a
bb20: 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
bb30: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
bb40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
bb50: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
bb60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
bb70: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
bb80: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
bb90: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
bba0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
bbb0: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
bbc0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d   */.    int term
bbd0: 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f  SortOrder; /* So
bbe0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
bbf0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  s term */.    in
bc00: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
bc10: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c   /* The i-th col
bc20: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
bc30: 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20  .  -1 for rowid 
bc40: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74  */.    int iSort
bc50: 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66  Order;    /* 1 f
bc60: 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
bc70: 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
bc80: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
bc90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
bca0: 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ll; /* Name of t
bcb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
bcc0: 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69  uence for i-th i
bcd0: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20  ndex term */..  
bce0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
bcf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
bd00: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
bd10: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
bd20: 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
bd30: 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20       /* Can not 
bd40: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72  use an index sor
bd50: 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  t on anything th
bd60: 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  at is not a colu
bd70: 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  mn in the.      
bd80: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
bd90: 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  le of the FROM c
bda0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62  lause */.      b
bdb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bdc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
bdd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
bde0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
bdf0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
be00: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
be10: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
be20: 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e      if( i<pIdx->
be30: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
be40: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
be50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
be60: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
be70: 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  =pIdx->pTable->i
be80: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
be90: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
bea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72      }.      iSor
beb0: 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
bec0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
bed0: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78      zColl = pIdx
bee0: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
bef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43   }else{.      iC
bf00: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
bf10: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30    iSortOrder = 0
bf20: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
bf30: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
bf40: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70    }.    if( pExp
bf50: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
bf60: 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  umn || sqlite3St
bf70: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
bf80: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
bf90: 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
bfa0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
bfb0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
bfc0: 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
bfd0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
bfe0: 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
bff0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
c000: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
c010: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
c020: 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
c030: 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
c040: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
c050: 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
c060: 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
c070: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
c080: 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
c090: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
c0a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
c0b0: 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  e if( i==pIdx->n
c0c0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
c0d0: 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d    /* Index colum
c0e0: 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64  n i is the rowid
c0f0: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72  .  All other ter
c100: 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20  ms match. */.   
c110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c130: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
c140: 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
c150: 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
c160: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
c170: 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
c180: 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
c190: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
c1a0: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
c1b0: 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
c1c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
c1f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
c200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c210: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
c220: 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72  =0 || pTerm->sor
c230: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
c240: 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72   assert( iSortOr
c250: 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f  der==0 || iSortO
c260: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74  rder==1 );.    t
c270: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69  ermSortOrder = i
c280: 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72  SortOrder ^ pTer
c290: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
c2a0: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
c2b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  {.      if( term
c2c0: 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
c2d0: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
c2e0: 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f  /* Indices can o
c2f0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61  nly be used if a
c300: 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
c310: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20  s past the.     
c320: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63     ** equality c
c330: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
c340: 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f  ll either DESC o
c350: 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20  r ASC. */.      
c360: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c370: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
c380: 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
c390: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a   termSortOrder;.
c3a0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
c3b0: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     pTerm++;.    
c3c0: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  if( iColumn<0 &&
c3d0: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
c3e0: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
c3f0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
c400: 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ase) ){.      /*
c410: 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   If the indexed 
c420: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72  column is the pr
c430: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76  imary key and ev
c440: 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73  erything matches
c450: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72  .      ** so far
c460: 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
c470: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
c480: 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65 66  to the right ref
c490: 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20  erence other.   
c4a0: 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20     ** tables in 
c4b0: 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77  the join, then w
c4c0: 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74 68  e are assured th
c4d0: 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  at the index can
c4e0: 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20 20   be used .      
c4f0: 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75  ** to sort becau
c500: 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  se the primary k
c510: 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64  ey is unique and
c520: 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   so none of the 
c530: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  other.      ** c
c540: 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65  olumns will make
c550: 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a   any difference.
c560: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
c570: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = nTerm;.    }.
c580: 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20    }..  *pbRev = 
c590: 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20  sortOrder!=0;.  
c5a0: 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a  if( j>=nTerm ){.
c5b0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
c5c0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
c5d0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65   clause are cove
c5e0: 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65  red by this inde
c5f0: 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73  x so.    ** this
c600: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
c610: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20  ed for sorting. 
c620: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
c630: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
c640: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
c650: 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43  e && i==pIdx->nC
c660: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21  olumn.      && !
c670: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
c680: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
c690: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
c6a0: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  e) ){.    /* All
c6b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69   terms of this i
c6c0: 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20  ndex match some 
c6d0: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52  prefix of the OR
c6e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
c6f0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
c700: 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64  ex is UNIQUE and
c710: 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65   no terms on the
c720: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44   tail of the ORD
c730: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
c740: 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74  use reference ot
c750: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20  her tables in a 
c760: 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69  join.  If this i
c770: 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a  s all true then.
c780: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72      ** the order
c790: 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75   by clause is su
c7a0: 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20  perfluous. */.  
c7b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c7c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c7d0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65  *.** Check table
c7e0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f   to see if the O
c7f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
c800: 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62  n pOrderBy can b
c810: 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
c820: 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64  y sorting in ord
c830: 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65  er of ROWID.  Re
c840: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20  turn true if so 
c850: 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20 74  and set *pbRev t
c860: 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72  o be.** true for
c870: 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20 61   reverse ROWID a
c880: 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72  nd false for for
c890: 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72  ward ROWID order
c8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c8b0: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
c8c0: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
c8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
c8e0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
c8f0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
c900: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
c910: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
c920: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
c930: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
c940: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
c950: 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  et, /* Mapping f
c960: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
c970: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
c980: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
c9a0: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
c9b0: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
c9c0: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
c9d0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
c9e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c9f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
ca00: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
ca10: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
ca20: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
ca30: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
ca40: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
ca50: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
ca60: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
ca70: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
ca80: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
ca90: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
caa0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
cab0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
cac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cae0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
caf0: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
cb00: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
cb10: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
cb20: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
cb30: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
cb40: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
cb50: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
cb60: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
cb70: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
cb80: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
cb90: 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ions with O(logN
cba0: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
cbb0: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
cbc0: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
cbd0: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
cbe0: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
cbf0: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
cc00: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
cc10: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
cc20: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
cc30: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
cc40: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
cc50: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
cc60: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
cc70: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
cc80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
cc90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
cca0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
ccb0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
ccc0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
ccd0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
cce0: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
ccf0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
cd00: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
cd10: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
cd20: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
cd30: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
cd40: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
cd50: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
cd60: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
cd70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cd80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cd90: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
cda0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
cdb0: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
cdc0: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
cdd0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
cde0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
cdf0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
ce00: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
ce10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
ce20: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
ce30: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ce40: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
ce50: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
ce60: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
ce70: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
ce80: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
ce90: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
cea0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
ceb0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
cec0: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
ced0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
cee0: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
cef0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
cf00: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
cf10: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
cf20: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
cf30: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
cf40: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
cf50: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
cf60: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
cf70: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
cf80: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
cf90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
cfa0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
cfb0: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
cfc0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
cfd0: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
cfe0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
cff0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
d000: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
d010: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
d020: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
d030: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
d040: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
d050: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
d060: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
d070: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
d080: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d090: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d0a0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
d0b0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d0c0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
d0d0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
d0e0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d0f0: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
d100: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
d110: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d120: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
d130: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
d140: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d150: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
d160: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
d170: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
d180: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d190: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
d1a0: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
d1b0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
d1c0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
d1d0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
d1e0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
d1f0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
d200: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
d210: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
d220: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
d230: 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
d240: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
d250: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
d260: 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
d270: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
d280: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
d290: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
d2a0: 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
d2b0: 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
d2c0: 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
d2d0: 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
d2e0: 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
d2f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
d300: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
d310: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
d320: 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
d330: 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
d340: 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
d350: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
d360: 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
d370: 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
d380: 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
d390: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
d3a0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d3b0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
d3c0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
d3d0: 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
d3e0: 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
d3f0: 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
d400: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
d410: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
d420: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
d430: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
d440: 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
d450: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
d460: 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
d470: 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
d480: 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
d490: 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
d4a0: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
d4b0: 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
d4c0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
d4d0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
d4e0: 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
d4f0: 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
d500: 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
d510: 63 20 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72  c double bestVir
d520: 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72  tualIndex(.  Par
d530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d550: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
d560: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
d570: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
d580: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
d590: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
d5a0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
d5b0: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
d5c0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
d5d0: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
d5e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
d5f0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
d600: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
d610: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
d620: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
d630: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
d640: 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
d650: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
d660: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  by clause */.  i
d670: 6e 74 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65  nt orderByUsable
d680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d690: 20 54 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   True if we can 
d6a0: 70 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a  potential sort *
d6b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
d6c0: 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
d6d0: 66 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  fo /* Index info
d6e0: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
d6f0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
d700: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
d710: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
d720: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
d730: 56 74 61 62 20 3d 20 70 54 61 62 2d 3e 70 56 74  Vtab = pTab->pVt
d740: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ab;.  sqlite3_in
d750: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
d760: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
d770: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
d780: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
d790: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
d7a0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
d7b0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
d7c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
d7d0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
d7e0: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
d7f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d800: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
d810: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
d820: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
d830: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
d840: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
d850: 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
d860: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20  previously.  ** 
d870: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e  allocated and in
d880: 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68  itialized for th
d890: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
d8a0: 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a  , then allocate.
d8b0: 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c    ** and initial
d8c0: 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a  ize it now.  */.
d8d0: 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70    pIdxInfo = *pp
d8e0: 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
d8f0: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
d900: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
d910: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 52 65   WHERETRACE(("Re
d920: 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20  computing index 
d930: 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e  info for %s...\n
d940: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
d950: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
d960: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
d970: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
d980: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
d990: 72 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a  referring.    **
d9a0: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
d9b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f   table */.    fo
d9c0: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
d9d0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
d9e0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
d9f0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
da00: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
da10: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
da20: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
da30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
da40: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
da50: 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
da60: 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
da70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
da80: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
da90: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  O_IN );.      te
daa0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
dab0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
dac0: 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ULL );.      if(
dad0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
dae0: 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
daf0: 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
db00: 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ;.      nTerm++;
db10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
db20: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
db30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
db40: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
db50: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
db60: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
db70: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
db80: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
db90: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
dba0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
dbb0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
dbc0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
dbd0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
dbe0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
dbf0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
dc00: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
dc10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
dc20: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
dc30: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
dc40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
dc50: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
dc60: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
dc70: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
dc80: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
dc90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dca0: 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d  if( i==pOrderBy-
dcb0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
dcc0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
dcd0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
dce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
dcf0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
dd00: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
dd10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
dd20: 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66    */.    pIdxInf
dd30: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
dd40: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
dd50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
dd60: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
dd90: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
dda0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
ddd0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
dde0: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
ddf0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
de00: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o==0 ){.      sq
de10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
de20: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
de30: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 2f 2a  mory");.      /*
de40: 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61   (double)0 In ca
de50: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
de60: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
de70: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ... */.      ret
de80: 75 72 6e 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  urn (double)0;. 
de90: 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49     }.    *ppIdxI
dea0: 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a  nfo = pIdxInfo;.
deb0: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
dec0: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
ded0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
dee0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
def0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  ure contains.   
df00: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
df10: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
df20: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
df30: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
df40: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e  from.    ** chan
df50: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
df60: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
df70: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
df80: 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20  order to.    ** 
df90: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
dfa0: 20 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   fields..    */.
dfb0: 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28      pIdxCons = (
dfc0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
dfd0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
dfe0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
dff0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d     pIdxOrderBy =
e000: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
e010: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
e020: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
e030: 3b 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28  ;.    pUsage = (
e040: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
e050: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
e060: 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
e070: 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
e080: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
e090: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
e0a0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28   = nTerm;.    *(
e0b0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
e0c0: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
e0d0: 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63  rBy;.    *(struc
e0e0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
e0f0: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
e100: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
e110: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
e120: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
e130: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
e140: 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
e150: 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
e160: 72 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74  rderBy;.    *(st
e170: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
e180: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
e190: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
e1a0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
e1b0: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
e200: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  ..    for(i=j=0,
e210: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
e220: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
e230: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
e240: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
e250: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
e260: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
e270: 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
e280: 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  t( (pTerm->eOper
e290: 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
e2a0: 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
e2b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e2c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e2d0: 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
e2e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
e2f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
e300: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
e310: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e320: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
e330: 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
e340: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 64 78  inue;.      pIdx
e350: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
e360: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
e370: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64  olumn;.      pId
e380: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
e390: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  fset = i;.      
e3a0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
e3b0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
e3c0: 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 2f 2a 20  rator;.      /* 
e3d0: 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
e3e0: 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
e3f0: 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
e400: 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
e410: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
e420: 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
e430: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
e440: 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
e450: 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
e460: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
e470: 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
e480: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
e490: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
e4a0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
e4b0: 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
e4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
e4d0: 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
e4e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
e4f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e500: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
e510: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
e520: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
e530: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
e540: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
e550: 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_GT );.      as
e560: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
e570: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
e580: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20  AINT_GE );.     
e590: 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
e5a0: 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
e5b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
e5c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e5d0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
e5e0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  or & (WO_EQ|WO_L
e5f0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
e600: 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
e610: 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
e620: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
e630: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
e640: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
e650: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
e660: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
e670: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
e680: 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
e690: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e6a0: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
e6b0: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
e6c0: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
e6d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e6e0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
e6f0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
e700: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
e710: 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f  that pIdxInfo po
e720: 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c  ints.  ** to wil
e730: 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74  l have been init
e740: 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20  ialized, either 
e750: 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
e760: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72  nt invocation or
e770: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d  .  ** during som
e780: 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69  e prior invocati
e790: 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74  on.  Now we just
e7a0: 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69   have to customi
e7b0: 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61  ze the.  ** deta
e7c0: 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20  ils of pIdxInfo 
e7d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e7e0: 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70  invocation and p
e7f0: 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78  ass it to.  ** x
e800: 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a  BestIndex..  */.
e810: 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65  .  /* The module
e820: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65   name must be de
e830: 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20  fined. Also, by 
e840: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
e850: 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
e860: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
e870: 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
e880: 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  ture. Otherwise.
e890: 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77    ** sqlite3View
e8a0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
e8b0: 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b   would have pick
e8c0: 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e  ed up the error.
e8d0: 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
e8e0: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
e8f0: 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f  rg && pTab->azMo
e900: 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20  duleArg[0] );.  
e910: 61 73 73 65 72 74 28 20 70 56 74 61 62 20 29 3b  assert( pVtab );
e920: 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 54 61  .#if 0.  if( pTa
e930: 62 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20  b->pVtab==0 ){. 
e940: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e950: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65  sg(pParse, "unde
e960: 66 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20  fined module %s 
e970: 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20  for table %s",. 
e980: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d         pTab->azM
e990: 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61  oduleArg[0], pTa
e9a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
e9b0: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 23  eturn 0.0;.  }.#
e9c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
e9d0: 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  the aConstraint[
e9e0: 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20  ].usable fields 
e9f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
ea00: 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  ll .  ** output 
ea10: 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72  variables to zer
ea20: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f  o..  **.  ** aCo
ea30: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
ea40: 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f  e is true for co
ea50: 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72 65 20  nstraints where 
ea60: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20  the right-hand. 
ea70: 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e   ** side contain
ea80: 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65  s only reference
ea90: 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74  s to tables to t
eaa0: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  he left of the c
eab0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c  urrent.  ** tabl
eac0: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
ead0: 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74  ds, if the const
eae0: 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20  raint is of the 
eaf0: 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
eb00: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
eb10: 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a   = expr.  **.  *
eb20: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61  * and we are eva
eb30: 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20  luating a join, 
eb40: 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
eb50: 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73  int on column is
eb60: 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69   .  ** only vali
eb70: 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  d if all tables 
eb80: 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78  referenced in ex
eb90: 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20  pr occur to the 
eba0: 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  left.  ** of the
ebb0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
ebc0: 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20  g column..  **. 
ebd0: 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61   ** The aConstra
ebe0: 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e  ints[] array con
ebf0: 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
ec00: 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  r all constraint
ec10: 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75  s.  ** on the cu
ec20: 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68  rrent table.  Th
ec30: 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68  at way we only h
ec40: 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69  ave to compute i
ec50: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e  t once.  ** even
ec60: 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74   though we might
ec70: 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65   try to pick the
ec80: 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74   best index mult
ec90: 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a  iple times..  **
eca0: 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70   For each attemp
ecb0: 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20  t at picking an 
ecc0: 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72  index, the order
ecd0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
ece0: 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68  e.  ** join migh
ecf0: 74 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73  t be different s
ed00: 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63  o we have to rec
ed10: 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c  ompute the usabl
ed20: 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68  e flag.  ** each
ed30: 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49   time..  */.  pI
ed40: 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
ed50: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
ed60: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
ed70: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
ed80: 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  int;.  pUsage = 
ed90: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
eda0: 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f  raintUsage;.  fo
edb0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
edc0: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
edd0: 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
ede0: 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f  {.    j = pIdxCo
edf0: 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
ee00: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
ee10: 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64  C->a[j];.    pId
ee20: 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
ee30: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
ee40: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
ee50: 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==0 ?1:0;.  }.  
ee60: 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
ee70: 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
ee80: 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
ee90: 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66  onstraint);.  if
eea0: 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
eeb0: 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
eec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eed0: 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
eee0: 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e  r);.  }.  pIdxIn
eef0: 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
ef00: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
ef10: 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
ef20: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
ef30: 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
ef40: 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
ef50: 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20  sumed = 0;.  /* 
ef60: 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63  ((double)2) In c
ef70: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
ef80: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
ef90: 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e  T... */.  pIdxIn
efa0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
efb0: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
efc0: 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29  BL / ((double)2)
efd0: 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
efe0: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
eff0: 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  y;.  if( pIdxInf
f000: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21  o->nOrderBy && !
f010: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b  orderByUsable ){
f020: 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  .    *(int*)&pId
f030: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
f040: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69  = 0;.  }..  (voi
f050: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
f060: 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ff(pParse->db);.
f070: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
f080: 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
f090: 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
f0a0: 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
f0b0: 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  INPUTS(pIdxInfo)
f0c0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
f0d0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
f0e0: 64 65 78 28 70 56 74 61 62 2c 20 70 49 64 78 49  dex(pVtab, pIdxI
f0f0: 6e 66 6f 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  nfo);.  TRACE_ID
f100: 58 5f 4f 55 54 50 55 54 53 28 70 49 64 78 49 6e  X_OUTPUTS(pIdxIn
f110: 66 6f 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  fo);.  (void)sql
f120: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50 61  ite3SafetyOn(pPa
f130: 72 73 65 2d 3e 64 62 29 3b 0a 0a 20 20 69 66 28  rse->db);..  if(
f140: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f150: 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
f160: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
f170: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
f180: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
f190: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f1a0: 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
f1b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f1c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f1d0: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
f1e0: 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
f1f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f200: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f210: 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
f220: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
f230: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
f240: 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
f250: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
f260: 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
f270: 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
f280: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
f290: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
f2a0: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  ){.    if( !pIdx
f2b0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
f2c0: 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
f2d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
f2e0: 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
f2f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f300: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
f310: 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
f320: 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
f330: 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
f340: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
f350: 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65        /* (double
f360: 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
f370: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
f380: 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
f390: 20 20 20 20 20 72 65 74 75 72 6e 20 28 64 6f 75       return (dou
f3a0: 62 6c 65 29 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ble)0;.    }.  }
f3b0: 0a 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ..  *(int*)&pIdx
f3c0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
f3d0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74   nOrderBy;.  ret
f3e0: 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  urn pIdxInfo->es
f3f0: 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23  timatedCost;.}.#
f400: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f410: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f420: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  E */../*.** Find
f430: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
f440: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
f450: 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
f460: 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
f470: 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  best query plan 
f480: 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74  and its cost int
f490: 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20  o the WhereCost 
f4a0: 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20  object supplied 
f4b0: 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  as the.** last p
f4c0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
f4d0: 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
f4e0: 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20  plan wins.  The 
f4f0: 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d  cost is an estim
f500: 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e  ate of the amoun
f510: 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20  t of.** CPU and 
f520: 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f  disk I/O need to
f530: 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71   process the req
f540: 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20 73  uest using the s
f550: 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a  elected plan..**
f560: 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e   Factors that in
f570: 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63  fluence cost inc
f580: 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  lude:.**.**    *
f590: 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20    The estimated 
f5a0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
f5b0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72  hat will be retr
f5c0: 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20  ieved.  (The.** 
f5d0: 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20        fewer the 
f5e0: 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  better.).**.**  
f5f0: 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
f600: 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74  not sorting must
f610: 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   occur..**.**   
f620: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
f630: 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  ot there must be
f640: 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70   separate lookup
f650: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  s in the.**     
f660: 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74    index and in t
f670: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
f680: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61  *.** If there wa
f690: 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
f6a0: 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49  clause (pSrc->pI
f6b0: 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74  ndex) attached t
f6c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a  o the table in.*
f6d0: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
f6e0: 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
f6f0: 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
f700: 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
f710: 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
f720: 20 69 6e 64 65 78 2e 20 49 66 20 6f 6e 65 20 63   index. If one c
f730: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
f740: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
f750: 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
f760: 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
f770: 61 20 70 6c 61 6e 20 63 61 6e 20 62 65 20 66 6f  a plan can be fo
f780: 75 6e 64 20 74 68 61 74 20 75 73 65 73 20 74 68  und that uses th
f790: 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a  e named index, .
f7a0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74  ** then the cost
f7b0: 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69   is calculated i
f7c0: 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e  n the usual way.
f7d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20  .**.** If a NOT 
f7e0: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 28  INDEXED clause (
f7f0: 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
f800: 21 3d 30 29 20 77 61 73 20 61 74 74 61 63 68 65  !=0) was attache
f810: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a  d to the table .
f820: 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ** in the SELECT
f830: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
f840: 20 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20   no indexes are 
f850: 63 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65  considered. Howe
f860: 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c  ver, the .** sel
f870: 65 63 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73  ected plan may s
f880: 74 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74  till take advant
f890: 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  age of the table
f8a0: 73 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64  s built-in rowid
f8b0: 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  .** index..*/.st
f8c0: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e  atic void bestIn
f8d0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
f8e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
f8f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
f900: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
f910: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
f920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f930: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f940: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
f950: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
f960: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
f970: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
f980: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
f990: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
f9a0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
f9b0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
f9c0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
f9d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f9e0: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
f9f0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
fa00: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
fa10: 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
fa20: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
fa30: 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
fa40: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
fa50: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
fa60: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
fa70: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
fa80: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
fa90: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
faa0: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
fab0: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
fac0: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
fad0: 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
fae0: 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
faf0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
fb00: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
fb10: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b  ng */.  int rev;
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
fb40: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
fb50: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 77 73  rder */.  int ws
fb60: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
fb70: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
fb80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
fb90: 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Probe */.  int n
fba0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
fbb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fbc0: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
fbd0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
fbe0: 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  t eqTermMask;   
fbf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
fc00: 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
fc10: 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
fc20: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc40: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
fc50: 70 50 72 6f 62 65 20 2a 2f 0a 20 20 64 6f 75 62  pProbe */.  doub
fc60: 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  le nRow;        
fc70: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
fc80: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
fc90: 6f 77 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  ows in result se
fca0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
fcd0: 65 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  er */.  Bitmask 
fce0: 6d 61 73 6b 53 72 63 3b 20 20 20 20 20 20 20 20  maskSrc;        
fcf0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66      /* Bitmask f
fd00: 6f 72 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  or the pSrc tabl
fd10: 65 20 2a 2f 0a 0a 20 20 57 48 45 52 45 54 52 41  e */..  WHERETRA
fd20: 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20  CE(("bestIndex: 
fd30: 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d  tbl=%s notReady=
fd40: 25 6c 6c 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  %llx\n", pSrc->p
fd50: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 6e 6f 74 52 65  Tab->zName,notRe
fd60: 61 64 79 29 29 3b 0a 20 20 70 50 72 6f 62 65 20  ady));.  pProbe 
fd70: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
fd80: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 53 72 63  ndex;.  if( pSrc
fd90: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
fda0: 20 20 20 20 70 50 72 6f 62 65 20 3d 20 30 3b 0a      pProbe = 0;.
fdb0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
fdc0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
fdd0: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
fde0: 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20  are no terms in 
fdf0: 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63  the where.  ** c
fe00: 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
fe10: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74   to the ROWID, t
fe20: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hen we will neve
fe30: 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a  r be able to do.
fe40: 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74    ** anything ot
fe50: 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  her than a full 
fe60: 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68  table scan on th
fe70: 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69  is table.  We mi
fe80: 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c  ght as.  ** well
fe90: 20 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e   put it first in
fea0: 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e   the join order.
feb0: 20 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68    That way, perh
fec0: 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20  aps it can be.  
fed0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ** referenced by
fee0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
fef0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
ff00: 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20    memset(pCost, 
ff10: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  0, sizeof(*pCost
ff20: 29 29 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65  ));.  if( pProbe
ff30: 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64  ==0 &&.     find
ff40: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
ff50: 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
ff60: 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  IN|WO_LT|WO_LE|W
ff70: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30  O_GT|WO_GE,0)==0
ff80: 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72   &&.     (pOrder
ff90: 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62  By==0 || !sortab
ffa0: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
ffb0: 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70  pOrderBy, pWC->p
ffc0: 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29 20  MaskSet, &rev)) 
ffd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
ffe0: 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73   }.  pCost->rCos
fff0: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
10000 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  BL;..  /* Check 
10010 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52  for a rowid=EXPR
10020 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e   or rowid IN (..
10030 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  .) constraints. 
10040 49 66 20 74 68 65 72 65 20 77 61 73 0a 20 20 2a  If there was.  *
10050 2a 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * an INDEXED BY 
10060 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20  clause attached 
10070 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2c 20 73  to this table, s
10080 6b 69 70 20 74 68 69 73 20 73 74 65 70 2e 0a 20  kip this step.. 
10090 20 2a 2f 0a 20 20 69 66 28 20 21 70 53 72 63 2d   */.  if( !pSrc-
100a0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  >pIndex ){.    p
100b0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
100c0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
100d0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
100e0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IN, 0);.    if
100f0 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
10100 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
10110 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
10120 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
10130 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 20 20  ROWID_EQ;.      
10140 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
10150 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a  ator & WO_EQ ){.
10160 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
10170 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  == is always the
10180 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f   best pick.  Loo
10190 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42  k no further.  B
101a0 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20  ecause only.    
101b0 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
101c0 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
101d0 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
101e0 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
101f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  er */.        pC
10200 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
10210 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
10220 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55  EQ | WHERE_UNIQU
10230 45 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  E;.        pCost
10240 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 31 3b 0a  ->plan.nEq = 1;.
10250 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
10260 43 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73  CE(("... best is
10270 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20   rowid\n"));.   
10280 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
10290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
102a0 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 31 3b 0a  Cost->nRow = 1;.
102b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
102c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
102d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
102e0 28 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d  ((pExpr = pTerm-
102f0 3e 70 45 78 70 72 29 2c 20 45 50 5f 78 49 73 53  >pExpr), EP_xIsS
10300 65 6c 65 63 74 29 20 0a 20 20 20 20 20 20 20 20  elect) .        
10310 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 78       && pExpr->x
10320 2e 70 4c 69 73 74 20 0a 20 20 20 20 20 20 29 7b  .pList .      ){
10330 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  .        /* Rowi
10340 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73  d IN (LIST): cos
10350 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
10360 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
10370 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20 20   of list.       
10380 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
10390 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  /.        pCost-
103a0 3e 72 43 6f 73 74 20 3d 20 70 43 6f 73 74 2d 3e  >rCost = pCost->
103b0 6e 52 6f 77 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nRow = pExpr->x.
103c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
103d0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
103e0 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 70 43 6f  st *= estLog(pCo
103f0 73 74 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20  st->rCost);.    
10400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10410 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53 45   /* Rowid IN (SE
10420 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LECT): cost is N
10430 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
10440 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
10450 77 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ws.        ** in
10460 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
10470 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
10480 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
10490 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
104a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c       ** that val
104b0 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c  ue so make a wil
104c0 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20  d guess. */.    
104d0 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20      pCost->nRow 
104e0 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 70  = 100;.        p
104f0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 32 30  Cost->rCost = 20
10500 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
10510 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
10520 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a  . rowid IN cost:
10530 20 25 2e 39 67 5c 6e 22 2c 20 70 43 6f 73 74 2d   %.9g\n", pCost-
10540 3e 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a  >rCost));.    }.
10550 20 20 0a 20 20 20 20 2f 2a 20 45 73 74 69 6d 61    .    /* Estima
10560 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  te the cost of a
10570 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66   table scan.  If
10580 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
10590 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20  how many.    ** 
105a0 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 74  entries are in t
105b0 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20  he table, use 1 
105c0 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65  million as a gue
105d0 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ss..    */.    c
105e0 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70  ost = pProbe ? p
105f0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
10600 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20  0] : 1000000;.  
10610 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
10620 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61  .. table scan ba
10630 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  se cost: %.9g\n"
10640 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 77 73  , cost));.    ws
10650 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  Flags = WHERE_RO
10660 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 0a 20 20  WID_RANGE;.  .  
10670 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
10680 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20  onstraints on a 
10690 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20  range of rowids 
106a0 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  in a table scan.
106b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 65 72  .    */.    pTer
106c0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
106d0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
106e0 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
106f0 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  E|WO_GT|WO_GE, 0
10700 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
10710 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 69   ){.      if( fi
10720 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
10730 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
10740 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20  WO_LT|WO_LE, 0) 
10750 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
10760 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
10770 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 63  LIMIT;.        c
10780 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75  ost /= 3;  /* Gu
10790 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45  ess that rowid<E
107a0 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74  XPR eliminates t
107b0 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77  wo-thirds of row
107c0 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
107d0 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
107e0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
107f0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
10800 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_GE, 0) ){.    
10810 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
10820 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
10830 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
10840 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
10850 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69  t rowid>EXPR eli
10860 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
10870 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  ds of rows */.  
10880 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
10890 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
108a0 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  id range reduces
108b0 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
108c0 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 65  , cost));.    }e
108d0 6c 73 65 7b 0a 20 20 20 20 20 20 77 73 46 6c 61  lse{.      wsFla
108e0 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gs = 0;.    }.  
108f0 20 20 6e 52 6f 77 20 3d 20 63 6f 73 74 3b 0a 20    nRow = cost;. 
10900 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
10910 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20  table scan does 
10920 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
10930 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
10940 20 69 6e 63 72 65 61 73 65 0a 20 20 20 20 2a 2a   increase.    **
10950 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f   the cost by Nlo
10960 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  gN to cover the 
10970 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69  expense of sorti
10980 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
10990 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
109a0 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52   if( sortableByR
109b0 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65  owid(iCur, pOrde
109c0 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53  rBy, pWC->pMaskS
109d0 65 74 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20  et, &rev) ){.   
109e0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
109f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48  WHERE_ORDERBY|WH
10a00 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
10a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76  .        if( rev
10a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73   ){.          ws
10a30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
10a40 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
10a50 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
10a60 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63         cost += c
10a70 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
10a80 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
10a90 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
10aa0 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  ng increases cos
10ab0 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
10ac0 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
10ad0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
10ae0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
10af0 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
10b00 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  der ){.      /* 
10b10 46 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  For application 
10b20 74 65 73 74 69 6e 67 2c 20 72 61 6e 64 6f 6d 6c  testing, randoml
10b30 79 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 75  y reverse the ou
10b40 74 70 75 74 20 6f 72 64 65 72 20 66 6f 72 0a 20  tput order for. 
10b50 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73       ** SELECT s
10b60 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 6f  tatements that o
10b70 6d 69 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  mit the ORDER BY
10b80 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 77   clause.  This w
10b90 69 6c 6c 20 68 65 6c 70 0a 20 20 20 20 20 20 2a  ill help.      *
10ba0 2a 20 74 6f 20 66 69 6e 64 20 63 61 73 65 73 20  * to find cases 
10bb0 77 68 65 72 65 0a 20 20 20 20 20 20 2a 2f 0a 20  where.      */. 
10bc0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
10bd0 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
10be0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
10bf0 65 6d 62 65 72 20 74 68 69 73 20 63 61 73 65 20  ember this case 
10c00 69 66 20 69 74 20 69 73 20 74 68 65 20 62 65 73  if it is the bes
10c10 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
10c20 69 66 28 20 63 6f 73 74 3c 70 43 6f 73 74 2d 3e  if( cost<pCost->
10c30 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 70  rCost ){.      p
10c40 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f  Cost->rCost = co
10c50 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  st;.      pCost-
10c60 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  >nRow = nRow;.  
10c70 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
10c80 77 73 46 6c 61 67 73 20 3d 20 77 73 46 6c 61 67  wsFlags = wsFlag
10c90 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  s;.    }.  }..#i
10ca0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10cb0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
10cc0 4e 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  N.  /* Search fo
10cd0 72 20 61 6e 20 4f 52 2d 63 6c 61 75 73 65 20 74  r an OR-clause t
10ce0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
10cf0 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 74  to look up the t
10d00 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 61 73  able..  */.  mas
10d10 6b 53 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70  kSrc = getMask(p
10d20 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
10d30 75 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ur);.  for(i=0, 
10d40 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
10d50 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
10d60 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 57   pTerm++){.    W
10d70 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
10d80 43 3b 0a 20 20 20 20 74 65 6d 70 57 43 20 3d 20  C;.    tempWC = 
10d90 2a 70 57 43 3b 0a 20 20 20 20 69 66 28 20 70 54  *pWC;.    if( pT
10da0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
10db0 57 4f 5f 4f 52 20 0a 20 20 20 20 20 20 20 20 26  WO_OR .        &
10dc0 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  & ((pTerm->prere
10dd0 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29  qAll & ~maskSrc)
10de0 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
10df0 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72          && (pTer
10e00 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
10e10 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
10e20 63 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  c)!=0 ){.      W
10e30 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
10e40 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
10e50 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
10e60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
10e70 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  erm;.      int j
10e80 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 72 74  ;.      int sort
10e90 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
10ea0 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20  double rTotal = 
10eb0 30 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  0;.      nRow = 
10ec0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
10ed0 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  , pOrTerm=pOrWC-
10ee0 3e 61 3b 20 6a 3c 70 4f 72 57 43 2d 3e 6e 54 65  >a; j<pOrWC->nTe
10ef0 72 6d 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d  rm; j++, pOrTerm
10f00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ++){.        Whe
10f10 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74  reCost sTermCost
10f20 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
10f30 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69  RACE(("... Multi
10f40 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e  -index OR testin
10f50 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66  g for term %d of
10f60 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 6a 2c 69 29   %d....\n", j,i)
10f70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10f80 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
10f90 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
10fa0 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
10fb0 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f  se *pAndWC = &pO
10fc0 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
10fd0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20  o->wc;.         
10fe0 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
10ff0 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c  e, pAndWC, pSrc,
11000 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73   notReady, 0, &s
11010 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
11020 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
11030 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
11040 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
11050 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
11060 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
11070 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
11080 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65   1;.          be
11090 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
110a0 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e  &tempWC, pSrc, n
110b0 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65  otReady, 0, &sTe
110c0 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rmCost);.       
110d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
110e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
110f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54      }.        rT
11100 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73  otal += sTermCos
11110 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  t.rCost;.       
11120 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f   nRow += sTermCo
11130 73 74 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  st.nRow;.       
11140 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f   if( rTotal>=pCo
11150 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61  st->rCost ) brea
11160 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11170 20 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30   if( pOrderBy!=0
11180 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11190 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
111a0 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
111b0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26  pWC->pMaskSet, &
111c0 72 65 76 29 20 26 26 20 21 72 65 76 20 29 7b 0a  rev) && !rev ){.
111d0 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 61 62            sortab
111e0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
111f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11200 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a   rTotal += nRow*
11210 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
11220 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
11230 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
11240 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f   increases OR co
11250 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 72  st to %.9g\n", r
11260 54 6f 74 61 6c 29 29 3b 0a 20 20 20 20 20 20 20  Total));.       
11270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11280 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
11290 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
112a0 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
112b0 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %.9g\n",.       
112c0 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61             rTota
112d0 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20  l, nRow));.     
112e0 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73   if( rTotal<pCos
112f0 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  t->rCost ){.    
11300 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
11310 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = rTotal;.     
11320 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d     pCost->nRow =
11330 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
11340 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
11350 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
11360 5f 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  _OR;.        pCo
11370 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  st->plan.u.pTerm
11380 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
11390 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 20 29    if( sortable )
113a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 73  {.          pCos
113b0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
113c0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c  = WHERE_ORDERBY|
113d0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
113e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
113f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
11400 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11410 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
11420 4e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  N */..  /* If th
11430 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20  e pSrc table is 
11440 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
11450 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
11460 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20  hen we may not. 
11470 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78   ** use an index
11480 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e   to satisfy IS N
11490 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
114a0 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20  on that table.  
114b0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63  This is.  ** bec
114c0 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67  ause columns mig
114d0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
114e0 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c  NULL if the tabl
114f0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
11500 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d   -.  ** a circum
11510 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65  stance which the
11520 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65   index cannot he
11530 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20  lp us discover. 
11540 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20   Ticket #2177.. 
11550 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 72 63 2d   */.  if( (pSrc-
11560 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
11570 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 65  EFT)!=0 ){.    e
11580 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
11590 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  Q|WO_IN;.  }else
115a0 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  {.    eqTermMask
115b0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
115c0 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  O_ISNULL;.  }.. 
115d0 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68   /* Look at each
115e0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
115f0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
11600 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
11610 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
11620 7d 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  }.  for(; pProbe
11630 3b 20 70 50 72 6f 62 65 3d 28 70 53 72 63 2d 3e  ; pProbe=(pSrc->
11640 70 49 6e 64 65 78 20 3f 20 30 20 3a 20 70 50 72  pIndex ? 0 : pPr
11650 6f 62 65 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20  obe->pNext)){.  
11660 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69    double inMulti
11670 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20  plier = 1;..    
11680 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11690 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70   index %s:\n", p
116a0 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Probe->zName));.
116b0 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
116c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
116d0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
116e0 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66   that are satisf
116f0 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d  ied.    ** by x=
11700 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73  EXPR constraints
11710 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63   or x IN (...) c
11720 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
11730 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  */.    wsFlags =
11740 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
11750 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
11760 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
11770 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
11780 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
11790 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
117a0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
117b0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  , notReady, eqTe
117c0 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  rmMask, pProbe);
117d0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
117e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
117f0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
11800 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
11810 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
11820 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
11830 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  N ){.        Exp
11840 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
11850 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
11860 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
11870 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
11880 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
11890 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
118a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
118b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
118c0 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a 20  tiplier *= 25;. 
118d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
118e0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
118f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
11900 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78  ultiplier *= pEx
11910 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
11920 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  pr + 1;.        
11930 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11940 20 20 20 20 6e 52 6f 77 20 3d 20 70 50 72 6f 62      nRow = pProb
11950 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a  e->aiRowEst[i] *
11960 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 3b 0a 20   inMultiplier;. 
11970 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
11980 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70   estLog(inMultip
11990 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d  lier);.    nEq =
119a0 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   i;.    if( pPro
119b0 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
119c0 4e 6f 6e 65 20 26 26 20 28 77 73 46 6c 61 67 73  None && (wsFlags
119d0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
119e0 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  IN)==0.         
119f0 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  && nEq==pProbe->
11a00 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
11a10 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
11a20 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  E_UNIQUE;.    }.
11a30 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11a40 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69  "...... nEq=%d i
11a50 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d  nMult=%.9g cost=
11a60 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75  %.9g\n",nEq,inMu
11a70 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74 29 29 3b  ltiplier,cost));
11a80 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  ..    /* Look fo
11a90 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  r range constrai
11aa0 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nts.    */.    i
11ab0 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  f( nEq<pProbe->n
11ac0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
11ad0 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
11ae0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
11af0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
11b00 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
11b10 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
11b20 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
11b30 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_GE, pProbe);.
11b40 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 20        if( pTerm 
11b50 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
11b60 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
11b70 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  MN_RANGE;.      
11b80 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
11b90 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
11ba0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
11bb0 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  LE, pProbe) ){. 
11bc0 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
11bd0 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
11be0 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
11bf0 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
11c00 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20      nRow /= 3;. 
11c10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11c20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
11c30 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
11c40 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
11c50 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
11c60 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
11c70 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  |= WHERE_BTM_LIM
11c80 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  IT;.          co
11c90 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  st /= 3;.       
11ca0 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20     nRow /= 3;.  
11cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11cc0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11cd0 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65  ... range reduce
11ce0 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
11cf0 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
11d00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11d10 20 41 64 64 20 74 68 65 20 61 64 64 69 74 69 6f   Add the additio
11d20 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  nal cost of sort
11d30 69 6e 67 20 69 66 20 74 68 61 74 20 69 73 20 61  ing if that is a
11d40 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a   factor..    */.
11d50 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
11d60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77   ){.      if( (w
11d70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
11d80 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a  OLUMN_IN)==0 &&.
11d90 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72             isSor
11da0 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
11db0 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70  ,pWC->pMaskSet,p
11dc0 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65  Probe,iCur,pOrde
11dd0 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b  rBy,nEq,&rev) ){
11de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 73 46  .        if( wsF
11df0 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
11e00 20 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 57       wsFlags = W
11e10 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
11e20 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
11e30 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
11e40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
11e50 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
11e60 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
11e70 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
11e80 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
11e90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11ea0 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
11eb0 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
11ec0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
11ed0 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65  CE(("...... orde
11ee0 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f  rby increases co
11ef0 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
11f00 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
11f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
11f20 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
11f30 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
11f40 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rder ){.      /*
11f50 20 46 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   For application
11f60 20 74 65 73 74 69 6e 67 2c 20 72 61 6e 64 6f 6d   testing, random
11f70 6c 79 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  ly reverse the o
11f80 75 74 70 75 74 20 6f 72 64 65 72 20 66 6f 72 0a  utput order for.
11f90 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
11fa0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
11fb0 6f 6d 69 74 20 74 68 65 20 4f 52 44 45 52 20 42  omit the ORDER B
11fc0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20  Y clause.  This 
11fd0 77 69 6c 6c 20 68 65 6c 70 0a 20 20 20 20 20 20  will help.      
11fe0 2a 2a 20 74 6f 20 66 69 6e 64 20 63 61 73 65 73  ** to find cases
11ff0 20 77 68 65 72 65 0a 20 20 20 20 20 20 2a 2f 0a   where.      */.
12000 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
12010 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
12020 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
12030 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
12040 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69   can get away wi
12050 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  th using just th
12060 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a  e index without.
12070 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64      ** ever read
12080 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
12090 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
120a0 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20  ase, then halve 
120b0 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
120c0 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
120d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73     */.    if( ws
120e0 46 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63  Flags && pSrc->c
120f0 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d  olUsed < (((Bitm
12100 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
12110 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
12120 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
12130 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
12140 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
12150 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   j<pProbe->nColu
12160 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
12170 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65    int x = pProbe
12180 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
12190 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
121a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
121b0 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
121c0 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
121d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
121e0 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
121f0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
12200 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
12210 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
12220 32 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  2;.        WHERE
12230 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69  TRACE(("...... i
12240 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20  dx-only reduces 
12250 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
12260 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
12270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12280 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73  f this index has
12290 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f   achieved the lo
122a0 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72  west cost so far
122b0 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20  , then use it.. 
122c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73     */.    if( ws
122d0 46 6c 61 67 73 21 3d 30 20 26 26 20 63 6f 73 74  Flags!=0 && cost
122e0 20 3c 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20   < pCost->rCost 
122f0 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  ){.      pCost->
12300 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  rCost = cost;.  
12310 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20      pCost->nRow 
12320 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43  = nRow;.      pC
12330 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
12340 73 20 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20  s = wsFlags;.   
12350 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
12360 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
12370 61 73 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70  assert( pCost->p
12380 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
12390 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
123a0 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
123b0 2e 75 2e 70 49 64 78 20 3d 20 70 50 72 6f 62 65  .u.pIdx = pProbe
123c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
123d0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
123e0 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
123f0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
12400 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73  ags |= eqTermMas
12410 6b 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  k;.  WHERETRACE(
12420 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20  ("best index is 
12430 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 6e  %s, cost=%.9g, n
12440 72 6f 77 3d 25 2e 39 67 2c 20 77 73 46 6c 61 67  row=%.9g, wsFlag
12450 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c  s=%x, nEq=%d\n",
12460 0a 20 20 20 20 20 20 20 20 28 70 43 6f 73 74 2d  .        (pCost-
12470 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
12480 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
12490 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
124a0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
124b0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e  Idx->zName : "(n
124c0 6f 6e 65 29 22 2c 20 70 43 6f 73 74 2d 3e 6e 52  one)", pCost->nR
124d0 6f 77 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ow,.        pCos
124e0 74 2d 3e 72 43 6f 73 74 2c 20 70 43 6f 73 74 2d  t->rCost, pCost-
124f0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
12500 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 29 29  Cost->plan.nEq))
12510 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ;.}.../*.** Disa
12520 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
12530 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
12540 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
12550 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
12560 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
12570 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
12580 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
12590 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
125a0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
125b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
125c0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
125d0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
125e0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
125f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
12600 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
12610 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
12620 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
12630 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
12640 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
12650 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
12660 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
12670 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
12680 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
12690 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
126a0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
126b0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
126c0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
126d0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
126e0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
126f0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
12700 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
12710 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
12720 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
12730 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
12740 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
12750 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
12760 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
12770 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
12780 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
12790 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
127a0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
127b0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
127c0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
127d0 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
127e0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
127f0 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
12800 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
12810 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
12820 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
12830 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
12840 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
12850 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
12860 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
12870 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
12880 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
12890 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
128a0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
128b0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
128c0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
128d0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
128e0 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
128f0 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
12900 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
12910 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
12920 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
12930 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
12940 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
12950 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
12960 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
12970 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
12980 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
12990 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
129a0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
129b0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
129c0 72 6d 0a 20 20 20 20 20 20 26 26 20 41 4c 57 41  rm.      && ALWA
129d0 59 53 28 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  YS((pTerm->wtFla
129e0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
129f0 3d 3d 30 29 0a 20 20 20 20 20 20 26 26 20 28 70  ==0).      && (p
12a00 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
12a10 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
12a20 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
12a30 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
12a40 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  )).  ){.    pTer
12a50 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
12a60 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
12a70 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
12a80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
12a90 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
12aa0 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
12ab0 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
12ac0 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
12ad0 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
12ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
12af0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
12b00 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
12b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12b20 0a 2a 2a 20 41 70 70 6c 79 20 74 68 65 20 61 66  .** Apply the af
12b30 66 69 6e 69 74 69 65 73 20 61 73 73 6f 63 69 61  finities associa
12b40 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
12b50 73 74 20 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  st n columns of 
12b60 69 6e 64 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f  index.** pIdx to
12b70 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74   the values in t
12b80 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
12b90 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
12ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12bb0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
12bc0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
12bd0 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
12be0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
12bf0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
12c00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12c10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 61 73  e->pVdbe;.    as
12c20 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c40 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
12c50 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
12c60 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
12c70 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
12c80 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  x);.    sqlite3E
12c90 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
12ca0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
12cb0 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
12cc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12cd0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
12ce0 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
12cf0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
12d00 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
12d10 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
12d20 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
12d30 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
12d40 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
12d50 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
12d60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
12d70 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
12d80 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
12d90 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
12da0 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
12db0 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
12dc0 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
12dd0 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
12de0 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
12df0 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
12e00 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
12e10 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
12e20 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
12e30 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
12e40 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
12e50 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
12e60 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
12e70 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
12e80 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
12e90 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
12ea0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
12eb0 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
12ec0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
12ed0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
12ee0 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
12ef0 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
12f00 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
12f10 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
12f20 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
12f30 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
12f40 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
12f50 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
12f60 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   on */.  int iTa
12f70 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
12f80 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
12f90 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
12fa0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
12fb0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
12fc0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
12fd0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
12fe0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
12ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13000 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
13010 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
13020 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
13030 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
13040 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
13050 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
13060 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
13070 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
13080 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
13090 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
130a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
130b0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
130c0 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
130d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
130e0 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
130f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13100 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
13110 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
13120 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
13130 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
13140 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20  nLoop *pIn;..   
13150 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
13160 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
13170 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
13180 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
13190 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
131a0 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
131b0 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
131c0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
131d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
131e0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
131f0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
13200 74 28 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58  t((v, "%.*s", pX
13210 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70  ->span.n, pX->sp
13220 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 61 73 73 65  an.z));.    asse
13230 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
13240 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
13250 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20  _IN_ABLE );.    
13260 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
13270 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
13280 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
13290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
132a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
132b0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
132c0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
132d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
132e0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
132f0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
13300 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
13310 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
13320 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
13350 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
13360 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
13370 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
13380 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
13390 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
133a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
133b0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
133c0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
133d0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
133e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
133f0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
13400 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
13410 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
13420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13430 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
13440 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
13450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
13460 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
13470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13480 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
13490 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
134a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
134b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
134c0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
134d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
134e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
134f0 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
13500 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
13510 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
13520 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
13530 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
13540 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13550 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
13560 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
13570 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
13580 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68  an.** index.  Th
13590 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
135a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
135b0 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
135c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ck..**.** For ex
135d0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
135e0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
135f0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
13600 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
13610 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
13620 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
13630 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
13640 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
13650 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
13660 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
13670 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
13680 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
13690 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
136a0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
136b0 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
136c0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
136d0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
136e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
136f0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
13700 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
13710 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
13720 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
13730 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
13740 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
13750 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
13760 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
13770 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
13780 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
13790 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
137a0 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
137b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
137c0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
137d0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
137e0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
137f0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
13800 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
13810 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
13820 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
13830 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
13840 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
13850 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
13860 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
13870 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
13880 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
13890 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
138a0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
138b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
138c0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
138d0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
138e0 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
138f0 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
13900 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
13910 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13920 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
13930 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
13940 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
13950 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
13960 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
13970 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
13980 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
13990 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
139a0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
139b0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
139c0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
139d0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
139e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
139f0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
13a00 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
13a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13a20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13a30 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
13a40 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
13a50 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
13a60 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
13a70 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
13a80 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
13a90 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
13aa0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
13ab0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
13ac0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
13ad0 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
13ae0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
13af0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
13b00 72 61 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  raReg         /*
13b10 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
13b20 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
13b30 6c 6f 63 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  locate */.){.  i
13b40 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
13b50 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20  >plan.nEq;   /* 
13b60 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
13b70 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
13b80 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
13b90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13ba0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
13bb0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
13bc0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13bd0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13bf0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
13c00 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
13c10 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
13c20 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
13c30 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
13c40 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
13c50 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
13c60 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
13c70 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
13c80 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
13c90 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13cc0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
13cd0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
13ce0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
13cf0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
13d00 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
13d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13d20 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
13d30 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
13d40 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
13d50 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
13d60 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
13d70 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
13d80 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ex. */.  assert(
13d90 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
13da0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
13db0 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20  DEXED );.  pIdx 
13dc0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
13dd0 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  .pIdx;..  /* Fig
13de0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
13df0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
13e00 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
13e10 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
13e20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
13e30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
13e40 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65  ;.  nReg = pLeve
13e50 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45  l->plan.nEq + nE
13e60 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
13e70 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
13e80 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
13e90 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
13ea0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
13eb0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
13ec0 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
13ed0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
13ee0 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
13ef0 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
13f00 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
13f10 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
13f20 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
13f30 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
13f40 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
13f50 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  gs, pIdx);.    i
13f60 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d  f( NEVER(pTerm==
13f70 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
13f80 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
13f90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
13fa0 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
13fb0 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
13fc0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
13fd0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67  erm, pLevel, reg
13fe0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
13ff0 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
14000 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
14010 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
14020 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
14030 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
14040 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
14050 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
14060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14080 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
14090 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
140a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
140c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
140d0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
140e0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
140f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14100 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
14110 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14120 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
14130 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
14140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14150 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
14160 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
14170 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
14180 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14190 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a  n regBase;.}../*
141a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
141b0 69 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  if the WhereClau
141c0 73 65 20 70 57 43 20 63 6f 6e 74 61 69 6e 73 20  se pWC contains 
141d0 6e 6f 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a  no terms that.**
141e0 20 61 72 65 20 6e 6f 74 20 76 69 72 74 75 61 6c   are not virtual
141f0 20 61 6e 64 20 77 68 69 63 68 20 68 61 76 65 20   and which have 
14200 6e 6f 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 0a  not been coded..
14210 2a 2a 0a 2a 2a 20 54 6f 20 70 75 74 20 69 74 20  **.** To put it 
14220 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 72 65 74  another way, ret
14230 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 61  urn TRUE if no a
14240 64 64 69 74 69 6f 6e 61 6c 20 57 48 45 52 45 20  dditional WHERE 
14250 63 6c 61 75 73 65 73 0a 2a 2a 20 74 65 73 74 73  clauses.** tests
14260 20 61 72 65 20 72 65 71 75 69 72 65 64 20 69 6e   are required in
14270 20 6f 72 64 65 72 20 74 6f 20 65 73 74 61 62 6c   order to establ
14280 69 73 68 20 74 68 61 74 20 74 68 65 20 63 75 72  ish that the cur
14290 72 65 6e 74 20 72 6f 77 0a 2a 2a 20 73 68 6f 75  rent row.** shou
142a0 6c 64 20 67 6f 20 74 6f 20 6f 75 74 70 75 74 20  ld go to output 
142b0 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
142c0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 73 6f   if there are so
142d0 6d 65 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74  me terms of.** t
142e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
142f0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
14300 76 61 6c 69 64 61 74 65 64 20 62 65 66 6f 72 65  validated before
14310 20 6f 75 74 70 75 74 69 6e 67 20 74 68 65 20 72   outputing the r
14320 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
14330 74 20 77 68 65 72 65 52 6f 77 52 65 61 64 79 46  t whereRowReadyF
14340 6f 72 4f 75 74 70 75 74 28 57 68 65 72 65 43 6c  orOutput(WhereCl
14350 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68  ause *pWC){.  Wh
14360 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
14370 20 20 69 6e 74 20 6a 3b 0a 20 0a 20 20 66 6f 72    int j;. .  for
14380 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
14390 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
143a0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
143b0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
143c0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
143d0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
143e0 44 45 44 29 29 3d 3d 30 20 29 20 72 65 74 75 72  DED))==0 ) retur
143f0 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
14400 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 1;.}../*.** Ge
14410 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
14420 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14430 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
14440 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
14450 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
14460 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
14470 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
14480 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
14490 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
144a0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
144b0 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
144c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
144d0 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
144e0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
144f0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
14500 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
14510 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
14520 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
14530 20 20 75 38 20 77 63 74 72 6c 46 6c 61 67 73 2c    u8 wctrlFlags,
14540 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14550 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
14560 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
14570 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
14580 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
14590 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
145a0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
145b0 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
145c0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
145d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
145e0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
145f0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
14600 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
14610 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
14620 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
14630 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
14640 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
14650 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
14660 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
14670 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
14680 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
14690 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
146a0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
146b0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
146c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
146d0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
146e0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
146f0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
14700 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
14710 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
14720 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
14730 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
14740 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
14750 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
14760 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
14770 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
14780 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
14790 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
147a0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
147b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
147c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
147e0 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
147f0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
14800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14810 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
14820 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
14830 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
14840 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
14850 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
14860 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
14870 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
14880 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
148a0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
148b0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
148c0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
148d0 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
148e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
148f0 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
14900 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
14910 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  e */.  int regRo
14920 77 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 57  wSet;       /* W
14930 72 69 74 65 20 72 6f 77 69 64 73 20 74 6f 20 74  rite rowids to t
14940 68 69 73 20 52 6f 77 53 65 74 20 69 66 20 6e 6f  his RowSet if no
14950 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20  n-negative */.  
14960 69 6e 74 20 63 6f 64 65 52 6f 77 53 65 74 45 61  int codeRowSetEa
14970 72 6c 79 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  rly; /* True if 
14980 69 6e 64 65 78 20 66 75 6c 6c 79 20 63 6f 6e 73  index fully cons
14990 74 72 61 69 6e 73 20 74 68 65 20 73 65 61 72 63  trains the searc
149a0 68 20 2a 2f 0a 20 20 0a 0a 20 20 70 50 61 72 73  h */.  ..  pPars
149b0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
149c0 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
149d0 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
149e0 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20   pWInfo->pWC;.  
149f0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
14a00 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
14a10 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
14a20 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
14a30 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
14a40 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
14a50 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65  ->iCursor;.  bRe
14a60 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  v = (pLevel->pla
14a70 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
14a80 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20  E_REVERSE)!=0;. 
14a90 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
14aa0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
14ab0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
14ac0 4e 4c 59 29 21 3d 30 3b 0a 20 20 72 65 67 52 6f  NLY)!=0;.  regRo
14ad0 77 53 65 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 72  wSet = pWInfo->r
14ae0 65 67 52 6f 77 53 65 74 3b 0a 20 20 63 6f 64 65  egRowSet;.  code
14af0 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30 3b  RowSetEarly = 0;
14b00 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
14b10 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
14b20 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
14b30 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
14b40 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
14b50 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
14b60 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
14b70 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
14b80 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
14b90 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
14ba0 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
14bb0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
14bc0 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
14bd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
14be0 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
14bf0 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
14c00 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
14c10 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
14c20 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
14c30 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
14c40 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
14c50 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
14c60 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
14c70 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
14c80 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
14c90 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
14ca0 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
14cb0 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
14cc0 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
14cd0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
14ce0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
14cf0 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
14d00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14d10 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
14d20 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
14d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14d40 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
14d50 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
14d60 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
14d70 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
14d80 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
14d90 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
14da0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
14db0 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
14dc0 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
14dd0 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
14de0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
14df0 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
14e00 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
14e10 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
14e20 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
14e30 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
14e40 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
14e50 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
14e60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
14e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
14e90 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
14ea0 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
14eb0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
14ec0 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
14ed0 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
14ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ef0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14f00 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d  .  if(  (pLevel-
14f10 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
14f20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
14f30 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
14f40 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
14f50 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
14f60 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
14f70 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
14f80 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
14f90 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
14fa0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
14fb0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
14fc0 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
14fd0 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
14fe0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14ff0 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70  fo *pVtabIdx = p
15000 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56  Level->plan.u.pV
15010 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20  tabIdx;.    int 
15020 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56  nConstraint = pV
15030 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  tabIdx->nConstra
15040 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  int;.    struct 
15050 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
15060 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
15070 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  aUsage =.       
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
150b0 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
150c0 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  age;.    const s
150d0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
150e0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
150f0 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20  aConstraint =.  
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
15130 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
15140 69 6e 74 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d  int;..    iReg =
15150 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15160 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
15170 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
15180 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15190 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
151a0 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e  for(j=1; j<=nCon
151b0 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
151c0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
151d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b  nConstraint; k++
151e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
151f0 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64  Usage[k].argvInd
15200 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  ex==j ){.       
15210 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
15220 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54  Constraint[k].iT
15230 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
15240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15250 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
15260 61 63 68 65 20 29 3b 0a 20 20 20 20 20 20 20 20  ache );.        
15270 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15280 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61  e(pParse, pWC->a
15290 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70  [iTerm].pExpr->p
152a0 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29  Right, iReg+j+1)
152b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
152c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
152d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
152e0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
152f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15300 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
15310 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15320 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
15330 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
15340 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  -;.    sqlite3Vd
15350 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15360 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64 78  nteger, pVtabIdx
15370 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  ->idxNum, iReg);
15380 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
153a0 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b  eger, j-1, iReg+
153b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
153c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
153d0 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61  VFilter, iCur, a
153e0 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56  ddrBrk, iReg, pV
153f0 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a  tabIdx->idxStr,.
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15410 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
15420 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
15430 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
15440 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
15450 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f  pVtabIdx->needTo
15460 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
15470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
15480 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
15490 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55 73 61  {.      if( aUsa
154a0 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20  ge[j].omit ){.  
154b0 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
154c0 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d  = aConstraint[j]
154d0 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
154e0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
154f0 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e  m(pLevel, &pWC->
15500 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20  a[iTerm]);.     
15510 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
15520 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65  vel->op = OP_VNe
15530 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
15540 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
15550 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
15560 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15570 64 72 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 52  dr(v);.    codeR
15580 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67  owSetEarly = reg
15590 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72  RowSet>=0 ? wher
155a0 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70  eRowReadyForOutp
155b0 75 74 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20  ut(pWC) : 0;.   
155c0 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45   if( codeRowSetE
155d0 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71  arly ){.      sq
155e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
155f0 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43  v, OP_VRowid, iC
15600 75 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ur, iReg);.     
15610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15620 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41  p2(v, OP_RowSetA
15630 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 69  dd, regRowSet, i
15640 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Reg);.    }.    
15650 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15660 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
15670 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
15680 74 2b 32 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  t+2);.  }else.#e
15690 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
156a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
156b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65   */..  if( pLeve
156c0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
156d0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
156e0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
156f0 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
15700 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
15710 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
15720 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
15730 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
15740 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
15750 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
15760 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
15770 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
15780 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
15790 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
157a0 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
157b0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
157c0 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ct..    */.    i
157d0 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 72  nt r1;.    int r
157e0 74 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tmp = sqlite3Get
157f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15800 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
15810 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
15820 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15830 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
15840 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
15850 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
15860 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
15870 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
15880 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
15890 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
158a0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
158b0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31  ble==0 );.    r1
158c0 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
158d0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
158e0 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29  m, pLevel, rtmp)
158f0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
15900 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
15910 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
15930 74 42 65 49 6e 74 2c 20 72 31 2c 20 61 64 64 72  tBeInt, r1, addr
15940 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
15950 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15960 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
15970 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 31 29 3b  r, addrNxt, r1);
15980 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45  .    codeRowSetE
15990 61 72 6c 79 20 3d 20 28 70 57 43 2d 3e 6e 54 65  arly = (pWC->nTe
159a0 72 6d 3d 3d 31 20 26 26 20 72 65 67 52 6f 77 53  rm==1 && regRowS
159b0 65 74 3e 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20  et>=0) ?1:0;.   
159c0 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45   if( codeRowSetE
159d0 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71  arly ){.      sq
159e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
159f0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c  v, OP_RowSetAdd,
15a00 20 72 65 67 52 6f 77 53 65 74 2c 20 72 31 29 3b   regRowSet, r1);
15a10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15a20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15a30 28 70 50 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a  (pParse, rtmp);.
15a40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
15a50 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
15a60 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
15a70 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
15a80 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
15a90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
15aa0 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
15ab0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
15ac0 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
15ad0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
15ae0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
15af0 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
15b00 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
15b10 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
15b20 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
15b30 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
15b40 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
15b50 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
15b60 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
15b70 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
15b80 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
15b90 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
15ba0 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
15bb0 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
15bc0 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
15bd0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
15be0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
15bf0 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_LE, 0);.    if
15c00 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
15c10 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
15c20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
15c30 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
15c40 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
15c50 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
15c60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c80 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
15c90 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
15ca0 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
15cb0 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
15cc0 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
15cd0 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
15ce0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
15cf0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
15d00 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
15d10 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
15d20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
15d30 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
15d40 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
15d50 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
15d60 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
15d70 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
15d80 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
15d90 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
15da0 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
15db0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
15dc0 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
15dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
15de0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
15df0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
15e00 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
15e10 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
15e20 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
15e30 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
15e40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15e50 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
15e60 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
15e70 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
15e80 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
15e90 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
15ea0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
15eb0 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
15ec0 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
15ed0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
15ee0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
15ef0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
15f00 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58  ct. */..      pX
15f10 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
15f20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15f30 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
15f40 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
15f50 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
15f60 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15f70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15f80 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
15f90 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
15fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15fb0 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
15fc0 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
15fd0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
15fe0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
15ff0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
16000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16010 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
16020 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
16030 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
16040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16050 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
16060 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
16070 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
16080 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
16090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
160a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
160b0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
160c0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
160d0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
160e0 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
160f0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
16100 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
16110 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
16120 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
16130 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
16140 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
16150 75 72 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  ur );.      memE
16160 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
16170 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
16180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
16190 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
161a0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
161b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
161c0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
161d0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
161e0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
161f0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
16200 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
16210 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
16220 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
16230 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
16240 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
16250 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
16260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
16270 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
16280 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16290 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
162a0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
162b0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
162c0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
162d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
162e0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 70 4c 65  = start;.    pLe
162f0 76 65 6c 2d 3e 70 35 20 3d 20 28 70 53 74 61 72  vel->p5 = (pStar
16300 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 29  t==0 && pEnd==0)
16310 20 3f 31 3a 30 3b 0a 20 20 20 20 63 6f 64 65 52   ?1:0;.    codeR
16320 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67  owSetEarly = reg
16330 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72  RowSet>=0 ? wher
16340 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70  eRowReadyForOutp
16350 75 74 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20  ut(pWC) : 0;.   
16360 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45   if( codeRowSetE
16370 61 72 6c 79 20 7c 7c 20 74 65 73 74 4f 70 21 3d  arly || testOp!=
16380 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
16390 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
163a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
163b0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
163c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
163d0 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
163e0 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  r1);.      if( t
163f0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
16400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16410 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
16420 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
16430 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ue, addrBrk, r1)
16440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16450 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
16460 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
16470 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
16480 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
16490 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  }.      if( code
164a0 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20  RowSetEarly ){. 
164b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
164c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
164d0 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77  owSetAdd, regRow
164e0 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Set, r1);.      
164f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
16500 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16510 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 7d  arse, r1);.    }
16520 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
16530 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
16540 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
16550 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
16560 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
16570 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61  /* Case 3: A sca
16580 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
16590 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
165a0 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
165b0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
165c0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
165d0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
165e0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
165f0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
16600 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
16610 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
16620 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
16630 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
16640 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
16650 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
16660 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16670 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
16680 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
16690 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
166a0 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
166b0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
166c0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
166d0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
166e0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
166f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
16700 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
16710 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
16720 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
16730 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
16740 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
16750 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
16760 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
16770 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
16780 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
16790 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
167a0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
167b0 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
167c0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
167d0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
167e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
167f0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
16800 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
16810 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
16820 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
16830 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
16840 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
16850 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
16860 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16870 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
16880 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
16890 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
168a0 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
168b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
168c0 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
168d0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
168e0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
168f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16900 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
16910 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
16920 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
16930 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
16940 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
16950 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
16960 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
16970 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
16980 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
16990 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
169a0 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
169b0 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
169c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
169d0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
169e0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
169f0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
16a00 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
16a10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
16a20 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
16a30 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
16a40 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
16a50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
16a60 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
16a70 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
16a80 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
16a90 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 69  ..    */  .    i
16aa0 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  nt aStartOp[] = 
16ab0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
16ac0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
16ad0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
16ae0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
16af0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
16b00 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
16b10 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b30 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
16b40 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
16b50 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
16b60 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
16b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
16b80 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
16b90 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
16ba0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
16bb0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
16bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
16bd0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
16be0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
16bf0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
16c00 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
16c10 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
16c20 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
16c30 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
16c40 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
16c50 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
16c60 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
16c70 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
16c80 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
16c90 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
16ca0 20 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20     int aEndOp[] 
16cb0 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  = {.      OP_Noo
16cc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16cd0 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
16ce0 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
16cf0 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
16d00 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
16d10 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
16d20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
16d30 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20  OP_IdxLT        
16d40 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
16d50 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62  constraints && b
16d60 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
16d70 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
16d80 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20  vel->plan.nEq;. 
16d90 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72     int isMinQuer
16da0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
16db0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
16dc0 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43   optimized SELEC
16dd0 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20  T min(x).. */.  
16de0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e00 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
16e10 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
16e20 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
16e30 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e50 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
16e60 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
16e70 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
16e80 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
16e90 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
16ea0 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
16eb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
16ec0 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
16ed0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
16ee0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
16ef0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
16f00 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
16f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16f20 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
16f30 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
16f40 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
16f50 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
16f60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16f70 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
16f80 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
16f90 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
16fa0 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
16fb0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
16fc0 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
16fd0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
16fe0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
16ff0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17000 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
17010 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
17020 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
17030 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
17040 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
17050 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
17060 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
17070 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
17080 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
17090 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
170a0 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
170b0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
170c0 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
170d0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
170e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
170f0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
17100 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
17110 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
17120 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
17130 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
17140 20 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69      k = pIdx->ai
17150 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20  Column[nEq];    
17160 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69   /* Column for i
17170 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
17180 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  aints */..    /*
17190 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
171a0 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
171b0 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
171c0 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
171d0 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
171e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
171f0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
17200 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
17210 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
17220 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
17230 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
17240 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
17250 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
17260 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
17270 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
17280 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
17290 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
172a0 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
172b0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
172c0 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
172d0 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
172e0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
172f0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
17300 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17310 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
17320 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
17330 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
17340 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
17350 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
17360 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
17370 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
17380 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
17390 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
173a0 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20  ERE_ORDERBY).   
173b0 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
173c0 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
173d0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
173e0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
173f0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
17400 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
17410 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
17420 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
17430 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
17440 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
17450 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
17460 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
17470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
17480 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
17490 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
174a0 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
174b0 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
174c0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
174d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
174e0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
174f0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
17500 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
17510 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
17520 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
17530 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
17540 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
17550 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
17560 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17570 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
17580 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
17590 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
175a0 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
175b0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
175c0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
175d0 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
175e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
175f0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
17600 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
17610 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
17620 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
17630 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
17640 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
17650 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
17660 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
17670 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
17680 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
17690 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
176a0 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
176b0 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
176c0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
176d0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
176e0 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64  el, pWC, notRead
176f0 79 2c 20 6e 45 78 74 72 61 52 65 67 29 3b 0a 20  y, nExtraReg);. 
17700 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
17710 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 0a  vel->addrNxt;...
17720 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17730 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
17740 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
17750 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
17760 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
17770 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
17780 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
17790 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
177a0 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
177b0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
177c0 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
177d0 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
177e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
177f0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
17800 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
17810 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b  QLITE_SO_ASC) ){
17820 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
17830 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
17840 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
17850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
17860 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
17870 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
17880 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
17890 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_LE );.    test
178a0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
178b0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
178c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
178d0 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _GE );.    testc
178e0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
178f0 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
17900 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
17910 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17920 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
17930 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
17940 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
17950 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
17960 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
17970 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
17980 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
17990 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
179a0 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
179b0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
179c0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
179d0 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
179e0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
179f0 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
17a00 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
17a10 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
17a20 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17a30 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
17a40 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
17a50 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
17a60 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
17a70 20 20 20 69 6e 74 20 64 63 63 20 3d 20 70 50 61     int dcc = pPa
17a80 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17a90 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ache;.      if( 
17aa0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
17ab0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
17ac0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
17ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
17af0 61 72 73 65 2c 20 70 52 61 6e 67 65 53 74 61 72  arse, pRangeStar
17b00 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
17b10 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
17b20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
17b30 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20  sableColCache = 
17b40 64 63 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dcc;.      sqlit
17b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17b60 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
17b70 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
17b80 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
17b90 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  int++;.    }else
17ba0 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
17bb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17bd0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
17be0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
17bf0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
17c00 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
17c10 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
17c20 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
17c30 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
17c40 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
17c50 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
17c60 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20 20  raint, pIdx);.  
17c70 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
17c80 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
17c90 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
17ca0 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
17cb0 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
17cc0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
17cd0 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
17ce0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17cf0 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
17d00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17d10 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
17d20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17d30 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
17d40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17d50 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
17d60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17d70 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
17d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d90 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  4(v, op, iIdxCur
17da0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
17db0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
17dc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17dd0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f  E_INT_TO_PTR(nCo
17de0 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e  nstraint), P4_IN
17df0 54 33 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  T32);..    /* Lo
17e00 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
17e10 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
17e20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
17e30 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
17e40 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
17e50 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
17e60 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
17e70 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
17e80 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  End ){.      sql
17e90 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
17ea0 72 73 65 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  rse, pRangeEnd->
17eb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72  pExpr->pRight, r
17ec0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
17ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17ee0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
17ef0 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
17f00 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
17f10 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
17f20 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
17f30 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64 78 29 3b  e, nEq+1, pIdx);
17f40 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
17f50 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nt++;.    }..   
17f60 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
17f70 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
17f80 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
17f90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
17fa0 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  ddr(v);..    /* 
17fb0 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64  Check if the ind
17fc0 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  ex cursor is pas
17fd0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17fe0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f   range. */.    o
17ff0 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e  p = aEndOp[(pRan
18000 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20  geEnd || nEq) * 
18010 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20  (1 + bRev)];.   
18020 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
18030 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65  P_Noop );.    te
18040 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
18050 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  dxGE );.    test
18060 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
18070 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  LT );.    if( op
18080 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
18090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
180a0 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
180b0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
180c0 67 42 61 73 65 2c 0a 20 20 20 20 20 20 20 20 20  gBase,.         
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
180e0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
180f0 28 6e 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50  (nConstraint), P
18100 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
18110 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18120 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
18130 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
18140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
18150 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
18160 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
18170 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
18180 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
18190 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
181a0 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
181b0 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
181c0 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
181d0 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
181e0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
181f0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
18200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
18210 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18220 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18230 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
18240 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
18250 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
18260 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
18270 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
18280 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
18290 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  OP_LIMIT );.    
182a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
182b0 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
182c0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
182d0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
182e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
182f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
18300 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
18310 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
18320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18330 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18340 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
18350 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b    }..    /* Seek
18360 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
18370 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
18380 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
18390 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
183a0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
183b0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
183c0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
183d0 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
183e0 3d 20 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f  = regRowSet>=0 ?
183f0 20 77 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f   whereRowReadyFo
18400 72 4f 75 74 70 75 74 28 70 57 43 29 20 3a 20 30  rOutput(pWC) : 0
18410 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
18420 61 62 6c 65 20 7c 7c 20 63 6f 64 65 52 6f 77 53  able || codeRowS
18430 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20  etEarly ){.     
18440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18450 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
18460 64 2c 20 69 49 64 78 43 75 72 2c 20 72 31 29 3b  d, iIdxCur, r1);
18470 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 52  .      if( codeR
18480 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20  owSetEarly ){.  
18490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
184a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
184b0 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53  wSetAdd, regRowS
184c0 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  et, r1);.      }
184d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
184e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
184f0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
18500 2c 20 72 31 29 3b 20 20 2f 2a 20 44 65 66 65 72  , r1);  /* Defer
18510 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
18520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
18530 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18540 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
18550 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
18560 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
18570 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
18580 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
18590 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
185a0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
185b0 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
185c0 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
185d0 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
185e0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
185f0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
18600 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
18610 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
18620 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  r;.  }else..#ifn
18630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18640 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
18650 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
18660 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
18670 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
18680 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
18690 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
186a0 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
186b0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
186c0 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
186d0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
186e0 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
186f0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
18700 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
18710 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
18720 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
18730 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
18740 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
18750 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
18760 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
18770 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
18780 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
18790 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
187a0 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
187b0 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
187c0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
187d0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
187e0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
187f0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
18800 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
18810 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 63 6f  f the loop is co
18820 6e 73 74 72 75 63 74 65 64 20 62 79 20 63 72 65  nstructed by cre
18830 61 74 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  ating a RowSet o
18840 62 6a 65 63 74 0a 20 20 20 20 2a 2a 20 61 6e 64  bject.    ** and
18850 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 2e 20   populating it. 
18860 20 54 68 65 6e 20 6c 6f 6f 70 69 6e 67 20 6f 76   Then looping ov
18870 65 72 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  er elements of t
18880 68 65 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  he rowset..    *
18890 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
188a0 4e 75 6c 6c 20 31 0a 20 20 20 20 2a 2a 20 20 20  Null 1.    **   
188b0 20 20 20 20 20 23 20 66 69 6c 6c 20 52 6f 77 53       # fill RowS
188c0 65 74 20 31 20 77 69 74 68 20 65 6e 74 72 69 65  et 1 with entrie
188d0 73 20 77 68 65 72 65 20 61 3d 35 20 75 73 69 6e  s where a=5 usin
188e0 67 20 69 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  g i1.    **     
188f0 20 20 20 23 20 66 69 6c 6c 20 52 6f 77 73 65 74     # fill Rowset
18900 20 31 20 77 69 74 68 20 65 6e 74 72 69 65 73 20   1 with entries 
18910 77 68 65 72 65 20 62 3d 37 20 75 73 69 6e 67 20  where b=7 using 
18920 69 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  i2.    **       
18930 20 23 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31   # fill Rowset 1
18940 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68   with entries wh
18950 65 72 65 20 63 3d 31 31 20 61 6e 64 20 64 3d 31  ere c=11 and d=1
18960 33 20 69 33 20 61 6e 64 20 74 31 0a 20 20 20 20  3 i3 and t1.    
18970 2a 2a 20 20 20 20 20 41 3a 20 52 6f 77 53 65 74  **     A: RowSet
18980 52 65 61 64 20 31 2c 20 42 2c 20 32 0a 20 20 20  Read 1, B, 2.   
18990 20 2a 2a 20 20 20 20 20 20 20 20 53 65 65 6b 20   **        Seek 
189a0 20 20 20 20 20 20 69 2c 20 32 0a 20 20 20 20 2a        i, 2.    *
189b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6f 74  *.    ** The bot
189c0 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  tom of the loop 
189d0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
189e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
189f0 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
18a00 20 30 2c 20 41 0a 20 20 20 20 2a 2a 20 20 20 20   0, A.    **    
18a10 20 42 3a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   B:.    */.    i
18a20 6e 74 20 72 65 67 4f 72 52 6f 77 73 65 74 3b 20  nt regOrRowset; 
18a30 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
18a40 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 52 6f  r holding the Ro
18a50 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  wSet object */. 
18a60 20 20 20 69 6e 74 20 72 65 67 4e 65 78 74 52 6f     int regNextRo
18a70 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  wid;      /* Reg
18a80 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6e 65  ister holding ne
18a90 78 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  xt rowid */.    
18aa0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
18ab0 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
18ac0 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
18ad0 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
18ae0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
18af0 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 2f  m *pOrTerm;    /
18b00 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
18b10 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f 52  rm within the OR
18b20 2d 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 53  -clause */.    S
18b30 72 63 4c 69 73 74 20 6f 6e 65 54 61 62 3b 20 20  rcList oneTab;  
18b40 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e        /* Shorten
18b50 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 2a 2f  ed table list */
18b60 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
18b70 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
18b80 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72  pTerm;.    asser
18b90 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
18ba0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
18bb0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
18bc0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
18bd0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
18be0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
18bf0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
18c00 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
18c10 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 63 6f  Info->wc;.    co
18c20 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20  deRowSetEarly = 
18c30 28 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 26 26  (regRowSet>=0 &&
18c40 20 70 57 43 2d 3e 6e 54 65 72 6d 3d 3d 31 29 20   pWC->nTerm==1) 
18c50 3f 31 3a 30 3b 0a 0a 20 20 20 20 69 66 28 20 63  ?1:0;..    if( c
18c60 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29  odeRowSetEarly )
18c70 7b 0a 20 20 20 20 20 20 72 65 67 4f 72 52 6f 77  {.      regOrRow
18c80 73 65 74 20 3d 20 72 65 67 52 6f 77 53 65 74 3b  set = regRowSet;
18c90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18ca0 20 20 72 65 67 4f 72 52 6f 77 73 65 74 20 3d 20    regOrRowset = 
18cb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
18cc0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
18cd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ce0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
18cf0 2c 20 72 65 67 4f 72 52 6f 77 73 65 74 29 3b 0a  , regOrRowset);.
18d00 20 20 20 20 7d 0a 20 20 20 20 6f 6e 65 54 61 62      }.    oneTab
18d10 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6f  .nSrc = 1;.    o
18d20 6e 65 54 61 62 2e 6e 41 6c 6c 6f 63 20 3d 20 31  neTab.nAlloc = 1
18d30 3b 0a 20 20 20 20 6f 6e 65 54 61 62 2e 61 5b 30  ;.    oneTab.a[0
18d40 5d 20 3d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20  ] = *pTabItem;. 
18d50 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 4f 72 54     for(j=0, pOrT
18d60 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 6a 3c  erm=pOrWc->a; j<
18d70 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  pOrWc->nTerm; j+
18d80 2b 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  +, pOrTerm++){. 
18d90 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
18da0 70 53 75 62 57 49 6e 66 6f 3b 0a 20 20 20 20 20  pSubWInfo;.     
18db0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
18dc0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 26  ftCursor!=iCur &
18dd0 26 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  & pOrTerm->eOper
18de0 61 74 6f 72 21 3d 57 4f 5f 41 4e 44 20 29 20 63  ator!=WO_AND ) c
18df0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
18e00 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
18e10 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
18e20 72 73 65 2c 20 26 6f 6e 65 54 61 62 2c 20 70 4f  rse, &oneTab, pO
18e30 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c  rTerm->pExpr, 0,
18e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e50 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
18e60 49 4c 4c 5f 52 4f 57 53 45 54 20 7c 20 57 48 45  ILL_ROWSET | WHE
18e70 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57  RE_OMIT_OPEN | W
18e80 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 2c  HERE_OMIT_CLOSE,
18e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ea0 20 20 20 20 20 20 20 20 20 72 65 67 4f 72 52 6f           regOrRo
18eb0 77 73 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  wset);.      if(
18ec0 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
18ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
18ee0 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
18ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18f10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
18f20 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
18f30 28 20 21 63 6f 64 65 52 6f 77 53 65 74 45 61 72  ( !codeRowSetEar
18f40 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67 4e  ly ){.      regN
18f50 65 78 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  extRowid = sqlit
18f60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18f70 72 73 65 29 3b 0a 20 20 20 20 20 20 61 64 64 72  rse);.      addr
18f80 43 6f 6e 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Cont = .        
18f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18fa0 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 52  p3(v, OP_RowSetR
18fb0 65 61 64 2c 20 72 65 67 4f 72 52 6f 77 73 65 74  ead, regOrRowset
18fc0 2c 61 64 64 72 42 72 6b 2c 72 65 67 4e 65 78 74  ,addrBrk,regNext
18fd0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
18fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18ff0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
19000 2c 20 72 65 67 4e 65 78 74 52 6f 77 69 64 29 3b  , regNextRowid);
19010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19020 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19030 72 73 65 2c 20 72 65 67 4e 65 78 74 52 6f 77 69  rse, regNextRowi
19040 64 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  d);.      /* sql
19050 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19060 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 4f 72  eg(pParse, regOr
19070 52 6f 77 73 65 74 29 3b 20 2f 2f 20 50 72 65 73  Rowset); // Pres
19080 65 72 76 65 20 74 68 65 20 52 6f 77 53 65 74 20  erve the RowSet 
19090 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
190a0 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
190b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
190c0 3d 20 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  = addrCont;.    
190d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
190e0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
190f0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73  p;.    }.    dis
19100 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
19110 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   pTerm);.  }else
19120 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19130 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
19140 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20  ZATION */..  {. 
19150 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
19160 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
19170 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
19180 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
19190 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
191a0 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
191b0 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  re table..    */
191c0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
191d0 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b  t u8 aStep[] = {
191e0 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65   OP_Next, OP_Pre
191f0 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  v };.    static 
19200 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b  const u8 aStart[
19210 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c  ] = { OP_Rewind,
19220 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20   OP_Last };.    
19230 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
19240 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20  || bRev==1 );.  
19250 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
19260 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  ble==0 );.    pL
19270 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
19280 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
19290 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
192a0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
192b0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
192c0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
192d0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
192e0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
192f0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
19300 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
19310 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 63 6f 64  AN_STEP;.    cod
19320 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30  eRowSetEarly = 0
19330 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79  ;.  }.  notReady
19340 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
19350 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
19360 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
19370 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
19380 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
19390 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
193a0 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
193b0 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
193c0 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
193d0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20  ables..  */.  k 
193e0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
193f0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
19400 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
19410 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
19420 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
19430 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
19440 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19450 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
19460 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
19470 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
19480 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
19490 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
194a0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
194b0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
194c0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
194d0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
194e0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
194f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
19500 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
19510 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
19520 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
19530 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
19540 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
19550 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
19560 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  in) ){.      con
19570 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
19580 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
19590 43 6f 6c 43 61 63 68 65 20 2b 3d 20 6b 3b 0a 20  ColCache += k;. 
195a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
195b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
195c0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
195d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
195e0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
195f0 62 6c 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b  bleColCache -= k
19600 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20  ;.    k = 1;.   
19610 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
19620 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
19630 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
19640 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
19650 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
19660 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
19670 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
19680 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
19690 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
196a0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
196b0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
196c0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
196d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
196e0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
196f0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
19700 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19710 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
19720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19730 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
19740 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
19750 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
19760 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
19770 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
19780 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19790 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65  ClearColumnCache
197a0 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d  (pParse, pLevel-
197b0 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 73  >iTabCur);.    s
197c0 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
197d0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
197e0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
197f0 75 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  ur);.    for(pTe
19800 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
19810 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
19820 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
19830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
19840 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19850 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
19860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19870 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19880 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
19890 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
198a0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
198b0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
198c0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
198d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
198e0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
198f0 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69  eady)!=0 ) conti
19900 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
19910 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
19920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19930 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
19940 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
19950 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
19960 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
19970 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
19980 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
19990 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
199a0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 77   /*.  ** If it w
199b0 61 73 20 72 65 71 75 65 73 74 65 64 20 74 6f 20  as requested to 
199c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
199d0 73 20 69 6e 20 61 20 72 6f 77 73 65 74 20 61 6e  s in a rowset an
199e0 64 20 74 68 61 74 20 68 61 73 0a 20 20 2a 2a 20  d that has.  ** 
199f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
19a00 20 64 6f 2c 20 74 68 65 6e 20 64 6f 20 73 6f 20   do, then do so 
19a10 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
19a20 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20  regRowSet>=0 && 
19a30 21 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79  !codeRowSetEarly
19a40 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
19a50 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19a60 65 67 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  eg(pParse);.#ifn
19a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19a80 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
19a90 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
19aa0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
19ab0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19ac0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
19ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19ae0 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43  v, OP_VRowid, iC
19af0 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 7d 65 6c  ur, r1);.    }el
19b00 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
19b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19b20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
19b30 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a  wid, iCur, r1);.
19b40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19b60 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67  P_RowSetAdd, reg
19b70 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20  RowSet, r1);.   
19b80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19b90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19ba0 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  1);.  }..  retur
19bb0 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  n notReady;.}..#
19bc0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19bd0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
19be0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
19bf0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
19c00 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
19c10 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
19c20 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
19c30 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
19c40 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
19c50 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
19c60 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
19c70 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
19c80 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
19c90 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
19ca0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
19cb0 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
19cc0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
19cd0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
19ce0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
19cf0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
19d00 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
19d10 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19d30 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
19d40 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
19d50 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
19d60 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
19d70 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
19d80 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
19d90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
19da0 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
19db0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
19dc0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
19dd0 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
19de0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
19df0 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
19e00 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
19e10 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
19e20 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  _info *pInfo = p
19e30 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78  WInfo->a[i].pIdx
19e40 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
19e50 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  pInfo ){.       
19e60 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
19e70 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19e80 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
19e90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
19ea0 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
19eb0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
19ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
19ed0 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
19ee0 69 64 78 53 74 72 29 3b 0a 09 7d 0a 20 20 20 20  idxStr);..}.    
19ef0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19f00 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  e(db, pInfo);.  
19f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19f20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
19f30 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
19f40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19f50 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
19f60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
19f70 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
19f80 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
19f90 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
19fa0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
19fb0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
19fc0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
19fd0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
19fe0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
19ff0 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
1a000 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
1a010 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
1a020 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
1a030 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
1a040 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
1a050 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1a060 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
1a070 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
1a080 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1a090 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
1a0a0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
1a0b0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
1a0c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1a0d0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
1a0e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
1a0f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
1a100 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
1a110 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
1a120 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
1a130 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
1a140 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1a150 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
1a160 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
1a170 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
1a180 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
1a190 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
1a1a0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
1a1b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a1c0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
1a1d0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
1a1e0 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
1a1f0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1a200 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
1a210 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
1a220 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
1a230 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
1a240 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
1a250 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1a260 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
1a270 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
1a280 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
1a290 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
1a2a0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
1a2b0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
1a2c0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
1a2d0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
1a2e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
1a2f0 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
1a300 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
1a310 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
1a340 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
1a350 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
1a360 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
1a370 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
1a380 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
1a3b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
1a3c0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
1a3d0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
1a3e0 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
1a3f0 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
1a400 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a410 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
1a420 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
1a430 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
1a440 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
1a450 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
1a460 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
1a470 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
1a480 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
1a490 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
1a4a0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
1a4b0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
1a4c0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
1a4d0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
1a4e0 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
1a4f0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a500 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
1a510 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
1a520 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
1a530 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
1a540 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
1a550 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
1a560 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
1a570 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
1a580 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
1a590 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
1a5a0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
1a5b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1a5c0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
1a5d0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
1a5e0 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
1a5f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
1a600 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
1a610 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
1a620 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1a630 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
1a640 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
1a650 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
1a660 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
1a670 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
1a680 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
1a690 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
1a6a0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
1a6b0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
1a6c0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
1a6d0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
1a6e0 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
1a6f0 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
1a700 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
1a710 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
1a720 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
1a730 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
1a740 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
1a750 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
1a760 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
1a770 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
1a780 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
1a790 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
1a7a0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
1a7b0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
1a7c0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
1a7d0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
1a7e0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
1a7f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
1a800 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
1a810 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
1a820 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
1a830 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
1a840 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
1a850 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
1a860 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
1a870 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
1a880 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
1a890 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
1a8a0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
1a8b0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
1a8c0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
1a8d0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
1a8e0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
1a8f0 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
1a900 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
1a910 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
1a920 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
1a930 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
1a940 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
1a950 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
1a960 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
1a970 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
1a980 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
1a990 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
1a9a0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
1a9b0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
1a9c0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
1a9d0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
1a9e0 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
1a9f0 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
1aa00 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
1aa10 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
1aa20 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
1aa30 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1aa40 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
1aa50 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
1aa60 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
1aa70 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
1aa80 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
1aa90 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
1aaa0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
1aab0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
1aac0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
1aad0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
1aae0 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
1aaf0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
1ab00 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
1ab10 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
1ab20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
1ab30 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
1ab40 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
1ab50 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
1ab60 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
1ab70 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
1ab80 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
1ab90 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
1aba0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
1abb0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
1abc0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
1abd0 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
1abe0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
1abf0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
1ac00 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1ac10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
1ac20 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1ac30 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
1ac40 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
1ac50 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
1ac60 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1ac70 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
1ac80 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
1ac90 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
1aca0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
1acb0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
1acc0 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
1acd0 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
1ace0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
1acf0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
1ad00 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
1ad10 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
1ad20 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
1ad30 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
1ad40 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
1ad50 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1ad60 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
1ad70 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
1ad80 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
1ad90 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
1ada0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1adb0 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
1adc0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1add0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
1ade0 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
1adf0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1ae00 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
1ae10 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
1ae20 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
1ae30 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
1ae40 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
1ae50 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
1ae60 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
1ae70 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
1ae80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1ae90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1aea0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
1aeb0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1aec0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1aed0 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
1aee0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
1aef0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
1af00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1af10 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
1af20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1af30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
1af40 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
1af50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1af60 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  , or NULL */.  u
1af70 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  8 wctrlFlags,   
1af80 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1af90 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
1afa0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
1afb0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
1afc0 20 72 65 67 52 6f 77 53 65 74 20 20 20 20 20 20   regRowSet      
1afd0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1afe0 6f 6c 64 20 52 6f 77 53 65 74 20 69 66 20 57 48  old RowSet if WH
1aff0 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20  ERE_FILL_ROWSET 
1b000 69 73 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69  is set */.){.  i
1b010 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1b030 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
1b040 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1b050 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
1b060 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
1b070 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
1b080 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
1b090 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b0a0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
1b0b0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
1b0c0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
1b0d0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
1b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1b0f0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
1b100 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
1b110 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
1b120 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
1b130 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1b140 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
1b150 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1b160 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
1b170 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
1b180 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  n of the WHERE c
1b190 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1b1a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b1b0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
1b1c0 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
1b1d0 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
1b1e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1b1f0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
1b200 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
1b210 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
1b220 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
1b230 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
1b240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1b250 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
1b260 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
1b270 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b290 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
1b2a0 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e  ion of all pWC->
1b2b0 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20  a[].wtFlags */. 
1b2c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1b2e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b2f0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1b300 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a   *pOrderBy = 0;.
1b310 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
1b320 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
1b330 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
1b340 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
1b350 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
1b360 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
1b370 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
1b380 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
1b390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1b3a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b3b0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
1b3c0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
1b3d0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
1b3e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f  ;.  }..  if( ppO
1b3f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f  rderBy ){.    pO
1b400 72 64 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65  rderBy = *ppOrde
1b410 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  rBy;.  }..  /* A
1b420 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
1b430 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
1b440 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1b450 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
1b460 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
1b470 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62  value..  */.  db
1b480 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1b490 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1b4a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1b4b0 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
1b4c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1b4d0 28 57 68 65 72 65 49 6e 66 6f 29 0a 20 20 20 20  (WhereInfo).    
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e    + (pTabList->n
1b500 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  Src-1)*sizeof(Wh
1b510 65 72 65 4c 65 76 65 6c 29 0a 20 20 20 20 20 20  ereLevel).      
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b530 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c  + sizeof(WhereCl
1b540 61 75 73 65 29 0a 20 20 20 20 20 20 20 20 20 20  ause).          
1b550 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
1b560 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
1b570 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 29 3b  t).           );
1b580 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1b590 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1b5a0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1b5b0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
1b5c0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
1b5d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
1b5e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
1b5f0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
1b600 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
1b610 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
1b620 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
1b630 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b640 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52  ;.  pWInfo->regR
1b650 6f 77 53 65 74 20 3d 20 28 77 63 74 72 6c 46 6c  owSet = (wctrlFl
1b660 61 67 73 20 26 20 57 48 45 52 45 5f 46 49 4c 4c  ags & WHERE_FILL
1b670 5f 52 4f 57 53 45 54 29 20 3f 20 72 65 67 52 6f  _ROWSET) ? regRo
1b680 77 53 65 74 20 3a 20 2d 31 3b 0a 20 20 70 57 49  wSet : -1;.  pWI
1b690 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d  nfo->pWC = pWC =
1b6a0 20 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 26   (WhereClause*)&
1b6b0 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
1b6c0 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 70 57 49  ->nLevel];.  pWI
1b6d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1b6e0 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
1b6f0 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72  pMaskSet = (Wher
1b700 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31  eMaskSet*)&pWC[1
1b710 5d 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  ];..  /* Split t
1b720 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1b730 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
1b740 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
1b750 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
1b760 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1b770 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
1b780 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
1b790 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
1b7a0 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
1b7b0 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c  eClauseInit(pWC,
1b7c0 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65   pParse, pMaskSe
1b7d0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1b7e0 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
1b7f0 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
1b800 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
1b810 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
1b820 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
1b830 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
1b840 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
1b850 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
1b860 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
1b870 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
1b880 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
1b890 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
1b8a0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
1b8b0 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
1b8c0 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
1b8d0 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  c==0 || sqlite3E
1b8e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1b8f0 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
1b900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b910 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1b920 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
1b930 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
1b940 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b950 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
1b960 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
1b970 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
1b980 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
1b990 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
1b9a0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
1b9b0 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
1b9c0 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
1b9d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
1b9e0 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
1b9f0 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
1ba00 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
1ba10 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1ba20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
1ba30 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
1ba40 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
1ba50 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1ba60 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
1ba70 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
1ba80 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
1ba90 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
1baa0 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
1bab0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1bac0 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
1bad0 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
1bae0 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
1baf0 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
1bb00 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
1bb10 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
1bb20 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
1bb30 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
1bb40 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
1bb50 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
1bb60 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
1bb70 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
1bb80 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
1bb90 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
1bba0 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
1bbb0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
1bbc0 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
1bbd0 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
1bbe0 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
1bbf0 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  015..  */.  for(
1bc00 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1bc10 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1bc20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
1bc30 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
1bc40 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
1bc50 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1bc60 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
1bc70 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
1bc80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1bc90 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1bca0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
1bcb0 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
1bcc0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
1bcd0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
1bce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1bcf0 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
1bd00 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
1bd10 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
1bd20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1bd30 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
1bd40 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
1bd50 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
1bd60 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
1bd70 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
1bd80 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
1bd90 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
1bda0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1bdb0 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
1bdc0 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
1bdd0 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
1bde0 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
1bdf0 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
1be00 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
1be10 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
1be20 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
1be30 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
1be40 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
1be50 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
1be60 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 70  eAll(pTabList, p
1be70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
1be80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1be90 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
1bea0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
1beb0 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
1bec0 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
1bed0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
1bee0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1bef0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1bf00 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
1bf10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1bf20 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
1bf30 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
1bf40 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
1bf50 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
1bf60 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
1bf70 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
1bf80 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20  o->a[].wsFlags  
1bf90 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
1bfa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bfb0 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
1bfc0 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
1bfd0 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
1bfe0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
1bff0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
1c000 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
1c010 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f      Which term o
1c020 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1c030 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
1c040 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
1c050 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
1c060 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1c070 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
1c080 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
1c090 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
1c0a0 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
1c0b0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
1c0c0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
1c0d0 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65  [].pTerm     Whe
1c0e0 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52  n wsFlags==WO_OR
1c0f0 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  , the OR-clause 
1c100 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  term.  **.  ** T
1c110 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69  his loop also fi
1c120 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65  gures out the ne
1c130 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74  sting order of t
1c140 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
1c150 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  M.  ** clause.. 
1c160 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
1c170 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
1c180 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c  pTabItem = pTabL
1c190 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c  ist->a;.  pLevel
1c1a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20   = pWInfo->a;.  
1c1b0 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20  andFlags = ~0;. 
1c1c0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
1c1d0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
1c1e0 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f  t ***\n"));.  fo
1c1f0 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65  r(i=iFrom=0, pLe
1c200 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
1c210 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1c220 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
1c230 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62  .    WhereCost b
1c240 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20  estPlan;        
1c250 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65   /* Most efficie
1c260 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20  nt plan seen so 
1c270 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  far */.    Index
1c280 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1c290 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c2a0 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
1c2b0 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
1c2c0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2e0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1c2f0 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
1c300 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d  .    int bestJ =
1c310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c320 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1c330 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73   j */.    Bitmas
1c340 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  k m;            
1c350 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1c360 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20   value for j or 
1c370 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74  bestJ */.    int
1c380 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20   once = 0;      
1c390 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c3a0 20 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c   when first tabl
1c3b0 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20  e is seen */..  
1c3c0 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c    memset(&bestPl
1c3d0 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65  an, 0, sizeof(be
1c3e0 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65  stPlan));.    be
1c3f0 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53  stPlan.rCost = S
1c400 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20  QLITE_BIG_DBL;. 
1c410 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20     for(j=iFrom, 
1c420 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69  pTabItem=&pTabLi
1c430 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62  st->a[j]; j<pTab
1c440 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c  List->nSrc; j++,
1c450 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20   pTabItem++){.  
1c460 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f      int doNotReo
1c470 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69  rder;  /* True i
1c480 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f  f this table sho
1c490 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64  uld not be reord
1c4a0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 57 68  ered */.      Wh
1c4b0 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20  ereCost sCost;  
1c4c0 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61   /* Cost informa
1c4d0 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 49 6e  tion from bestIn
1c4e0 64 65 78 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  dex() */..      
1c4f0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20  doNotReorder =  
1c500 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
1c510 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1c520 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20  T_CROSS))!=0;.  
1c530 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26 20      if( once && 
1c540 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
1c550 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20  reak;.      m = 
1c560 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
1c570 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
1c580 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
1c590 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
1c5a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c5b0 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f   j==iFrom ) iFro
1c5c0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  m++;.        con
1c5d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
1c5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
1c5f0 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
1c600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c610 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1c620 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1c630 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
1c640 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
1c650 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c660 6f 20 2a 70 56 74 61 62 49 64 78 3b 20 2f 2a 20  o *pVtabIdx; /* 
1c670 43 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  Current virtual 
1c680 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1c690 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1c6a0 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
1c6b0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  = &pWInfo->a[j].
1c6c0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
1c6d0 20 20 73 43 6f 73 74 2e 72 43 6f 73 74 20 3d 20    sCost.rCost = 
1c6e0 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
1c6f0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
1c700 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
1c710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65 72           ppOrder
1c740 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  By ? *ppOrderBy 
1c750 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20 20  : 0, i==0,.     
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20    ppIdxInfo);.  
1c790 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e        sCost.plan
1c7a0 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
1c7b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1c7c0 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61         sCost.pla
1c7d0 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
1c7e0 56 74 61 62 49 64 78 20 3d 20 2a 70 70 49 64 78  VtabIdx = *ppIdx
1c7f0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  Info;.        if
1c800 28 20 70 56 74 61 62 49 64 78 20 26 26 20 70 56  ( pVtabIdx && pV
1c810 74 61 62 49 64 78 2d 3e 6f 72 64 65 72 42 79 43  tabIdx->orderByC
1c820 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20  onsumed ){.     
1c830 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e       sCost.plan.
1c840 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1c850 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c 20 57  VIRTUALTABLE | W
1c860 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
1c870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c880 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d  sCost.plan.nEq =
1c890 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28   0;.        /* (
1c8a0 64 6f 75 62 6c 65 29 32 20 49 6e 20 63 61 73 65  double)2 In case
1c8b0 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
1c8c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
1c8d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1c8e0 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
1c8f0 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 73 43  /((double)2))<sC
1c900 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20  ost.rCost ){.   
1c910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1c920 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  st is not allowe
1c930 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  d to be larger t
1c940 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  han SQLITE_BIG_D
1c950 42 4c 20 28 74 68 65 0a 20 20 20 20 20 20 20 20  BL (the.        
1c960 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75    ** inital valu
1c970 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20  e of lowestCost 
1c980 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66  in this loop. If
1c990 20 69 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20   it is, then.   
1c9a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63         ** the (c
1c9b0 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20  ost<lowestCost) 
1c9c0 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20  test below will 
1c9d0 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20  never be true.. 
1c9e0 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20           */ .   
1c9f0 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c         /* (doubl
1ca00 65 29 32 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)2 In case of S
1ca10 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ca20 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
1ca30 20 20 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e            sCost.
1ca40 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f  rCost = (SQLITE_
1ca50 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
1ca60 29 32 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  )2));.        }.
1ca70 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e        }else .#en
1ca80 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
1ca90 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50      bestIndex(pP
1caa0 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
1cab0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20  tem, notReady,. 
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
1cae0 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
1caf0 79 20 3a 20 30 2c 20 26 73 43 6f 73 74 29 3b 0a  y : 0, &sCost);.
1cb00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1cb10 28 20 6f 6e 63 65 3d 3d 30 20 7c 7c 20 73 43 6f  ( once==0 || sCo
1cb20 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61  st.rCost<bestPla
1cb30 6e 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  n.rCost ){.     
1cb40 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20     once = 1;.   
1cb50 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20       bestPlan = 
1cb60 73 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 62  sCost;.        b
1cb70 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
1cb80 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f  }.      if( doNo
1cb90 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
1cba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1cbb0 72 74 28 20 6f 6e 63 65 20 29 3b 0a 20 20 20 20  rt( once );.    
1cbc0 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
1cbd0 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
1cbe0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
1cbf0 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
1cc00 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
1cc10 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
1cc20 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
1cc30 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c   %d for loop %d\
1cc40 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20  n", bestJ,.     
1cc50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49        pLevel-pWI
1cc60 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66  nfo->a));.    if
1cc70 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ( (bestPlan.plan
1cc80 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1cc90 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a  _ORDERBY)!=0 ){.
1cca0 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79        *ppOrderBy
1ccb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1ccc0 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74  andFlags &= best
1ccd0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
1cce0 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  s;.    pLevel->p
1ccf0 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70  lan = bestPlan.p
1cd00 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20 62 65 73  lan;.    if( bes
1cd10 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
1cd20 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1cd30 45 44 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ED ){.      pLev
1cd40 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
1cd50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1cd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1cd70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
1cd80 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
1cd90 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
1cda0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
1cdb0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
1cdc0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
1cdd0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
1cde0 75 38 29 62 65 73 74 4a 3b 0a 0a 20 20 20 20 2f  u8)bestJ;..    /
1cdf0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20  * Check that if 
1ce00 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65  the table scanne
1ce10 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  d by this loop i
1ce20 74 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a  teration had an.
1ce30 20 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42      ** INDEXED B
1ce40 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65  Y clause attache
1ce50 64 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68  d to it, that th
1ce60 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73  e named index is
1ce70 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73   being.    ** us
1ce80 65 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e  ed for the scan.
1ce90 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75   If not, then qu
1cea0 65 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ery compilation 
1ceb0 68 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  has failed..    
1cec0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
1ced0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  or..    */.    p
1cee0 49 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Idx = pTabList->
1cef0 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b  a[bestJ].pIndex;
1cf00 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
1cf10 0a 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74  .      if( (best
1cf20 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
1cf30 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1cf40 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)==0 ){.       
1cf50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cf60 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
1cf70 20 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c   use index: %s",
1cf80 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
1cf90 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
1cfa0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
1cfb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cfc0 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58    /* If an INDEX
1cfd0 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
1cfe0 75 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e  used, the bestIn
1cff0 64 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  dex() function i
1d000 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61  s.        ** gua
1d010 72 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20  ranteed to find 
1d020 74 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66  the index specif
1d030 69 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58  ied in the INDEX
1d040 45 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ED BY clause.   
1d050 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69       ** if it fi
1d060 6e 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61  nd an index at a
1d070 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
1d080 73 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e  ssert( bestPlan.
1d090 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64  plan.u.pIdx==pId
1d0a0 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x );.      }.   
1d0b0 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
1d0c0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
1d0d0 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
1d0e0 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  \n"));.  if( db-
1d0f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1d100 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
1d110 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
1d120 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
1d130 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
1d140 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
1d150 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
1d160 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
1d170 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
1d180 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
1d190 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
1d1a0 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
1d1b0 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
1d1c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
1d1d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
1d1e0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
1d1f0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
1d200 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
1d210 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
1d220 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
1d230 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
1d240 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
1d250 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
1d260 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
1d270 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
1d280 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
1d290 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
1d2a0 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
1d2b0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
1d2c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
1d2d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
1d2e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d2f0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1d300 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
1d310 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
1d320 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
1d330 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
1d340 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
1d350 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
1d360 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
1d370 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
1d380 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
1d390 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
1d3a0 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1d3b0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
1d3c0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
1d3d0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
1d3e0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
1d3f0 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
1d400 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
1d410 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
1d420 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
1d430 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1d440 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
1d450 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
1d460 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
1d470 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
1d480 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
1d490 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1d4a0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
1d4b0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1d4c0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1d4d0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
1d4e0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
1d4f0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
1d500 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
1d510 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 23 69  ble/index */..#i
1d520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d530 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66  T_EXPLAIN.    if
1d540 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1d550 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68  n==2 ){.      ch
1d560 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20  ar *zMsg;.      
1d570 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d580 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1d590 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1d5a0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20  ->iFrom];.      
1d5b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
1d5c0 72 69 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45  rintf(db, "TABLE
1d5d0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
1d5e0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
1d5f0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
1d600 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1d610 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d620 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20  b, zMsg, "%s AS 
1d630 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
1d640 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
1d650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c   }.      if( (pL
1d660 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1d670 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1d680 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)!=0 ){.      
1d690 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d6a0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d6b0 67 2c 20 22 25 73 20 57 49 54 48 20 49 4e 44 45  g, "%s WITH INDE
1d6c0 58 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  X %s",.         
1d6d0 20 20 7a 4d 73 67 2c 20 70 4c 65 76 65 6c 2d 3e    zMsg, pLevel->
1d6e0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
1d6f0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
1d700 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1d710 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1d720 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
1d730 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d740 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d750 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 41 20 4d   zMsg, "%s VIA M
1d760 55 4c 54 49 2d 49 4e 44 45 58 20 55 4e 49 4f 4e  ULTI-INDEX UNION
1d770 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1d780 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
1d790 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d7a0 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
1d7b0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
1d7c0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  GE) ){.        z
1d7d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d7e0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d7f0 22 25 73 20 55 53 49 4e 47 20 50 52 49 4d 41 52  "%s USING PRIMAR
1d800 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20  Y KEY", zMsg);. 
1d810 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
1d820 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d830 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c  ALTABLE.      el
1d840 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e  se if( (pLevel->
1d850 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d860 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d870 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
1d880 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1d890 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20  nfo *pVtabIdx = 
1d8a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1d8b0 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20 20  VtabIdx;.       
1d8c0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d8d0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d8e0 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
1d8f0 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
1d900 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
1d910 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
1d920 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56  bIdx->idxNum, pV
1d930 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b  tabIdx->idxStr);
1d940 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1d950 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
1d960 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d970 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29   WHERE_ORDERBY )
1d980 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d990 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d9a0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 4f  (db, zMsg, "%s O
1d9b0 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b  RDER BY", zMsg);
1d9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d9e0 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
1d9f0 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
1da00 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
1da10 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65  NAMIC);.    }.#e
1da20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1da30 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20  MIT_EXPLAIN */. 
1da40 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
1da50 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1da60 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
1da70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
1da80 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
1da90 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1daa0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1dab0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1dac0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
1dad0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1dae0 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
1daf0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
1db00 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
1db10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1db20 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
1db30 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
1db40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1db50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1db60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
1db70 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1db80 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
1db90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dba0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
1dbb0 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54   (const char*)pT
1dbe0 61 62 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54  ab->pVtab, P4_VT
1dbf0 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  AB);.    }else.#
1dc00 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
1dc10 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1dc20 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1dc30 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
1dc40 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
1dc50 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
1dc60 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EN)==0 ){.      
1dc70 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  int op = pWInfo-
1dc80 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  >okOnePass ? OP_
1dc90 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f  OpenWrite : OP_O
1dca0 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73  penRead;.      s
1dcb0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
1dcc0 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
1dcd0 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
1dce0 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
1dcf0 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
1dd00 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
1dd10 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20  >nCol<BMS ){.   
1dd20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
1dd30 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
1dd40 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
1dd50 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
1dd60 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
1dd70 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
1dd80 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1dd90 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P4(v, sqlite3Vdb
1dda0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
1ddb0 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  1, SQLITE_INT_TO
1ddc0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
1ddd0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
1dde0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
1ddf0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
1de00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1de10 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
1de20 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
1de30 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
1de40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
1de50 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
1de60 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1de70 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
1de80 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1de90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1dea0 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
1deb0 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
1dec0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1ded0 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  Idx;.      KeyIn
1dee0 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
1def0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
1df00 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
1df10 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
1df20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1df30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1df40 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
1df50 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
1df60 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64       assert( iId
1df70 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
1df80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1df90 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
1dfa0 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  d, iIdxCur, pIx-
1dfb0 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
1dfe0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1dff0 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
1e000 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
1e010 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
1e020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e030 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1e040 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1e050 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
1e060 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1e070 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1e080 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1e090 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
1e0a0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
1e0b0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
1e0c0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
1e0d0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
1e0e0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
1e0f0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
1e100 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
1e110 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
1e120 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
1e130 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  )0;.  for(i=0; i
1e140 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1e150 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 74 52 65   i++){.    notRe
1e160 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
1e170 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
1e180 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f  , wctrlFlags, no
1e190 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
1e1a0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
1e1b0 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 61 64   pWInfo->a[i].ad
1e1c0 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66  drCont;.  }..#if
1e1d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
1e1e0 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
1e1f0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
1e200 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
1e210 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
1e220 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
1e230 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
1e240 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
1e250 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
1e260 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
1e270 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
1e280 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
1e290 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
1e2a0 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
1e2b0 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
1e2c0 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
1e2d0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
1e2e0 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
1e2f0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
1e300 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
1e310 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
1e320 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
1e330 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1e340 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1e350 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
1e360 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
1e370 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1e380 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
1e390 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1e3a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1e3b0 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
1e3c0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
1e3d0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
1e3e0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
1e3f0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69  me;.    n = sqli
1e400 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
1e410 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
1e420 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
1e430 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30  3_query_plan)-10
1e440 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
1e450 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1e460 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1e470 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
1e480 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
1e490 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
1e4a0 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
1e4b0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
1e4c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e4d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
1e4e0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e4f0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
1e500 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
1e510 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
1e520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
1e530 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
1e540 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
1e550 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
1e560 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1e570 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
1e580 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  EQ );.    testca
1e590 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
1e5a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1e5b0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a  _ROWID_RANGE );.
1e5c0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1e5d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
1e5e0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1e5f0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1e600 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
1e610 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
1e620 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
1e630 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e  * ", 2);.      n
1e640 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
1e650 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65  }else if( (pLeve
1e660 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1e670 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1e680 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  !=0 ){.      n =
1e690 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e6a0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e  (pLevel->plan.u.
1e6b0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
1e6c0 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
1e6d0 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
1e6e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20  3_query_plan)-2 
1e6f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1e700 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
1e710 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70  _plan[nQPlan], p
1e720 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
1e730 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  dx->zName, n);. 
1e740 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
1e750 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
1e760 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1e770 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
1e780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e790 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
1e7a0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
1e7b0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
1e7c0 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51   ", 3);.      nQ
1e7d0 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
1e7e0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51  .  }.  while( nQ
1e7f0 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65  Plan>0 && sqlite
1e800 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1e810 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20  lan-1]==' ' ){. 
1e820 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
1e830 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20  _plan[--nQPlan] 
1e840 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1e850 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1e860 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50  Plan] = 0;.  nQP
1e870 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20  lan = 0;.#endif 
1e880 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f  /* SQLITE_TEST /
1e890 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65  / Testing and de
1e8a0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
1e8b0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
1e8c0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1e8d0 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  n address in the
1e8e0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
1e8f0 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a  ture.  Then.  **
1e900 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   clean up and re
1e910 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  turn..  */.  ret
1e920 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
1e930 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
1e940 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
1e950 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
1e960 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
1e970 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
1e980 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1e990 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
1e9a0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
1e9b0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
1e9c0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
1e9d0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
1e9e0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1e9f0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
1ea00 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
1ea10 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
1ea20 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
1ea30 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1ea40 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
1ea50 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ea60 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
1ea70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1ea80 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l;.  SrcList *pT
1ea90 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
1eaa0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c  >pTabList;.  sql
1eab0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1eac0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e  e->db;..  /* Gen
1ead0 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
1eae0 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
1eaf0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
1eb00 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
1eb10 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20 66  pParse, -1);.  f
1eb20 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
1eb30 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
1eb40 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
1eb50 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
1eb60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1eb70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
1eb80 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
1eb90 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1eba0 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
1ebb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ebc0 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65  eAddOp2(v, pLeve
1ebd0 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
1ebe0 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
1ebf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ec00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
1ec10 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a  vel->p5);.    }.
1ec20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1ec30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1ec40 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
1ec50 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1ec60 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
1ec70 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
1ec80 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1ec90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1eca0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
1ecb0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
1ecc0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
1ecd0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
1ece0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
1ecf0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
1ed00 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
1ed10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ed20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1ed30 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
1ed40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ed50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ed60 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75  P_Next, pIn->iCu
1ed70 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
1ed80 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
1ed90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1eda0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
1edb0 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
1edc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1edd0 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  e(db, pLevel->u.
1ede0 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20  in.aInLoop);.   
1edf0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1ee00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ee10 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1ee20 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
1ee30 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
1ee40 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
1ee50 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
1ee60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1ee70 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
1ee80 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1ee90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1eea0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
1eeb0 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
1eec0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
1eed0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
1eee0 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
1eef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ef00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1ef10 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
1ef20 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
1ef30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1ef40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ef50 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
1ef60 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
1ef70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1ef90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1efa0 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
1efb0 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
1efc0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
1efd0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
1efe0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
1eff0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1f000 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f010 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1f020 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
1f030 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
1f040 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
1f050 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
1f060 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
1f070 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
1f080 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
1f090 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1f0a0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
1f0b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f0c0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
1f0d0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1f0e0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1f0f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1f100 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
1f110 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
1f120 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
1f130 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1f140 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
1f150 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
1f160 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ct ) continue;. 
1f170 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1f180 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1f190 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d  RE_OMIT_CLOSE)==
1f1a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
1f1b0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
1f1c0 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  s && (pLevel->pl
1f1d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1f1e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
1f1f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f200 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1f210 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
1f220 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1f230 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f240 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1f250 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1f260 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
1f270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f280 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
1f290 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
1f2a0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
1f2b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1f2c0 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
1f2d0 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64   index, make cod
1f2e0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
1f2f0 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
1f300 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
1f310 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65  ex in preference
1f320 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53   to the table. S
1f330 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d  ometimes, this m
1f340 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  eans.    ** the 
1f350 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72  table need never
1f360 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54   be read from. T
1f370 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d  his is a perform
1f380 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20  ance boost,.    
1f390 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c  ** as the vdbe l
1f3a0 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c  evel waits until
1f3b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65   the table is re
1f3c0 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ad before actual
1f3d0 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e  ly.    ** seekin
1f3e0 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  g the table curs
1f3f0 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  or to the record
1f400 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1f410 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
1f420 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e    ** position in
1f430 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1f440 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
1f450 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1f460 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
1f470 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
1f480 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
1f490 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
1f4a0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
1f4b0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
1f4c0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
1f4d0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
1f4e0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
1f4f0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
1f500 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
1f510 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
1f520 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
1f530 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
1f540 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
1f550 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
1f560 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
1f570 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
1f580 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
1f590 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1f5a0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
1f5b0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
1f5c0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
1f5d0 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49  Op *pOp;.      I
1f5e0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65  ndex *pIdx = pLe
1f5f0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
1f600 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65 49  ;.      int useI
1f610 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76 65  ndexOnly = pLeve
1f620 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1f630 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1f640 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1f650 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
1f660 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
1f670 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
1f680 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
1f690 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
1f6a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1f6b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
1f6c0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
1f6d0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
1f6e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
1f6f0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
1f700 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
1f710 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1f720 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
1f730 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
1f740 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
1f750 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
1f760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1f770 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
1f780 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
1f790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f7a0 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
1f7b0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
1f7c0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
1f7d0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
1f7e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f800 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
1f810 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f 6e  sert(!useIndexOn
1f820 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43  ly || j<pIdx->nC
1f830 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1f840 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
1f850 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
1f860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
1f870 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
1f880 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
1f890 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
1f8a0 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
1f8b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f8c0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
1f8d0 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e 64  ullRow && useInd
1f8e0 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  exOnly ){.      
1f8f0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
1f900 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
1f910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f920 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
1f930 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
1f940 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
1f950 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
1f960 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.