/ Hex Artifact Content
Login

Artifact c5fa4a7a58880aecc657ebce5f8df98c9b67eec0:


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 39  : where.c,v 1.39
0340: 36 20 32 30 30 39 2f 30 35 2f 30 36 20 31 39 3a  6 2009/05/06 19:
0350: 30 33 3a 31 34 20 64 72 68 20 45 78 70 20 24 0a  03:14 drh Exp $.
0360: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0370: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0380: 20 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61   Trace output ma
0390: 63 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69  cros.*/.#if defi
03a0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
03b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
03c0: 54 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71  TE_DEBUG).int sq
03d0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
03e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
03f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
0400: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
0410: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 23 20  SQLITE_DEBUG).# 
0420: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0430: 45 28 58 29 20 20 69 66 28 73 71 6c 69 74 65 33  E(X)  if(sqlite3
0440: 57 68 65 72 65 54 72 61 63 65 29 20 73 71 6c 69  WhereTrace) sqli
0450: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58  te3DebugPrintf X
0460: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0470: 57 48 45 52 45 54 52 41 43 45 28 58 29 0a 23 65  WHERETRACE(X).#e
0480: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
0490: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
04a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04b0: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
04c0: 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74  ause;.typedef st
04d0: 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65  ruct WhereMaskSe
04e0: 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b 0a  t WhereMaskSet;.
04f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
0500: 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72 65  hereOrInfo Where
0510: 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66 20  OrInfo;.typedef 
0520: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
0530: 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  nfo WhereAndInfo
0540: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0550: 20 57 68 65 72 65 43 6f 73 74 20 57 68 65 72 65   WhereCost Where
0560: 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Cost;../*.** The
0570: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
0580: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
0590: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
05a0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
05b0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
05c0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
05d0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
05e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
05f0: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
0600: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0610: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0620: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0630: 41 4e 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a  AND operators,.*
0640: 2a 20 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f  * usually, or so
0650: 6d 65 74 69 6d 65 73 20 73 75 62 65 78 70 72 65  metimes subexpre
0660: 73 73 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64  ssions separated
0670: 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c   by OR..**.** Al
0680: 6c 20 57 68 65 72 65 54 65 72 6d 73 20 61 72 65  l WhereTerms are
0690: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
06a0: 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c  a single WhereCl
06b0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
06c0: 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69   .** The followi
06d0: 6e 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64  ng identity hold
06e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
06f0: 57 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61  WhereTerm.pWC->a
0700: 5b 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20  [WhereTerm.idx] 
0710: 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a  == WhereTerm.**.
0720: 2a 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69  ** When a term i
0730: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
0740: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
0750: 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a    X <op> <expr>.
0760: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  **.** where X is
0770: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61   a column name a
0780: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
0790: 66 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74  f certain operat
07a0: 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65  ors,.** then Whe
07b0: 72 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f  reTerm.leftCurso
07c0: 72 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e  r and WhereTerm.
07d0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63  u.leftColumn rec
07e0: 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  ord the.** curso
07f0: 72 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c  r number and col
0800: 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58  umn number for X
0810: 2e 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70  .  WhereTerm.eOp
0820: 65 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a  erator records.*
0830: 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67  * the <op> using
0840: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
0850: 69 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20 57  ing defined by W
0860: 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68  O_xxx below.  Th
0870: 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69  e.** use of a bi
0880: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66  tmask encoding f
0890: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
08a0: 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61  allows us to sea
08b0: 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66  rch.** quickly f
08c0: 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61  or terms that ma
08d0: 74 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72  tch any of sever
08e0: 61 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65  al different ope
08f0: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  rators..**.** A 
0900: 57 68 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20  WhereTerm might 
0910: 61 6c 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d  also be two or m
0920: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
0930: 6e 65 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a  nected by OR:.**
0940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e  .**         (t1.
0950: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f  X <op> <expr>) O
0960: 52 20 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78  R (t1.Y <op> <ex
0970: 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a  pr>) OR .....**.
0980: 2a 2a 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e  ** In this secon
0990: 64 20 63 61 73 65 2c 20 77 74 46 6c 61 67 20 61  d case, wtFlag a
09a0: 73 20 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46  s the TERM_ORINF
09b0: 4f 20 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61  O set and eOpera
09c0: 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e  tor==WO_OR.** an
09d0: 64 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  d the WhereTerm.
09e0: 75 2e 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20  u.pOrInfo field 
09f0: 70 6f 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69  points to auxili
0a00: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
0a10: 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65  that.** is colle
0a20: 63 74 65 64 20 61 62 6f 75 74 20 74 68 65 0a 2a  cted about the.*
0a30: 2a 0a 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69  *.** If a term i
0a40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
0a50: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
0a60: 68 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  h either of the 
0a70: 74 77 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  two previous.** 
0a80: 63 61 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e  categories, then
0a90: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20   eOperator==0.  
0aa0: 54 68 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45  The WhereTerm.pE
0ab0: 78 70 72 20 66 69 65 6c 64 20 69 73 20 73 74 69  xpr field is sti
0ac0: 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  ll set.** to the
0ad0: 20 6f 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70   original subexp
0ae0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20  ression content 
0af0: 61 6e 64 20 77 74 46 6c 61 67 73 20 69 73 20 73  and wtFlags is s
0b00: 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
0b10: 65 6c 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74  ely.** but no ot
0b20: 68 65 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68  her fields in th
0b30: 65 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  e WhereTerm obje
0b40: 63 74 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75  ct are meaningfu
0b50: 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f  l..**.** When eO
0b60: 70 65 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72  perator!=0, prer
0b70: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
0b80: 65 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74  eqAll record set
0b90: 73 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62  s of cursor numb
0ba0: 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79  ers,.** but they
0bb0: 20 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c   do so indirectl
0bc0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65  y.  A single Whe
0bd0: 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
0be0: 75 72 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a  ure translates.*
0bf0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
0c00: 69 6e 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68  into bits and th
0c10: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74  e translated bit
0c20: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
0c30: 65 20 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c  e prereq.** fiel
0c40: 64 73 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61  ds.  The transla
0c50: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20  tion is used in 
0c60: 6f 72 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a  order to maximiz
0c70: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
0c80: 2a 2a 20 62 69 74 73 20 74 68 61 74 20 77 69 6c  ** bits that wil
0c90: 6c 20 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61  l fit in a Bitma
0ca0: 73 6b 2e 20 20 54 68 65 20 56 44 42 45 20 63 75  sk.  The VDBE cu
0cb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
0cc0: 68 74 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20  ht be.** spread 
0cd0: 6f 75 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e  out over the non
0ce0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
0cf0: 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  rs.  For example
0d00: 2c 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  , the cursor.** 
0d10: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0d20: 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30   3, 8, 9, 10, 20
0d30: 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35  , 23, 41, and 45
0d40: 2e 20 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b  .  The WhereMask
0d50: 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65  Set.** translate
0d60: 73 20 74 68 65 73 65 20 73 70 61 72 73 65 20 63  s these sparse c
0d70: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
0d80: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
0d90: 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e  ntegers.** begin
0da0: 6e 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f  ning with 0 in o
0db0: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65  rder to make the
0dc0: 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75   best possible u
0dd0: 73 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61  se of the availa
0de0: 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74  ble.** bits in t
0df0: 68 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c  he Bitmask.  So,
0e00: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   in the example 
0e10: 61 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f  above, the curso
0e20: 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75  r numbers.** wou
0e30: 6c 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74  ld be mapped int
0e40: 6f 20 69 6e 74 65 67 65 72 73 20 30 20 74 68 72  o integers 0 thr
0e50: 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68  ough 7..**.** Th
0e60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
0e70: 73 20 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c  s in a join is l
0e80: 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
0e90: 6d 62 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20  mber of bits.** 
0ea0: 69 6e 20 70 72 65 72 65 71 52 69 67 68 74 20 61  in prereqRight a
0eb0: 6e 64 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54  nd prereqAll.  T
0ec0: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 36 34  he default is 64
0ed0: 20 62 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c   bits, hence SQL
0ee0: 69 74 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  ite.** is only a
0ef0: 62 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a  ble to process j
0f00: 6f 69 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20  oins with 64 or 
0f10: 66 65 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f  fewer tables..*/
0f20: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0f30: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0f40: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0f50: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0f60: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0f70: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0f80: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0f90: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
0fa0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
0fb0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
0fc0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
0fd0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
0fe0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
0ff0: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
1000: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
1010: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1020: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
1030: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
1040: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
1050: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
1060: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
1070: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
1080: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
1090: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
10a0: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
10b0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10c0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10d0: 5f 4f 52 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  _OR */.    Where
10e0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
10f0: 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f  o; /* Extra info
1100: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1110: 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 2a 2f 0a  ator==WO_AND */.
1120: 20 20 7d 20 75 3b 0a 20 20 75 31 36 20 65 4f 70    } u;.  u16 eOp
1130: 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20 20 20  erator;         
1140: 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c 75   /* A WO_xx valu
1150: 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c 6f 70  e describing <op
1160: 3e 20 2a 2f 0a 20 20 75 38 20 77 74 46 6c 61 67  > */.  u8 wtFlag
1170: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1180: 2a 20 54 45 52 4d 5f 78 78 78 20 62 69 74 20 66  * TERM_xxx bit f
1190: 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  lags.  See below
11a0: 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b   */.  u8 nChild;
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
11d0: 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64 69  ren that must di
11e0: 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68  sable us */.  Wh
11f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1200: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 61        /* The cla
1210: 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69 73  use this term is
1220: 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69   part of */.  Bi
1230: 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67 68  tmask prereqRigh
1240: 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  t;    /* Bitmask
1250: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
1260: 62 79 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  by pExpr->pRight
1270: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1280: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a  ereqAll;      /*
1290: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
12a0: 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  es referenced by
12b0: 20 70 45 78 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   pExpr */.};../*
12c0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
12d0: 65 73 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e  es of WhereTerm.
12e0: 77 74 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  wtFlags.*/.#defi
12f0: 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  ne TERM_DYNAMIC 
1300: 20 20 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65     0x01   /* Nee
1310: 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1320: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1330: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
1340: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
1350: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
1360: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
1370: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
1380: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
1390: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
13a0: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
13b0: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
13c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
13d0: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
13e0: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
13f0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
1400: 4d 5f 4f 52 49 4e 46 4f 20 20 20 20 20 30 78 31  M_ORINFO     0x1
1410: 30 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66  0   /* Need to f
1420: 72 65 65 20 74 68 65 20 57 68 65 72 65 54 65 72  ree the WhereTer
1430: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 6f 62 6a 65  m.u.pOrInfo obje
1440: 63 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  ct */.#define TE
1450: 52 4d 5f 41 4e 44 49 4e 46 4f 20 20 20 20 30 78  RM_ANDINFO    0x
1460: 32 30 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  20   /* Need to 
1470: 66 72 65 65 20 74 68 65 20 57 68 65 72 65 54 65  free the WhereTe
1480: 72 6d 2e 75 2e 70 41 6e 64 49 6e 66 6f 20 6f 62  rm.u.pAndInfo ob
1490: 6a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  j */.#define TER
14a0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 34  M_OR_OK      0x4
14b0: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
14c0: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
14d0: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
14e0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
14f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1500: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1510: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1520: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1530: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1540: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1550: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1560: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1570: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1580: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
1590: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
15a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15c0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
15d0: 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet;  /* Mappin
15e0: 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73 6f  g of table curso
15f0: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
1600: 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 38 20 6f 70  masks */.  u8 op
1610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1620: 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65      /* Split ope
1630: 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f  rator.  TK_AND o
1640: 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74  r TK_OR */.  int
1650: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1660: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1670: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
1680: 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
1690: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16a0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
16b0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
16c0: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  m *a;           
16d0: 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73   /* Each a[] des
16e0: 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66  cribes a term of
16f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73   the WHERE cluas
1700: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1710: 20 61 53 74 61 74 69 63 5b 34 5d 3b 20 20 20 20   aStatic[4];    
1720: 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69  /* Initial stati
1730: 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20  c space for a[] 
1740: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  */.};../*.** A W
1750: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1760: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
1770: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
1780: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1790: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
17a0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
17b0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
17c0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
17d0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
17e0: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
17f0: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1800: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1810: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1820: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1830: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1840: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1850: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1860: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
1870: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1880: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
1890: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
18a0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
18b0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
18c0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
18d0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
18e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
18f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1900: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1910: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1920: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1930: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1940: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1950: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1960: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1970: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1980: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1990: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
19a0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
19b0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
19c0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
19d0: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
19e0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
19f0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1a00: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1a10: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1a20: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1a30: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1a40: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1a50: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1a60: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1a70: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1a80: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1a90: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1aa0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1ab0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1ac0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1ad0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1ae0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1af0: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1b00: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1b10: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1b20: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1b30: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1b40: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1b50: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1b60: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1b70: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1b80: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1b90: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1ba0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1bb0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1bc0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1bd0: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1be0: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1bf0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1c00: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1c10: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1c20: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1c30: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1c40: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1c50: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1c60: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1c70: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1c80: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1c90: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1ca0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1cb0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1cc0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1cd0: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1ce0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1cf0: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1d00: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1d10: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1d20: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1d30: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1d40: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1d50: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1d60: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1d70: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1d80: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1d90: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1da0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1db0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1dc0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1dd0: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1de0: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1df0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1e00: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1e10: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1e20: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1e30: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1e40: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1e50: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1e60: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e90: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1ea0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1eb0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ed0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ee0: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
1ef0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
1f00: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
1f10: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
1f20: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
1f30: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
1f40: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
1f50: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
1f60: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
1f70: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
1f80: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
1f90: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
1fa0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
1fb0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
1fc0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
1fd0: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
1fe0: 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  tegy */.  double
1ff0: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20   nRow;       /* 
2000: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
2010: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
2020: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74  */.};../*.** Bit
2030: 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70  masks for the op
2040: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64  erators that ind
2050: 69 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  ices are able to
2060: 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a   exploit.  An.**
2070: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
2080: 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75  on of these valu
2090: 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  es can be used w
20a0: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  hen searching fo
20b0: 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68  r.** terms in th
20c0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a  e where clause..
20d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e  */.#define WO_IN
20e0: 20 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69       0x001.#defi
20f0: 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30  ne WO_EQ     0x0
2100: 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54  02.#define WO_LT
2110: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
2120: 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _LT-TK_EQ)).#def
2130: 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57  ine WO_LE     (W
2140: 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f  O_EQ<<(TK_LE-TK_
2150: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
2160: 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  GT     (WO_EQ<<(
2170: 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_GT-TK_EQ)).#d
2180: 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20  efine WO_GE     
2190: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54  (WO_EQ<<(TK_GE-T
21a0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
21b0: 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23  O_MATCH  0x040.#
21c0: 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c  define WO_ISNULL
21d0: 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57   0x080.#define W
21e0: 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20  O_OR     0x100  
21f0: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2200: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
2210: 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e   terms */.#defin
2220: 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30  e WO_AND    0x20
2230: 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f  0       /* Two o
2240: 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65  r more AND-conne
2250: 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23  cted terms */..#
2260: 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20  define WO_ALL   
2270: 20 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20   0xfff       /* 
2280: 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73  Mask of all poss
2290: 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73  ible WO_* values
22a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53   */.#define WO_S
22b0: 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20  INGLE 0x0ff     
22c0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
22d0: 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f   non-compound WO
22e0: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a  _* values */../*
22f0: 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73  .** Value for ws
2300: 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  Flags returned b
2310: 79 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e  y bestIndex() an
2320: 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57  d stored in.** W
2330: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2340: 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  s.  These flags 
2350: 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20  determine which 
2360: 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65  search.** strate
2370: 67 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72  gies are appropr
2380: 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iate..**.** The 
2390: 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e  least significan
23a0: 74 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73  t 12 bits is res
23b0: 65 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20  erved as a mask 
23c0: 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61  for WO_ values a
23d0: 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65  bove..** The Whe
23e0: 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20  reLevel.wsFlags 
23f0: 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79  field is usually
2400: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2410: 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a  _EQ|WO_ISNULL..*
2420: 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62  * But if the tab
2430: 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
2440: 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20  table of a left 
2450: 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c  join, WhereLevel
2460: 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73  .wsFlags.** is s
2470: 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45  et to WO_IN|WO_E
2480: 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76  Q.  The WhereLev
2490: 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64  el.wsFlags field
24a0: 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65   can then be use
24b0: 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22  d as.** the "op"
24c0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69   parameter to fi
24d0: 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61  ndTerm when we a
24e0: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75  re resolving equ
24f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
2500: 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e  s..** ISNULL con
2510: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68  straints will th
2520: 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f  en not be used o
2530: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2540: 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a  e of a left.** j
2550: 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32  oin.  Tickets #2
2560: 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a  177 and #2189..*
2570: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2580: 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30  ROWID_EQ     0x0
2590: 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69  0001000  /* rowi
25a0: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
25b0: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
25c0: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
25d0: 52 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30  RANGE  0x0000200
25e0: 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52  0  /* rowid<EXPR
25f0: 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58   and/or rowid>EX
2600: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2610: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20  ERE_COLUMN_EQ   
2620: 20 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20   0x00010000  /* 
2630: 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28  x=EXPR or x IN (
2640: 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c  ...) or x IS NUL
2650: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2660: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
2670: 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78  0x00020000  /* x
2680: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45  <EXPR and/or x>E
2690: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
26a0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20  HERE_COLUMN_IN  
26b0: 20 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a    0x00040000  /*
26c0: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
26d0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
26e0: 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38  UMN_NULL  0x0008
26f0: 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55  0000  /* x IS NU
2700: 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  LL */.#define WH
2710: 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20  ERE_INDEXED     
2720: 20 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20   0x000f0000  /* 
2730: 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73  Anything that us
2740: 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23  es an index */.#
2750: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f  define WHERE_IN_
2760: 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30 66  ABLE      0x000f
2770: 31 30 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f  1000  /* Able to
2780: 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f   support an IN o
2790: 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  perator */.#defi
27a0: 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  ne WHERE_TOP_LIM
27b0: 49 54 20 20 20 20 30 78 30 30 31 30 30 30 30 30  IT    0x00100000
27c0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
27d0: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
27e0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
27f0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
2800: 30 78 30 30 32 30 30 30 30 30 20 20 2f 2a 20 78  0x00200000  /* x
2810: 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52  >EXPR or x>=EXPR
2820: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2830: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58  define WHERE_IDX
2840: 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38 30  _ONLY     0x0080
2850: 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64  0000  /* Use ind
2860: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
2870: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
2880: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20  WHERE_ORDERBY   
2890: 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f     0x01000000  /
28a0: 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70  * Output will ap
28b0: 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20  pear in correct 
28c0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
28d0: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20   WHERE_REVERSE  
28e0: 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20 20      0x02000000  
28f0: 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
2900: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  se order */.#def
2910: 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45  ine WHERE_UNIQUE
2920: 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30 30         0x0400000
2930: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
2940: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
2950: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
2960: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2970: 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20   0x08000000  /* 
2980: 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  Use virtual-tabl
2990: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
29a0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55  #define WHERE_MU
29b0: 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30  LTI_OR     0x100
29c0: 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69  00000  /* OR usi
29d0: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69  ng multiple indi
29e0: 63 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ces */../*.** In
29f0: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
2a00: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
2a10: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
2a20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2a30: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
2a40: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2a50: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
2a60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
2a70: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
2a80: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2a90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2aa0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2ab0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ext */.  WhereMa
2ac0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20  skSet *pMaskSet 
2ad0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
2ae0: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  m table cursor n
2af0: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
2b00: 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  ks */.){.  pWC->
2b10: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2b20: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
2b30: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
2b40: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
2b50: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
2b60: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
2b70: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
2b80: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
2b90: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2ba0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2bb0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2bc0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2bd0: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2be0: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2bf0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2c00: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2c10: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2c20: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2c30: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2c40: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2c50: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2c60: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2c70: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2c80: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2c90: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2ca0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2cb0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2cc0: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2cd0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2ce0: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2cf0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2d00: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2d10: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2d20: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2d30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d40: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2d50: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
2d60: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2d70: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
2d80: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2d90: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
2da0: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
2db0: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
2dc0: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
2dd0: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
2de0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
2df0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
2e00: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
2e20: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
2e30: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
2e40: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
2e50: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
2e60: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
2e70: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
2e80: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
2e90: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
2ea0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2eb0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
2ec0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
2ed0: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
2ee0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
2ef0: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
2f00: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
2f10: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
2f20: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
2f30: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
2f40: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
2f50: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
2f60: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
2f70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2f80: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
2f90: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
2fa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2fb0: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
2fc0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2fd0: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
2fe0: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
2ff0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
3000: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
3010: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
3020: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
3030: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
3040: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3050: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3060: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3070: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3080: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
3090: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
30a0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
30b0: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
30c0: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
30d0: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
30e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
30f0: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
3100: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
3110: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
3120: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
3130: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
3140: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3150: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3160: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3180: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
3190: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
31a0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
31b0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
31c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
31d0: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
31e0: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
31f0: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
3200: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
3210: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
3220: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
3230: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
3240: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3250: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3260: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3270: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3280: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
3290: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
32a0: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
32b0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
32c0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
32d0: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
32e0: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
32f0: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
3300: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
3310: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
3320: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
3330: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
3340: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3350: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3360: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3370: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3380: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
3390: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
33a0: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
33b0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
33c0: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
33d0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
33e0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
33f0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72  .  if( pWC->nTer
3400: 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b  m>=pWC->nSlot ){
3410: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
3420: 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20  pOld = pWC->a;. 
3430: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
3440: 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pWC->pParse->db
3450: 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73  ;.    pWC->a = s
3460: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
3470: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43  w(db, sizeof(pWC
3480: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c  ->a[0])*pWC->nSl
3490: 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ot*2 );.    if( 
34a0: 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  pWC->a==0 ){.   
34b0: 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26     if( wtFlags &
34c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
34d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34e0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
34f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3500: 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a   pWC->a = pOld;.
3510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3520: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
3530: 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73  (pWC->a, pOld, s
3540: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3550: 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  *pWC->nTerm);.  
3560: 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d    if( pOld!=pWC-
3570: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3580: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3590: 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d  db, pOld);.    }
35a0: 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  .    pWC->nSlot 
35b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
35c0: 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61  cSize(db, pWC->a
35d0: 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  )/sizeof(pWC->a[
35e0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  0]);.  }.  pTerm
35f0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d   = &pWC->a[idx =
3600: 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a   pWC->nTerm++];.
3610: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
3620: 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46   p;.  pTerm->wtF
3630: 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a  lags = wtFlags;.
3640: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
3650: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
3660: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
3670: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
3680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3690: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
36a0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
36b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
36c0: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
36d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
36e0: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
36f0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
3700: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
3710: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
3720: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
3730: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
3740: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
3750: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
3760: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
3770: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
3780: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
3790: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
37a0: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
37b0: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
37c0: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
37d0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
37e0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
37f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
3800: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
3810: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
3820: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
3830: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
3850: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
3860: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
3870: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
3880: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
3890: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
38a0: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
38b0: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
38c0: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
38d0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
38e0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
38f0: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
3900: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
3910: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
3920: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
3930: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
3940: 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b  rray.  The slot[
3950: 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73  ] array grows as
3960: 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61   needed to conta
3970: 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20  in.** all terms 
3980: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3990: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
39a0: 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57  oid whereSplit(W
39b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
39c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
39d0: 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  t op){.  pWC->op
39e0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28   = (u8)op;.  if(
39f0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
3a00: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
3a10: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
3a20: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
3a30: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
3a40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
3a50: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
3a60: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
3a70: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3a80: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
3a90: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
3aa0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
3ab0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
3ac0: 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65  ask set (a Where
3ad0: 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a  MaskSet object).
3ae0: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
3af0: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
3b00: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
3b10: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
3b20: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
3b30: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
3b40: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
3b50: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
3b60: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
3b70: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
3b80: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
3b90: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
3ba0: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
3bb0: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
3bc0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
3bd0: 74 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74  t->n<=sizeof(Bit
3be0: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
3bf0: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
3c00: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
3c10: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
3c20: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
3c30: 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69       return ((Bi
3c40: 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20  tmask)1)<<i;.   
3c50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3c60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
3c70: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
3c80: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
3c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
3ca0: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
3cb0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
3cc0: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
3cd0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
3ce0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
3cf0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
3d00: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
3d10: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
3d20: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
3d30: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
3d40: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
3d50: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
3d60: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
3d70: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
3d80: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
3d90: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
3da0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
3db0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
3dc0: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
3dd0: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
3de0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
3df0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
3e00: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
3e10: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
3e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
3e30: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
3e40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
3e50: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
3e60: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
3e70: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
3e80: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
3e90: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
3ea0: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
3eb0: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
3ec0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
3ed0: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
3ee0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
3ef0: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
3f00: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
3f10: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
3f20: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
3f30: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
3f40: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
3f50: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
3f60: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
3f70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
3f80: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  The sqlite3Resol
3f90: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f  veExprNames() ro
3fa0: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
3fb0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
3fc0: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
3fd0: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
3fe0: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
3ff0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
4000: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
4010: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
4020: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
4030: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
4040: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
4050: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
4060: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
4070: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
4080: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
4090: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
40a0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
40b0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
40c0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
40d0: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
40e0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
40f0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
4100: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4110: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
4120: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
4130: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4140: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
4150: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
4160: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4170: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
4180: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
4190: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
41a0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
41b0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
41c0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
41d0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
41e0: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
41f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4200: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
4210: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4220: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4230: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
4240: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4250: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
4260: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
4270: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
4280: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4290: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
42a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
42b0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
42c0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
42d0: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
42e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
42f0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4300: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
4310: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
4320: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
4330: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
4340: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
4350: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
4360: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
4370: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
4380: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
4390: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
43a0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
43b0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
43c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
43d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
43e0: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
43f0: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
4400: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4410: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4420: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
4430: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
4440: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
4450: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4460: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4470: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
4480: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
4490: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
44a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
44b0: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
44c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
44d0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
44e0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
44f0: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
4500: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4510: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4520: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
4530: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4540: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4550: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
4560: 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b  pS = pS->pPrior;
4570: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
4580: 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  sk;.}../*.** Ret
4590: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
45a0: 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69  given operator i
45b0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  s one of the ope
45c0: 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a  rators that is.*
45d0: 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e  * allowed for an
45e0: 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45   indexable WHERE
45f0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54   clause term.  T
4600: 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61  he allowed opera
4610: 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c  tors are.** "=",
4620: 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c   "<", ">", "<=",
4630: 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e   ">=", and "IN".
4640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
4650: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
4660: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
4670: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
4680: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4690: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
46a0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
46b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
46c0: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
46d0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
46e0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
46f0: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
4700: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
4710: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
4720: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
4730: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
4740: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
4750: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
4760: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
4770: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
4780: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
4790: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
47a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
47b0: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
47c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
47d0: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
47e0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
47f0: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
4800: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4810: 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74  ence is associat
4820: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74  ed with either t
4830: 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74  he left or right
4840: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
4850: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
4860: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
4870: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
4880: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
4890: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
48a0: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
48b0: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
48c0: 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65  s .** "X collate
48d0: 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54   NOCASE op Y". T
48e0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
48f0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4900: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
4910: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
4920: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
4930: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
4940: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4950: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
4960: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
4970: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
4980: 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  he EP_ExpCollate
4990: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
49a0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
49b0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
49c0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
49d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
49e0: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
49f0: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
4a00: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
4a10: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
4a20: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
4a30: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4a40: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
4a60: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4a70: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
4a80: 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d  K_IN );.  pExpr-
4a90: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d  >pRight->pColl =
4aa0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4ab0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4ac0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4ad0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4ae0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4af0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4b00: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4b10: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
4b20: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4b30: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
4b40: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
4b50: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4b60: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4b70: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4b80: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
4b90: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
4ba0: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
4bb0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4bc0: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
4bd0: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
4be0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
4bf0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
4c00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
4c10: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
4c20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4c30: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
4c40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4c50: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
4c60: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
4c70: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
4c80: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
4c90: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
4ca0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
4cb0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
4cc0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
4cd0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
4ce0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
4cf0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
4d00: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
4d10: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
4d20: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
4d30: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
4d40: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
4d50: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
4d60: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4d70: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
4d80: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
4d90: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
4da0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
4db0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
4dc0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
4dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4de0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
4df0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
4e00: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
4e10: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
4e20: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
4e30: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
4e40: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
4e50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4e60: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
4e70: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
4e80: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
4e90: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
4ea0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
4eb0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
4ec0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
4ed0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
4ee0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
4ef0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
4f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4f10: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
4f20: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
4f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
4f40: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
4f50: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4f60: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4f70: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4f80: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4f90: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4fa0: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4fb0: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
4fc0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
4fd0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
4fe0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
4ff0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5000: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5010: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5020: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
5030: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
5040: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
5050: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
5060: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
5070: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
5080: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
5090: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
50a0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
50b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
50c0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
50d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
50e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
50f0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
5100: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
5110: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
5120: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
5130: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
5140: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
5150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5160: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
5170: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
5180: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
5190: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
51a0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
51b0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
51c0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
51d0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
51e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
51f0: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61  rm;.  int k;.  a
5200: 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29  ssert( iCur>=0 )
5210: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c  ;.  op &= WO_ALL
5220: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
5230: 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
5240: 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72  rm; k; k--, pTer
5250: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
5260: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5270: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20  =iCur.       && 
5280: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
5290: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
52a0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65  =0.       && pTe
52b0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
52c0: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
52d0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
52e0: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
52f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
5300: 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65  pIdx && pTerm->e
5310: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e  Operator!=WO_ISN
5320: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ULL ){.        E
5330: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
5340: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
5350: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5360: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
5370: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
5380: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
5390: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
53a0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
53b0: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
53c0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
53d0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
53e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
53f0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5400: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
5410: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
5420: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
5430: 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  out the collatio
5440: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69  n sequence requi
5450: 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65  red from an inde
5460: 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  x for.        **
5470: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
5480: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
5490: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
54a0: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
54b0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
54c0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
54d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
54e0: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
54f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t);.        pCol
5500: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
5510: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
5520: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
5530: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
5540: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5550: 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Coll || pParse->
5560: 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  nErr);..        
5570: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
5580: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
5590: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
55a0: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
55b0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
55c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
55d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
55e0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
55f0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5600: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5610: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
5620: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5630: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
5640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5650: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5660: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5670: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5680: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5690: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
56a0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
56b0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
56c0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
56d0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
56e0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
56f0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5700: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5710: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5720: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5730: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5740: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5750: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5760: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5770: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5780: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5790: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
57a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
57b0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
57c0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
57d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
57e0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
57f0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5800: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5810: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5820: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5830: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5840: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5850: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5870: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5880: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
5890: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
58a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
58b0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
58c0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
58d0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
58e0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
58f0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5900: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5910: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5930: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5940: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5950: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5960: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5970: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5980: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5990: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
59a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
59b0: 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a  *pnPattern,   /*
59c0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
59d0: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
59e0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69  haracters */.  i
59f0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
5a00: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5a10: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
5a20: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
5a30: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
5a40: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5a50: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5a60: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5a70: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5a80: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5a90: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
5aa0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5ab0: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5ac0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5ad0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5ae0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
5af0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
5b00: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5b10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
5b30: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
5b40: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
5b50: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
5b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
5b80: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
5b90: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5bb0: 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
5bc0: 67 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  g z[] */.  int c
5bd0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5be0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5bf0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
5c00: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
5c10: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
5c20: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
5c30: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
5c40: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 43 6f  aracters */.  Co
5c50: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
5c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
5c70: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5c80: 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73 71 6c 69  or LHS */.  sqli
5c90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5ca0: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5cb0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5cc0: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
5cd0: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
5ce0: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
5cf0: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
5d00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
5d10: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
5d20: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
5d30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
5d40: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
5d50: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
5d60: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
5d70: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
5d80: 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
5d90: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72 65  STRING ){.    re
5da0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
5db0: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5dc0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5dd0: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5de0: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
5df0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c  n 0;.  }.  pColl
5e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
5e10: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
5e20: 65 66 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  eft);.  assert( 
5e30: 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 4c 65 66  pColl!=0 || pLef
5e40: 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  t->iColumn==-1 )
5e50: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
5e60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
5e70: 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65 66 69 6e  llation is defin
5e80: 65 64 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44  ed for the ROWID
5e90: 2e 20 20 55 73 65 20 74 68 65 20 64 65 66 61 75  .  Use the defau
5ea0: 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c  lt. */.    pColl
5eb0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
5ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f  ;.  }.  if( (pCo
5ed0: 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45  ll->type!=SQLITE
5ee0: 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20  _COLL_BINARY || 
5ef0: 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20  *pnoCase) &&.   
5f00: 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21     (pColl->type!
5f10: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43  =SQLITE_COLL_NOC
5f20: 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61 73 65  ASE || !*pnoCase
5f30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5f40: 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 6f  0;.  }.  z = (co
5f50: 6e 73 74 20 63 68 61 72 2a 29 70 52 69 67 68 74  nst char*)pRight
5f60: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74  ->token.z;.  cnt
5f70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b   = 0;.  if( z ){
5f80: 0a 20 20 20 20 6e 20 3d 20 70 52 69 67 68 74 2d  .    n = pRight-
5f90: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 77 68  >token.n;.    wh
5fa0: 69 6c 65 28 20 63 6e 74 3c 6e 20 26 26 20 28 63  ile( cnt<n && (c
5fb0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
5fc0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
5fd0: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
5fe0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
5ff0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6000: 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28  cnt==0 || 255==(
6010: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
6020: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6030: 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20  .  *pisComplete 
6040: 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20  = z[cnt]==wc[0] 
6050: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
6060: 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63    *pnPattern = c
6070: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  nt;.  return 1;.
6080: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6090: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
60a0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
60b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
60c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
60d0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
60e0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
60f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
6100: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
6110: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
6120: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
6130: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
6140: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
6150: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
6160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6170: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
6180: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
6190: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
61a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
61b0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
61c0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
61d0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
61e0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
61f0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   0;.  }.  if( pE
6200: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20  xpr->token.n!=5 
6210: 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ||.       sqlite
6220: 33 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74  3StrNICmp((const
6230: 20 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f   char*)pExpr->to
6240: 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29  ken.z,"match",5)
6250: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6260: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6270: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6280: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6290: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
62a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
62b0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
62c0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
62d0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
62e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
62f0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6300: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6310: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
6320: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
6330: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
6340: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
6350: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6360: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
6370: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6380: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
6390: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
63a0: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
63b0: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
63c0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
63d0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
63e0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
63f0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
6400: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
6410: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
6420: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
6430: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
6440: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6450: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
6460: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6470: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6480: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6490: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
64a0: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
64b0: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
64c0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
64d0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
64e0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
64f0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
6500: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
6510: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
6520: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6530: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6560: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6570: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6580: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6590: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
65a0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
65b0: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
65c0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
65d0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
65e0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
65f0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
6600: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
6610: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
6620: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6630: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6640: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6650: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6660: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6670: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6680: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6690: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
66a0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
66b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
66c0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
66d0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
66e0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
66f0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
6700: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
6710: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
6720: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
6730: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
6740: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
6750: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
6760: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
6770: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
6780: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
6790: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
67a0: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
67b0: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
67c0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
67d0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
67e0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
67f0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
6800: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
6810: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
6820: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
6830: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
6840: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
6850: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
6860: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
6870: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
6880: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
6890: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
68a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
68b0: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
68c0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
68d0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
68e0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
68f0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
6900: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
6910: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
6920: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
6930: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
6940: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
6950: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
6960: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
6970: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
6980: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
6990: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
69a0: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
69b0: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
69c0: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
69d0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
69e0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
69f0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
6a00: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
6a10: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
6a20: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
6a30: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
6a40: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
6a50: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
6a60: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
6a70: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
6a80: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
6a90: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
6aa0: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
6ab0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
6ac0: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
6ad0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
6ae0: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
6af0: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
6b00: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
6b10: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
6b20: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
6b30: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
6b40: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
6b50: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
6b60: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
6b70: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
6b80: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
6b90: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
6ba0: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
6bb0: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
6bc0: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
6bd0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
6be0: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
6bf0: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
6c00: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
6c10: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
6c20: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
6c30: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
6c40: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
6c50: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
6c60: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
6c70: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
6c80: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
6c90: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
6ca0: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
6cb0: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
6cc0: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
6cd0: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
6ce0: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
6cf0: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
6d00: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
6d10: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
6d20: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
6d30: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
6d40: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
6d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
6d60: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
6d70: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
6d80: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
6d90: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
6da0: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
6db0: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
6dc0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
6dd0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
6de0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6df0: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6e00: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6e10: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6e20: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
6e30: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
6e40: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
6e50: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
6e60: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
6e70: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
6e80: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
6e90: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
6ea0: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
6eb0: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
6ec0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
6ed0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
6ee0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
6ef0: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
6f00: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
6f10: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
6f20: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
6f30: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
6f40: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
6f50: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
6f60: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
6f70: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
6f80: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
6f90: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
6fa0: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
6fb0: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
6fc0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
6fd0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
6fe0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
6ff0: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7000: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7010: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7020: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7030: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
7040: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
7050: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
7060: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
7070: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
7080: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
7090: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
70a0: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
70b0: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
70c0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
70d0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
70e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
70f0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7100: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7110: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7120: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7130: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
7140: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
7150: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
7160: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7170: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7190: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
71a0: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
71b0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
71c0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
71d0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
71e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
71f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7200: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7210: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7220: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7230: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7240: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7250: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7260: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7270: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7280: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7290: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
72a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
72b0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
72c0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
72d0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
72e0: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
72f0: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7300: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7310: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7340: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
7350: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
7360: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
7370: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
7380: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
7390: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
73a0: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
73b0: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
73c0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
73d0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
73e0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
73f0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
7400: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
7410: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
7420: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
7430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7440: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
7450: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
7460: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
7470: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
7480: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
7490: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
74a0: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
74b0: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
74c0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
74d0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
74e0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
74f0: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
7500: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
7510: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
7520: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
7530: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
7540: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
7550: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
7560: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
7570: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
7580: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7590: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
75a0: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
75b0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
75c0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
75d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
75e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
75f0: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
7600: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
7610: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7620: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
7630: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
7640: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
7650: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
7660: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
7670: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
7680: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
7690: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
76a0: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
76b0: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
76c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
76d0: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
76e0: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
76f0: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
7700: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
7710: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
7720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
7730: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
7740: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
7750: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
7760: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7770: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
7780: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
7790: 78 61 62 6c 65 20 3d 20 63 68 6e 67 54 6f 49 4e  xable = chngToIN
77a0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
77b0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
77c0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
77d0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26  pOrWc->a; i>=0 &
77e0: 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d  & indexable; i--
77f0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
7800: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
7810: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53  eOperator & WO_S
7820: 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  INGLE)==0 ){.   
7830: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
7840: 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20  *pAndInfo;.     
7850: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
7860: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29  ->eOperator==0 )
7870: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7880: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
7890: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
78a0: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
78b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
78c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
78d0: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
78e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
78f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
7900: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
7910: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
7920: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
7930: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
7940: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
7950: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
7960: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
7970: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
7980: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
7990: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
79a0: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
79b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
79c0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
79d0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
79e0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
79f0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
7a00: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
7a10: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
7a20: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
7a30: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
7a40: 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20  pMaskSet);.     
7a50: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
7a60: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7a70: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7a80: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7a90: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7aa0: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  WC);.        tes
7ab0: 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f  tcase( db->mallo
7ac0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7ad0: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
7ae0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7af0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
7b00: 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e  AndTerm=pAndWC->
7b10: 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65  a; j<pAndWC->nTe
7b20: 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72  rm; j++, pAndTer
7b30: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
7b40: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65    assert( pAndTe
7b50: 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
7b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c           if( all
7b70: 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d  owedOp(pAndTerm-
7b80: 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20  >pExpr->op) ){. 
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c               b |
7ba0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7bb0: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
7bc0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7be0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7bf0: 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65         indexable
7c00: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
7c10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
7c20: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7c30: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
7c40: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69       /* Skip thi
7c50: 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20  s term for now. 
7c60: 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77   We revisit it w
7c70: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74  hen we process t
7c80: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  he.      ** corr
7c90: 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56  esponding TERM_V
7ca0: 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20  IRTUAL term */. 
7cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7cc0: 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20  Bitmask b;.     
7cd0: 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   b = getMask(pMa
7ce0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7cf0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7d00: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7d10: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7d20: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7d30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7d40: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7d50: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7d60: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7d70: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
7d80: 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75  , pOther->leftCu
7d90: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
7da0: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
7db0: 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = b;.      if( p
7dc0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7dd0: 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20  r!=WO_EQ ){.    
7de0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7df0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7e00: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7e10: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7e20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7e30: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7e40: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7e50: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7e60: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7e70: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7e80: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7e90: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7ea0: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7eb0: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7ec0: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ed0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7ee0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7ef0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7f00: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7f10: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7f20: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7f30: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7f40: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7f50: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7f60: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7f70: 69 73 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  isfied..  */.  i
7f80: 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  f( chngToIN ){. 
7f90: 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54     int okToChngT
7fa0: 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  oIN = 0;     /* 
7fb0: 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76  True if the conv
7fc0: 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20  ersion to IN is 
7fd0: 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  valid */.    int
7fe0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20   iColumn = -1;  
7ff0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
8000: 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66   index on lhs of
8010: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
8020: 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20      int iCursor 
8030: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8040: 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f   Table cursor co
8050: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d  mmon to all term
8060: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d  s */.    int j =
8070: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8080: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8090: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  er */..    /* Se
80a0: 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65  arch for a table
80b0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74   and column that
80c0: 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20   appears on one 
80d0: 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
80e0: 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  ** other of the 
80f0: 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65  == operator in e
8100: 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54  very subterm.  T
8110: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  hat table and co
8120: 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  lumn.    ** will
8130: 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20   be recorded in 
8140: 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c  iCursor and iCol
8150: 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68  umn.  There migh
8160: 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20  t not be any.   
8170: 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61   ** such table a
8180: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20  nd column.  Set 
8190: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20  okToChngToIN if 
81a0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  an appropriate t
81b0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  able.    ** and 
81c0: 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20  column is found 
81d0: 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68  but leave okToCh
81e0: 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20  ngToIN false if 
81f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  not found..    *
8200: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
8210: 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54  <2 && !okToChngT
8220: 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  oIN; j++){.     
8230: 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63   pOrTerm = pOrWc
8240: 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ->a;.      for(i
8250: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b  =pOrWc->nTerm-1;
8260: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
8270: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
8280: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8290: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
82a0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
82b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
82c0: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
82d0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
82e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
82f0: 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
8300: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
8310: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
8320: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
8330: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8340: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
8350: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  ;.        iColum
8360: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
8370: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
8380: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
8390: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
83a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
83b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
83c0: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
83d0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
83e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
83f0: 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e  ( (chngToIN&(chn
8400: 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a  gToIN-1))==0 );.
8410: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8420: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
8430: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 6f 6c  k(pMaskSet, iCol
8440: 75 6d 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  umn) );.        
8450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8460: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
8470: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
8480: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
8490: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
84a0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
84b0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
84c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
84d0: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _EQ );.        i
84e0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
84f0: 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20  Cursor!=iCursor 
8500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
8510: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
8520: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
8530: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8540: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
8550: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
8560: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f  {.          okTo
8570: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
8580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8590: 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65         int affLe
85a0: 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20  ft, affRight;.  
85b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
85c0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
85d0: 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75  e is also a colu
85e0: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  mn, then the aff
85f0: 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20  inities.        
8600: 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67    ** of both rig
8610: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
8620: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
8630: 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20  hat no type.    
8640: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73        ** convers
8650: 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
8660: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  d on the right. 
8670: 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a   (Ticket #2249).
8680: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
8690: 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20         affRight 
86a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
86b0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
86c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
86d0: 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74           affLeft
86e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
86f0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
8700: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8710: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66           if( aff
8720: 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52  Right!=0 && affR
8730: 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b  ight!=affLeft ){
8740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54  .            okT
8750: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
8760: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
8770: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54              pOrT
8780: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8790: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
87a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
87b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
87c0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
87d0: 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54  point, okToChngT
87e0: 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f  oIN is true if o
87f0: 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61  riginal pTerm sa
8800: 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63  tisfies.    ** c
8810: 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20  ase 1.  In that 
8820: 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20  case, construct 
8830: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  a new virtual te
8840: 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20  rm that is .    
8850: 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74  ** pTerm convert
8860: 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ed into an IN op
8870: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
8880: 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54     if( okToChngT
8890: 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  oIN ){.      Exp
88a0: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
88b0: 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65      /* A transie
88c0: 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70  nt duplicate exp
88d0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
88e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
88f0: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52   = 0;   /* The R
8900: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
8910: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
8920: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20  xpr *pLeft = 0; 
8930: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
8940: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
8950: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
8960: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
8970: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
8980: 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ete IN operator 
8990: 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  */..      for(i=
89a0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
89b0: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
89c0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
89d0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
89e0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77   if( (pOrTerm->w
89f0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
8a00: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
8a10: 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
8a20: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
8a30: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
8a40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8a50: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8a60: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b  rsor==iCursor );
8a70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8a80: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8a90: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
8aa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  );.        pDup 
8ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8ac0: 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  (db, pOrTerm->pE
8ad0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
8ae0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
8af0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8b00: 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72  Append(pWC->pPar
8b10: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c  se, pList, pDup,
8b20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65   0);.        pLe
8b30: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
8b40: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
8b50: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
8b60: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
8b70: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
8b80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
8b90: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
8ba0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
8bb0: 72 28 64 62 2c 20 54 4b 5f 49 4e 2c 20 70 44 75  r(db, TK_IN, pDu
8bc0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
8bd0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
8be0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
8bf0: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
8c00: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
8c10: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
8c20: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
8c30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
8c40: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8c50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
8c60: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
8c70: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
8c80: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
8c90: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  sert(pWC, pNew, 
8ca0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
8cb0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
8cc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
8cd0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
8ce0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
8cf0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
8d00: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
8d10: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
8d20: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43  rm];.        pWC
8d30: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
8d40: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
8d50: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
8d60: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
8d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8d80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8d90: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
8da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8db0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8dc0: 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  = 0;  /* case 1 
8dd0: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
8de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8df0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
8e00: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
8e10: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
8e20: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
8e30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
8e40: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
8e50: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
8e60: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
8e70: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
8e80: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
8e90: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
8ea0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
8eb0: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
8ec0: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
8ed0: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
8ee0: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
8ef0: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
8f00: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
8f10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8f20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
8f30: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
8f40: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
8f50: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
8f60: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
8f70: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
8f80: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
8f90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8fa0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
8fb0: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
8fc0: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
8fd0: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
8fe0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
8ff0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
9000: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
9010: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
9020: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
9030: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
9040: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
9050: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
9060: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
9070: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
9080: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
9090: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
90a0: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
90b0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
90c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
90d0: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
90e0: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
90f0: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
9100: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
9110: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
9120: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
9130: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
9140: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
9150: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
9160: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
9170: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
9180: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
9190: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
91a0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
91b0: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
91c0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
91d0: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
91e0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
91f0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
9200: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
9210: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
9220: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
9230: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
9240: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
9250: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9260: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
9270: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
9280: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
9290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92a0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
92b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
92c0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
92d0: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
92e0: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
92f0: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
9300: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9330: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
9340: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
9350: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
9360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9370: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
9380: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
9390: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
93a0: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
93b0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
93c0: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
93d0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
93e0: 72 61 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 69  raRight = 0;.  i
93f0: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69  nt nPattern;.  i
9400: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
9410: 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 69   int noCase;.  i
9420: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
9450: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
9460: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
9470: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
9480: 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se;     /* Parsi
9490: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
94a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
94b0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
94c0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
94d0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
94e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
94f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9500: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
9510: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
9520: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70  ;.  pMaskSet = p
9530: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
9540: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
9550: 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65  Expr;.  prereqLe
9560: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
9570: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9580: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
9590: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
95a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
95b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
95c0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
95d0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
95e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
95f0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9600: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9610: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9620: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
9630: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9640: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
9650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9660: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9670: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
9680: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9690: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
96a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
96b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
96c0: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
96d0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
96e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
96f0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9700: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
9710: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9720: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
9730: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
9740: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9750: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
9760: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9770: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9780: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9790: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
97a0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
97b0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
97c0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
97d0: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
97e0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
97f0: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
9800: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
9810: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
9820: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
9830: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
9840: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
9850: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
9860: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
9870: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
9880: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
9890: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
98a0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
98b0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
98c0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
98d0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
98e0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26  allowedOp(op) &&
98f0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
9900: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
9910: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  t)==0 ){.    Exp
9920: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
9930: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70  ->pLeft;.    Exp
9940: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
9950: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
9960: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
9970: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
9980: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
9990: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
99a0: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
99b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
99c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
99d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
99e0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
99f0: 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d  rMask(op);.    }
9a00: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
9a10: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
9a20: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
9a30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
9a40: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
9a50: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
9a60: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9a70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
9a80: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
9a90: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9aa0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
9ab0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
9ac0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9ad0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
9ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9af0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
9b00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
9b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b20: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
9b30: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
9b40: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
9b50: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
9b60: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
9b70: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
9b80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
9b90: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
9ba0: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
9bb0: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
9bc0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9bd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
9be0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
9bf0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
9c00: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
9c10: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
9c20: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
9c30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9c40: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
9c50: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
9c60: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
9c70: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61   exprCommute(pPa
9c80: 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  rse, pDup);.    
9c90: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
9ca0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
9cb0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
9cc0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
9cd0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
9ce0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
9cf0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
9d00: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
9d10: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a  t = prereqLeft;.
9d20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
9d30: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
9d40: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
9d50: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
9d60: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
9d70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
9d80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9d90: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
9da0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
9db0: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
9dc0: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
9dd0: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
9de0: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
9df0: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
9e00: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
9e10: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
9e20: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
9e30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9e40: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
9e50: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
9e60: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
9e70: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
9e80: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
9e90: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
9ea0: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
9eb0: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
9ec0: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
9ed0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9ee0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
9ef0: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
9f00: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
9f10: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
9f20: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
9f30: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
9f40: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
9f50: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
9f60: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
9f70: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
9f80: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
9f90: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
9fa0: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
9fb0: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
9fc0: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
9fd0: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
9fe0: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
9ff0: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
a000: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
a010: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
a020: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
a030: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
a040: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
a050: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
a060: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
a070: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
a080: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
a090: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
a0a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a0b0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
a0c0: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
a0d0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
a0e0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
a0f0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
a100: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
a110: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
a120: 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c 20 73 71  r(db, ops[i], sq
a130: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a140: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
a150: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a180: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
a190: 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20  Expr, 0), 0);.  
a1a0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
a1b0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
a1c0: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
a1d0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a1e0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a1f0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
a200: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
a210: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
a220: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
a230: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a240: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a250: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
a260: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
a270: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  erm;.    }.    p
a280: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
a290: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
a2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
a2b0: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
a2c0: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
a2d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
a2e0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
a2f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a300: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
a310: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20  .  /* Analyze a 
a320: 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d  term that is com
a330: 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20  posed of two or 
a340: 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f  more subterms co
a350: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20  nnected by.  ** 
a360: 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a  an OR operator..
a370: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
a380: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
a390: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a3a0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
a3b0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
a3c0: 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70  zeOrTerm(pSrc, p
a3d0: 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  WC, idxTerm);.  
a3e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a3f0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
a400: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
a410: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a420: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
a430: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
a440: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
a450: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
a460: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
a470: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
a480: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
a490: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
a4a0: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
a4b0: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
a4c0: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
a4d0: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
a4e0: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
a4f0: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
a500: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
a510: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
a520: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
a530: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
a540: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
a550: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
a560: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
a570: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
a580: 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47  .  if( isLikeOrG
a590: 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70  lob(pParse, pExp
a5a0: 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69  r, &nPattern, &i
a5b0: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
a5c0: 73 65 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  se).         && 
a5d0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
a5e0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
a5f0: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
a600: 20 45 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70   Expr *pStr1, *p
a610: 53 74 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a  Str2;.    Expr *
a620: 70 4e 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77  pNewExpr1, *pNew
a630: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
a640: 64 78 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b  dxNew1, idxNew2;
a650: 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
a660: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
a670: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  1].pExpr;.    pR
a680: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
a690: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
a6a0: 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73  r;.    pStr1 = s
a6b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a6c0: 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 30  se, TK_STRING, 0
a6d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
a6e0: 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20   pStr1 ){.      
a6f0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
a700: 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f 6b  (db, &pStr1->tok
a710: 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  en, &pRight->tok
a720: 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31  en);.      pStr1
a730: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74  ->token.n = nPat
a740: 74 65 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tern;.    }.    
a750: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
a760: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
a770: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
a780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a790: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
a7a0: 70 43 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73  pC;.      /* ass
a7b0: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
a7c0: 6e 2e 64 79 6e 20 29 3b 20 2a 2f 0a 20 20 20 20  n.dyn ); */.    
a7d0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
a7e0: 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74  r2->token.z[nPat
a7f0: 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 63  tern-1];.      c
a800: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
a810: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
a820: 20 20 20 20 69 66 28 20 63 3d 3d 27 40 27 20 29      if( c=='@' )
a830: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
a840: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
a850: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
a860: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
a870: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
a880: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 78      }.    pNewEx
a890: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
a8a0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
a8b0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
a8c0: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 70 53 74  (db,pLeft,0),pSt
a8d0: 72 31 2c 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  r1,0);.    idxNe
a8e0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
a8f0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
a900: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
a910: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
a920: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a930: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
a940: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a950: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
a960: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
a970: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
a980: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20  (pParse, TK_LT, 
a990: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9a0: 62 2c 70 4c 65 66 74 2c 30 29 2c 70 53 74 72 32  b,pLeft,0),pStr2
a9b0: 2c 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32  ,0);.    idxNew2
a9c0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a9d0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
a9e0: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
a9f0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
aa00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
aa10: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
aa20: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
aa30: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
aa40: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
aa50: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
aa60: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
aa70: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
aa80: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
aa90: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
aaa0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
aab0: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
aac0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
aad0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
aae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aaf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ab00: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
ab10: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
ab20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
ab30: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
ab40: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
ab50: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
ab60: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
ab70: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
ab80: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
ab90: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
aba0: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
abb0: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
abc0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
abd0: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
abe0: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
abf0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
ac00: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
ac10: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
ac20: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
ac30: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
ac40: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
ac50: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
ac60: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
ac70: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
ac80: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
ac90: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
aca0: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
acb0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
acc0: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
acd0: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
ace0: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
acf0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
ad00: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
ad10: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
ad20: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
ad30: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
ad40: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
ad50: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ad60: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
ad70: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
ad80: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
ad90: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
ada0: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
adb0: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
adc0: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
add0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
ade0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
adf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
ae00: 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  b, TK_MATCH, 0, 
ae10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ae20: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
ae30: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
ae40: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
ae50: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
ae60: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
ae70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
ae80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
ae90: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
aea0: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
aeb0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
aec0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
aed0: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
aee0: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
aef0: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
af00: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
af10: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
af20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
af30: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
af40: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
af50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
af60: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
af70: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
af80: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
af90: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
afa0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
afb0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
afc0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
afd0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
afe0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
aff0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
b000: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
b010: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
b020: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b030: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b040: 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  ABLE */..  /* Pr
b050: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
b060: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
b070: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
b080: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
b090: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
b0a0: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
b0b0: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
b0c0: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
b0d0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
b0e0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
b0f0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b100: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
b110: 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74  essions in pList
b120: 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63  ->a[iFirst...] c
b130: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65  ontain.** a refe
b140: 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62  rence to any tab
b150: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  le other than th
b160: 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a  e iBase table..*
b170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 66  /.static int ref
b180: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
b190: 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  es(.  ExprList *
b1a0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
b1b0: 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65 73  /* Search expres
b1c0: 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73  sions in ths lis
b1d0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
b1e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
b1f0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
b200: 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61   tables to bitma
b210: 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  ps */.  int iFir
b220: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
b230: 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e    /* Be searchin
b240: 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72 73  g with the iFirs
b250: 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  t-th expression 
b260: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20  */.  int iBase  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b280: 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e  * Ignore referen
b290: 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
b2a0: 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  e */.){.  Bitmas
b2b0: 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74  k allowed = ~get
b2c0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69  Mask(pMaskSet, i
b2d0: 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Base);.  while( 
b2e0: 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45  iFirst<pList->nE
b2f0: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  xpr ){.    if( (
b300: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
b310: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
b320: 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70  a[iFirst++].pExp
b330: 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29  r)&allowed)!=0 )
b340: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
b350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b360: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
b370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
b380: 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63  ecides if pIdx c
b390: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61  an be used to sa
b3a0: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
b3b0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49  BY.** clause.  I
b3c0: 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74  f it can, it ret
b3d0: 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78  urns 1.  If pIdx
b3e0: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
b3f0: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
b400: 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75  clause, this rou
b410: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a  tine returns 0..
b420: 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
b430: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
b440: 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45  ause from a SELE
b450: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70  CT statement.  p
b460: 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65  Tab is the.** le
b470: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e  ft-most table in
b480: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b490: 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53 45   of that same SE
b4a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
b4b0: 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nd.** the table 
b4c0: 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  has a cursor num
b4d0: 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20  ber of "base".  
b4e0: 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78  pIdx is an index
b4f0: 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   on pTab..**.** 
b500: 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  nEqCol is the nu
b510: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
b520: 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72 65  of pIdx that are
b530: 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69 74   used as equalit
b540: 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73  y.** constraints
b550: 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20  .  Any of these 
b560: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d  columns may be m
b570: 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  issing from the 
b580: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
b590: 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68  se and the match
b5a0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20   can still be a 
b5b0: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41  success..**.** A
b5c0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
b5d0: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 6d 61  ORDER BY that ma
b5e0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
b5f0: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 69  index must be ei
b600: 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44  ther.** ASC or D
b610: 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20  ESC.  (Terms of 
b620: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b630: 75 73 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  use past the end
b640: 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20   of a UNIQUE.** 
b650: 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65  index do not nee
b660: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  d to satisfy thi
b670: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20  s constraint.)  
b680: 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65  The *pbRev value
b690: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20   is.** set to 1 
b6a0: 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
b6b0: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45  clause is all DE
b6c0: 53 43 20 61 6e 64 20 69 74 20 69 73 20 73 65 74  SC and it is set
b6d0: 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20   to 0 if.** the 
b6e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b6f0: 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73  is all ASC..*/.s
b700: 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74  tatic int isSort
b710: 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ingIndex(.  Pars
b720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b730: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b740: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b750: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
b760: 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  et, /* Mapping f
b770: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
b780: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
b790: 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  aps */.  Index *
b7a0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
b7b0: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
b7c0: 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a   are testing */.
b7d0: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
b7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
b7f0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
b800: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  he table to be s
b810: 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  orted */.  ExprL
b820: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
b830: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
b840: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
b850: 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20  nt nEqCol,      
b860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b870: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
b880: 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72  s with == constr
b890: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
b8a0: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
b8b0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
b8c0: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
b8d0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  SC */.){.  int i
b8e0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
b8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b900: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
b910: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d   int sortOrder =
b920: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b930: 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78   /* XOR of index
b940: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f   and ORDER BY so
b950: 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a  rt direction */.
b960: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
b990: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
b9a0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
b9b0: 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20  st_item *pTerm; 
b9c0: 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20     /* A term of 
b9d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b9e0: 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  use */.  sqlite3
b9f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ba00: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
ba10: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e  rderBy!=0 );.  n
ba20: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
ba30: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
ba40: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
ba50: 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f  /* Match terms o
ba60: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
ba70: 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f  lause against co
ba80: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
ba90: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
baa0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64  ** Note that ind
bab0: 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e  ices have pIdx->
bac0: 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20  nColumn regular 
bad0: 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a  columns plus.  *
bae0: 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c  * one additional
baf0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69   column containi
bb00: 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54  ng the rowid.  T
bb10: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a  he rowid column.
bb20: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
bb30: 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65  x is also allowe
bb40: 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  d to match again
bb50: 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  st the ORDER BY.
bb60: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
bb70: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  /.  for(i=j=0, p
bb80: 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Term=pOrderBy->a
bb90: 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
bba0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
bbb0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
bbc0: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
bbd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
bbe0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
bbf0: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
bc00: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
bc10: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
bc20: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
bc30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d   */.    int term
bc40: 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f  SortOrder; /* So
bc50: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
bc60: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  s term */.    in
bc70: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
bc80: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c   /* The i-th col
bc90: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
bca0: 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20  .  -1 for rowid 
bcb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74  */.    int iSort
bcc0: 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66  Order;    /* 1 f
bcd0: 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
bce0: 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
bcf0: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
bd00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
bd10: 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ll; /* Name of t
bd20: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
bd30: 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69  uence for i-th i
bd40: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20  ndex term */..  
bd50: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
bd60: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
bd70: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
bd80: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
bd90: 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
bda0: 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20       /* Can not 
bdb0: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72  use an index sor
bdc0: 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  t on anything th
bdd0: 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  at is not a colu
bde0: 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  mn in the.      
bdf0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
be00: 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  le of the FROM c
be10: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62  lause */.      b
be20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
be30: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
be40: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
be50: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
be60: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
be70: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
be80: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
be90: 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e      if( i<pIdx->
bea0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
beb0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
bec0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
bed0: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
bee0: 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  =pIdx->pTable->i
bef0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
bf00: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
bf10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72      }.      iSor
bf20: 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
bf30: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
bf40: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78      zColl = pIdx
bf50: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43   }else{.      iC
bf70: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
bf80: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30    iSortOrder = 0
bf90: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
bfa0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
bfb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70    }.    if( pExp
bfc0: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
bfd0: 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  umn || sqlite3St
bfe0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
bff0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
c000: 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
c010: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c020: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
c030: 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
c040: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
c050: 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
c060: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
c070: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
c080: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
c090: 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
c0a0: 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
c0b0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
c0c0: 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
c0d0: 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
c0e0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
c0f0: 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
c100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
c110: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
c120: 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  e if( i==pIdx->n
c130: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
c140: 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d    /* Index colum
c150: 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64  n i is the rowid
c160: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72  .  All other ter
c170: 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20  ms match. */.   
c180: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c1a0: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
c1b0: 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
c1c0: 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
c1d0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
c1e0: 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
c1f0: 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
c200: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
c210: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
c220: 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
c230: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c250: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
c260: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
c270: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c280: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
c290: 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72  =0 || pTerm->sor
c2a0: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
c2b0: 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72   assert( iSortOr
c2c0: 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f  der==0 || iSortO
c2d0: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74  rder==1 );.    t
c2e0: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69  ermSortOrder = i
c2f0: 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72  SortOrder ^ pTer
c300: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
c310: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
c320: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  {.      if( term
c330: 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
c340: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
c350: 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f  /* Indices can o
c360: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61  nly be used if a
c370: 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
c380: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20  s past the.     
c390: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63     ** equality c
c3a0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
c3b0: 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f  ll either DESC o
c3c0: 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20  r ASC. */.      
c3d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c3e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
c3f0: 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
c400: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a   termSortOrder;.
c410: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
c420: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     pTerm++;.    
c430: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  if( iColumn<0 &&
c440: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
c450: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
c460: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
c470: 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ase) ){.      /*
c480: 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   If the indexed 
c490: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72  column is the pr
c4a0: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76  imary key and ev
c4b0: 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73  erything matches
c4c0: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72  .      ** so far
c4d0: 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
c4e0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
c4f0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65 66  to the right ref
c500: 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20  erence other.   
c510: 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20     ** tables in 
c520: 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77  the join, then w
c530: 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74 68  e are assured th
c540: 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  at the index can
c550: 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20 20   be used .      
c560: 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75  ** to sort becau
c570: 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  se the primary k
c580: 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64  ey is unique and
c590: 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   so none of the 
c5a0: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  other.      ** c
c5b0: 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65  olumns will make
c5c0: 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a   any difference.
c5d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
c5e0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = nTerm;.    }.
c5f0: 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20    }..  *pbRev = 
c600: 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20  sortOrder!=0;.  
c610: 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a  if( j>=nTerm ){.
c620: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
c630: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
c640: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65   clause are cove
c650: 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65  red by this inde
c660: 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73  x so.    ** this
c670: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
c680: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20  ed for sorting. 
c690: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
c6a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
c6b0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
c6c0: 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43  e && i==pIdx->nC
c6d0: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21  olumn.      && !
c6e0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
c6f0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
c700: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
c710: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  e) ){.    /* All
c720: 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69   terms of this i
c730: 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20  ndex match some 
c740: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52  prefix of the OR
c750: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
c760: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
c770: 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64  ex is UNIQUE and
c780: 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65   no terms on the
c790: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44   tail of the ORD
c7a0: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
c7b0: 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74  use reference ot
c7c0: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20  her tables in a 
c7d0: 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69  join.  If this i
c7e0: 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a  s all true then.
c7f0: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72      ** the order
c800: 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75   by clause is su
c810: 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20  perfluous. */.  
c820: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c830: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c840: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65  *.** Check table
c850: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f   to see if the O
c860: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
c870: 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62  n pOrderBy can b
c880: 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
c890: 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64  y sorting in ord
c8a0: 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65  er of ROWID.  Re
c8b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20  turn true if so 
c8c0: 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20 74  and set *pbRev t
c8d0: 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72  o be.** true for
c8e0: 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20 61   reverse ROWID a
c8f0: 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72  nd false for for
c900: 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72  ward ROWID order
c910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c920: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
c930: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
c940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
c950: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
c960: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
c970: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
c980: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
c990: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
c9a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
c9b0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
c9c0: 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  et, /* Mapping f
c9d0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
c9e0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
c9f0: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
ca10: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
ca20: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
ca30: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
ca40: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
ca50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ca60: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
ca70: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
ca80: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
ca90: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
caa0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
cab0: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
cac0: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
cad0: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
cae0: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
caf0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
cb00: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
cb10: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
cb20: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
cb30: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cb40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cb50: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
cb60: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
cb70: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
cb80: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
cb90: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
cba0: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
cbb0: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
cbc0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
cbd0: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
cbe0: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
cbf0: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
cc00: 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ions with O(logN
cc10: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
cc20: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
cc30: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
cc40: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
cc50: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
cc60: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
cc70: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
cc80: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
cc90: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
cca0: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
ccb0: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
ccc0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
ccd0: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
cce0: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
ccf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
cd00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
cd10: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
cd20: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
cd30: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
cd40: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
cd50: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
cd60: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
cd70: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
cd80: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
cd90: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
cda0: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
cdb0: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
cdc0: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
cdd0: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
cde0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cdf0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
ce00: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
ce10: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
ce20: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
ce30: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
ce40: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
ce50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
ce60: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
ce70: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
ce80: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
ce90: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
cea0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ceb0: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
cec0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
ced0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
cee0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
cef0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
cf00: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
cf10: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
cf20: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
cf30: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
cf40: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
cf50: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
cf60: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
cf70: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
cf80: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
cf90: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
cfa0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
cfb0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
cfc0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
cfd0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
cfe0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
cff0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
d000: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
d010: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
d020: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
d030: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
d040: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
d050: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
d060: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
d070: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
d080: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
d090: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
d0a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
d0b0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
d0c0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
d0d0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
d0e0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
d0f0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d100: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d110: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
d120: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d130: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
d140: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
d150: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d160: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
d170: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
d180: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d190: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
d1a0: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
d1b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d1c0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
d1d0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
d1e0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
d1f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d200: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
d210: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
d220: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
d230: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
d240: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
d250: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
d260: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
d270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
d280: 52 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  Required because
d290: 20 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20   bestIndex() is 
d2a0: 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72  called by bestOr
d2b0: 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a  ClauseIndex() .*
d2c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
d2d0: 73 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61 72  stIndex(.    Par
d2e0: 73 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  se*, WhereClause
d2f0: 2a 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  *, struct SrcLis
d300: 74 5f 69 74 65 6d 2a 2c 20 42 69 74 6d 61 73 6b  t_item*, Bitmask
d310: 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68 65  , ExprList*, Whe
d320: 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  reCost*);../*.**
d330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
d340: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
d350: 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74  n scanning strat
d360: 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  egy that can be 
d370: 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69  used .** to opti
d380: 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70  mize an 'OR' exp
d390: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
d3a0: 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
d3b0: 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  clause. .**.** T
d3c0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
d3d0: 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c  ted with FROM cl
d3e0: 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d  ause term pSrc m
d3f0: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a  ay be either a.*
d400: 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65  * regular B-Tree
d410: 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
d420: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
d430: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72  atic void bestOr
d440: 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20 50  ClauseIndex(.  P
d450: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d470: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
d480: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
d490: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
d4a0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
d4b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
d4c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
d4d0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
d4e0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
d4f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
d500: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
d510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
d520: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
d530: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
d540: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
d550: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
d560: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
d570: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
d580: 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
d590: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
d5a0: 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
d5b0: 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69  ry plan */.){.#i
d5c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d5d0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
d5e0: 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43  N.  const int iC
d5f0: 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
d600: 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or;   /* The cur
d610: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
d620: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20   to be accessed 
d630: 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61  */.  const Bitma
d640: 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74  sk maskSrc = get
d650: 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
d660: 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42  et, iCur);  /* B
d670: 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20  itmask for pSrc 
d680: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
d690: 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20   const pWCEnd = 
d6a0: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
d6b0: 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  rm];        /* E
d6c0: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
d6d0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
d6e0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
d6f0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
d700: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
d710: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
d720: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57   /* Search the W
d730: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d740: 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57  s for a usable W
d750: 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  O_OR term. */.  
d760: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
d770: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
d780: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
d790: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
d7a0: 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20  or==WO_OR .     
d7b0: 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72  && ((pTerm->prer
d7c0: 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63  eqAll & ~maskSrc
d7d0: 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  ) & notReady)==0
d7e0: 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
d7f0: 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
d800: 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29  xable & maskSrc)
d810: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
d820: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
d830: 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
d840: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
d850: 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
d860: 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
d870: 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
d880: 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
d890: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
d8a0: 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
d8b0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45   int flags = WHE
d8c0: 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
d8d0: 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c     double rTotal
d8e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62   = 0;.      doub
d8f0: 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20  le nRow = 0;..  
d900: 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
d910: 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
d920: 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
d930: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
d940: 57 68 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43  WhereCost sTermC
d950: 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45  ost;.        WHE
d960: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75  RETRACE(("... Mu
d970: 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73  lti-index OR tes
d980: 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64  ting for term %d
d990: 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a   of %d....\n", .
d9a0: 20 20 20 20 20 20 20 20 20 20 28 70 4f 72 54 65            (pOrTe
d9b0: 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20  rm - pOrWC->a), 
d9c0: 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29  (pTerm - pWC->a)
d9d0: 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20  .        ));.   
d9e0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
d9f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
da00: 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AND ){.         
da10: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
da20: 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  ndWC = &pOrTerm-
da30: 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
da40: 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
da50: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e  ndex(pParse, pAn
da60: 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  dWC, pSrc, notRe
da70: 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f  ady, 0, &sTermCo
da80: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  st);.        }el
da90: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
daa0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
dac0: 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
dad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
dae0: 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d  WC.pParse = pWC-
daf0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
db00: 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53     tempWC.pMaskS
db10: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
db20: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  et;.          te
db30: 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
db40: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
db50: 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
db60: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
db70: 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
db80: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
db90: 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c  pParse, &tempWC,
dba0: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
dbb0: 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
dbc0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dbd0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
dbe0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
dbf0: 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
dc00: 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b  sTermCost.rCost;
dc10: 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
dc20: 20 73 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b   sTermCost.nRow;
dc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54 6f  .        if( rTo
dc40: 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  tal>=pCost->rCos
dc50: 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
dc60: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
dc70: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
dc80: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63  R BY clause, inc
dc90: 72 65 61 73 65 20 74 68 65 20 73 63 61 6e 20 63  rease the scan c
dca0: 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a  ost to account .
dcb0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
dcc0: 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72   cost of the sor
dcd0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
dce0: 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20  pOrderBy!=0 ){. 
dcf0: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
dd00: 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
dd10: 77 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  w);.        WHER
dd20: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
dd30: 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f  ting increases O
dd40: 52 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  R cost to %.9g\n
dd50: 22 2c 20 72 54 6f 74 61 6c 29 29 3b 0a 20 20 20  ", rTotal));.   
dd60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
dd70: 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 63  f the cost of sc
dd80: 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68 69  anning using thi
dd90: 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f 70  s OR term for op
dda0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20  timization is.  
ddb0: 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e      ** less than
ddc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 73   the current cos
ddd0: 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f 73  t stored in pCos
dde0: 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  t, replace the c
ddf0: 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a  ontents.      **
de00: 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20   of pCost. */.  
de10: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
de20: 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78  "... multi-index
de30: 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72   OR cost=%.9g nr
de40: 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74  ow=%.9g\n", rTot
de50: 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20  al, nRow));.    
de60: 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f    if( rTotal<pCo
de70: 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
de80: 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
de90: 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20  t = rTotal;.    
dea0: 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20      pCost->nRow 
deb0: 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  = nRow;.        
dec0: 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
ded0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
dee0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
def0: 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d  .u.pTerm = pTerm
df00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
df10: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
df20: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
df30: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a  IMIZATION */.}..
df40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
df50: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
df60: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
df70: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
df80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
df90: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
dfa0: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
dfb0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
dfc0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
dfd0: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
dfe0: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
dff0: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
e000: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
e010: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
e020: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
e030: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
e040: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e050: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
e060: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
e070: 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c  arse, .  WhereCl
e080: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
e090: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
e0a0: 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
e0b0: 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
e0c0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
e0d0: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  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 20 2a 70 49 64 78  constraint *pIdx
e100: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
e110: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
e120: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
e130: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
e140: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
e150: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
e160: 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
e170: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
e180: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
e190: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
e1a0: 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45  dxInfo;..  WHERE
e1b0: 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74  TRACE(("Recomput
e1c0: 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66  ing index info f
e1d0: 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72  or %s...\n", pSr
e1e0: 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  c->pTab->zName))
e1f0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
e210: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
e220: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
e230: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
e240: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
e250: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
e260: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
e270: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
e280: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
e290: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
e2a0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
e2b0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
e2c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
e2d0: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
e2e0: 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
e2f0: 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
e300: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
e310: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e320: 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
e330: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
e340: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
e350: 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
e360: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e370: 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
e380: 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
e390: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
e3a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
e3b0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e3c0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
e3d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
e3e0: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
e3f0: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
e400: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
e410: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
e420: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
e430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e440: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
e450: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
e460: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
e470: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e480: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
e490: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
e4a0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
e4b0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
e4c0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
e4d0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
e4e0: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
e4f0: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
e500: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
e510: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72  }.    if( i==pOr
e520: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
e530: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
e540: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
e550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e560: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
e570: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e580: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
e590: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
e5a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e5b0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
e5c0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
e5f0: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
e600: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
e610: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
e640: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
e650: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
e660: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
e670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e680: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
e690: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a  memory");.    /*
e6a0: 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61   (double)0 In ca
e6b0: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
e6c0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
e6d0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ... */.    retur
e6e0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
e6f0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
e700: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
e710: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e720: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
e730: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
e740: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
e750: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
e760: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
e770: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
e780: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
e790: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
e7a0: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
e7b0: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
e7c0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
e7d0: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
e7e0: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
e7f0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
e800: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
e810: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
e820: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
e830: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
e840: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
e850: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
e860: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
e870: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
e880: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
e890: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
e8a0: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
e8b0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
e8c0: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
e8d0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
e8e0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
e8f0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
e900: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
e910: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
e920: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
e930: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
e940: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
e950: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
e960: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
e970: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
e980: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
e990: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
e9a0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
e9b0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
e9c0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
e9d0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
ea20: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
ea30: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
ea40: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
ea50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
ea60: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ea70: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
ea80: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
ea90: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
eaa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65  ->eOperator&(pTe
eab0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29  rm->eOperator-1)
eac0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )==0 );.    test
ead0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
eae0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b  erator==WO_IN );
eaf0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
eb00: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
eb10: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
eb20: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
eb30: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
eb40: 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
eb50: 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43  tinue;.    pIdxC
eb60: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
eb70: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
eb80: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
eb90: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
eba0: 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43  t = i;.    pIdxC
ebb0: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29  ons[j].op = (u8)
ebc0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ebd0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
ebe0: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
ebf0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
ec00: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
ec10: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
ec20: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
ec30: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ec40: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
ec50: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
ec60: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
ec70: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
ec80: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
ec90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
eca0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
ecb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
ecc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
ecd0: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
ece0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
ecf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
ed00: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
ed10: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
ed20: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ed30: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
ed40: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
ed50: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
ed60: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
ed70: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ed80: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
ed90: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
eda0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
edb0: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
edc0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
edd0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
ede0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
edf0: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
ee00: 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b  TCH) );.    j++;
ee10: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
ee20: 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
ee30: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
ee40: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
ee50: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  i].pExpr;.    pI
ee60: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
ee70: 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
ee80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f  olumn;.    pIdxO
ee90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
eea0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
eeb0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
eec0: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
eed0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
eee0: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
eef0: 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
ef00: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
ef10: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
ef20: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
ef30: 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
ef40: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
ef50: 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
ef60: 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
ef70: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
ef80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
ef90: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
efa0: 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74  index_info point
efb0: 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  er passed.** as 
efc0: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  the argument..**
efd0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
efe0: 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
eff0: 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
f000: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
f010: 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
f020: 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
f030: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
f040: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
f050: 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
f060: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
f070: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f080: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
f090: 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
f0a0: 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
f0b0: 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
f0c0: 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
f0d0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
f0e0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
f0f0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f100: 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
f110: 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
f120: 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
f130: 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
f140: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
f150: 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
f160: 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
f170: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
f180: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
f190: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
f1a0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
f1b0: 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 3b 0a   = pTab->pVtab;.
f1c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
f1d0: 63 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  c;..  (void)sqli
f1e0: 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61  te3SafetyOff(pPa
f1f0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52  rse->db);.  WHER
f200: 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
f210: 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
f220: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
f230: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
f240: 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
f250: 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
f260: 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
f270: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
f280: 54 50 55 54 53 28 70 29 3b 0a 20 20 28 76 6f 69  TPUTS(p);.  (voi
f290: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
f2a0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 0a  n(pParse->db);..
f2b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f2c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
f2d0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
f2e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
f2f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
f300: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
f310: 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
f320: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
f330: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f340: 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
f350: 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
f360: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f370: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f380: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
f390: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
f3a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f3b0: 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
f3c0: 2d 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  ->db, pVtab->zEr
f3d0: 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
f3e0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
f3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f400: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
f410: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
f420: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
f430: 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
f440: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
f450: 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
f460: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f470: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
f480: 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
f490: 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
f4a0: 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
f4b0: 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
f4c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
f4d0: 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
f4e0: 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nErr;.}.../*.** 
f4f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
f500: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
f510: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
f520: 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
f530: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
f540: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
f550: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
f560: 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
f570: 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
f580: 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
f590: 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
f5a0: 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
f5b0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f5c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
f5d0: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
f5e0: 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
f5f0: 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
f600: 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
f610: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
f620: 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
f630: 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
f640: 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
f650: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
f660: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f670: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
f680: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
f690: 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
f6a0: 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
f6b0: 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
f6c0: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
f6d0: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
f6e0: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
f6f0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f700: 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
f710: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
f720: 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
f730: 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
f740: 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
f750: 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
f760: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
f770: 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
f780: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f790: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
f7a0: 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
f7b0: 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
f7c0: 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
f7d0: 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75  c void bestVirtu
f7e0: 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
f7f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f810: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
f820: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
f830: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
f840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
f850: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
f860: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f870: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
f880: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
f890: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
f8a0: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
f8b0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
f8c0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
f8d0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
f8e0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
f8f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f900: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
f910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
f920: 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
f930: 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
f940: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
f950: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
f960: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20   query plan */. 
f970: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f980: 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
f990: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
f9a0: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
f9b0: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
f9c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f9d0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
f9e0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f9f0: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
fa00: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fa10: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
fa20: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
fa30: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fa40: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
fa50: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
fa60: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
fa70: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
fa80: 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   nOrderBy;..  /*
fa90: 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61   Make sure wsFla
faa0: 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  gs is initialize
fab0: 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76  d to some sane v
fac0: 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
fad0: 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61   if the .  ** ma
fae0: 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65  lloc in allocate
faf0: 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c  IndexInfo() fail
fb00: 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
fb10: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76  ion returns leav
fb20: 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73  ing.  ** wsFlags
fb30: 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   in an uninitial
fb40: 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20  ized state, the 
fb50: 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76  caller may behav
fb60: 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e  e unpredictably.
fb70: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  .  */.  memset(p
fb80: 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
fb90: 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73  *pCost));.  pCos
fba0: 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
fbb0: 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
fbc0: 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ABLE;..  /* If t
fbd0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
fbe0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
fbf0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
fc00: 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
fc10: 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
fc20: 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c  alized, then all
fc30: 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
fc40: 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  lize it now..  *
fc50: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a  /.  pIdxInfo = *
fc60: 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28  ppIdxInfo;.  if(
fc70: 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
fc80: 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
fc90: 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
fca0: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
fcb0: 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
fcc0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   pOrderBy);.  }.
fcd0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
fce0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
fcf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
fd00: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
fd10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
fd20: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
fd30: 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
fd40: 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
fd50: 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
fd60: 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
fd70: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
fd80: 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
fd90: 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
fda0: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
fdb0: 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
fdc0: 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
fdd0: 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
fde0: 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
fdf0: 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
fe00: 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
fe10: 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
fe20: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
fe30: 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
fe40: 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
fe50: 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20  . Also, by this 
fe60: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74  point there must
fe70: 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74  .  ** be a point
fe80: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
fe90: 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
fea0: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20   Otherwise.  ** 
feb0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
fec0: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c  lumnNames() woul
fed0: 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70  d have picked up
fee0: 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a   the error. .  *
fef0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
ff00: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26  ->azModuleArg &&
ff10: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
ff20: 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72  rg[0] );.  asser
ff30: 74 28 20 70 54 61 62 2d 3e 70 56 74 61 62 20 29  t( pTab->pVtab )
ff40: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
ff50: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
ff60: 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20  able fields and 
ff70: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a  initialize all .
ff80: 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69    ** output vari
ff90: 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20  ables to zero.. 
ffa0: 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72   **.  ** aConstr
ffb0: 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73  aint[].usable is
ffc0: 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72   true for constr
ffd0: 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20  aints where the 
ffe0: 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20  right-hand.  ** 
fff0: 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  side contains on
10000 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ly references to
10010 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
10020 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  eft of the curre
10030 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  nt.  ** table.  
10040 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
10050 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
10060 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
10070 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
10080 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
10090 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  xpr.  **.  ** an
100a0 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  d we are evaluat
100b0 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  ing a join, then
100c0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
100d0 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20  on column is .  
100e0 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66  ** only valid if
100f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65   all tables refe
10100 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f  renced in expr o
10110 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74  ccur to the left
10120 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
10130 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
10140 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lumn..  **.  ** 
10150 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
10160 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
10170 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
10180 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
10190 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
101a0 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
101b0 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
101c0 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
101d0 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  ce.  ** even tho
101e0 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
101f0 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
10200 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
10210 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72   times..  ** For
10220 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74   each attempt at
10230 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65   picking an inde
10240 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  x, the order of 
10250 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
10260 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65  ** join might be
10270 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65   different so we
10280 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75   have to recompu
10290 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  te the usable fl
102a0 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d  ag.  ** each tim
102b0 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  e..  */.  pIdxCo
102c0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
102d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
102e0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
102f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
10300 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
10310 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
10320 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d  tUsage;.  for(i=
10330 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
10340 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
10350 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
10360 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
10370 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
10380 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
10390 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  [j];.    pIdxCon
103a0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54  s->usable =  (pT
103b0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
103c0 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
103d0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  ?1:0;.  }.  mems
103e0 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
103f0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
10400 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
10410 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49  raint);.  if( pI
10420 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
10430 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
10440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
10450 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
10460 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e    }.  pIdxInfo->
10470 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
10480 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
10490 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
104a0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
104b0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
104c0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
104d0 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f  d = 0;.  /* ((do
104e0 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20  uble)2) In case 
104f0 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
10500 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
10510 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   */.  pIdxInfo->
10520 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
10530 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
10540 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20   ((double)2);.  
10550 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 49  nOrderBy = pIdxI
10560 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20  nfo->nOrderBy;. 
10570 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 29   if( !pOrderBy )
10580 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
10590 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
105a0 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73  }..  if( vtabBes
105b0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
105c0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29  Tab, pIdxInfo) )
105d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
105e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74  }..  /* The cost
105f0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
10600 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
10610 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
10620 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61   (the.  ** inita
10630 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73  l value of lowes
10640 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f  tCost in this lo
10650 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68  op. If it is, th
10660 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73  en the.  ** (cos
10670 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
10680 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
10690 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a  ver be true..  *
106a0 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f  * .  ** Use "(do
106b0 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20  uble)2" instead 
106c0 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65  of "2.0" in case
106d0 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50   OMIT_FLOATING_P
106e0 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65  OINT .  ** is de
106f0 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  fined..  */.  if
10700 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ( (SQLITE_BIG_DB
10710 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 70  L/((double)2))<p
10720 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
10730 65 64 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43  edCost ){.    pC
10740 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51  ost->rCost = (SQ
10750 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
10760 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c  ouble)2));.  }el
10770 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72  se{.    pCost->r
10780 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Cost = pIdxInfo-
10790 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
107a0 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61    }.  pCost->pla
107b0 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
107c0 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
107d0 49 64 78 49 6e 66 6f 20 26 26 20 70 49 64 78 49  IdxInfo && pIdxI
107e0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
107f0 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73  umed ){.    pCos
10800 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
10810 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
10820 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
10830 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  lan.nEq = 0;.  p
10840 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
10850 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20  y = nOrderBy;.. 
10860 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
10870 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
10880 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
10890 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  by using multipl
108a0 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74  e indexes.  ** t
108b0 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52  o optimize an OR
108c0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
108d0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
108e0 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73  use. .  */.  bes
108f0 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
10900 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
10910 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
10920 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a  erBy, pCost);.}.
10930 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10940 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10950 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  LE */../*.** Fin
10960 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  d the query plan
10970 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61   for accessing a
10980 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
10990 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  e.  Write the.**
109a0 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
109b0 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e   and its cost in
109c0 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74  to the WhereCost
109d0 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64   object supplied
109e0 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20   as the.** last 
109f0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
10a00 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
10a10 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65   plan wins.  The
10a20 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
10a30 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
10a40 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
10a50 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74   disk I/O need t
10a60 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65  o process the re
10a70 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20  quest using the 
10a80 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a  selected plan..*
10a90 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69  * Factors that i
10aa0 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e  nfluence cost in
10ab0 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
10ac0 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  *  The estimated
10ad0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
10ae0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
10af0 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a  rieved.  (The.**
10b00 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65         fewer the
10b10 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20   better.).**.** 
10b20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
10b30 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73   not sorting mus
10b40 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20  t occur..**.**  
10b50 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
10b60 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62  not there must b
10b70 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75  e separate looku
10b80 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ps in the.**    
10b90 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20     index and in 
10ba0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
10bb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77  **.** If there w
10bc0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
10bd0 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70   clause (pSrc->p
10be0 49 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20  Index) attached 
10bf0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a  to the table in.
10c00 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
10c10 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  ment, then this 
10c20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f  function only co
10c30 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73  nsiders plans us
10c40 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65  ing the .** name
10c50 64 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73  d index. If no s
10c60 75 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  uch plan is foun
10c70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
10c80 72 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20  rned cost is.** 
10c90 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20  SQLITE_BIG_DBL. 
10ca0 49 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75  If a plan is fou
10cb0 6e 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65  nd that uses the
10cc0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a   named index, .*
10cd0 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20  * then the cost 
10ce0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e  is calculated in
10cf0 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a   the usual way..
10d00 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49  **.** If a NOT I
10d10 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70  NDEXED clause (p
10d20 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21  Src->notIndexed!
10d30 3d 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64  =0) was attached
10d40 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   to the table .*
10d50 2a 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  * in the SELECT 
10d60 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
10d70 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63  no indexes are c
10d80 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76  onsidered. Howev
10d90 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65  er, the .** sele
10da0 63 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74  cted plan may st
10db0 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ill take advanta
10dc0 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ge of the tables
10dd0 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a   built-in rowid.
10de0 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ** index..*/.sta
10df0 74 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72  tic void bestBtr
10e00 65 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  eeIndex(.  Parse
10e10 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10e30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10e40 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10e50 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
10e60 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
10e70 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
10e80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
10e90 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
10ea0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
10eb0 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
10ec0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
10ed0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
10ee0 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
10ef0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
10f00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10f10 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
10f20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
10f30 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
10f40 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
10f60 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
10f70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  lan */.){.  Wher
10f80 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
10f90 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
10fa0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
10fb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10fc0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
10fd0 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
10fe0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
10ff0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
11000 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
11010 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
11020 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
11030 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
11040 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  uating */.  int 
11050 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
11060 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11070 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
11080 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  se order */.  in
11090 74 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  t wsFlags;      
110a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
110b0 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
110c0 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69  th pProbe */.  i
110d0 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
110f0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
11100 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
11110 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
11120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11130 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   Mask of valid e
11140 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
11150 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
11160 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
11170 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
11180 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
11190 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
111a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
111b0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
111c0 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
111d0 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  t set */.  int i
111e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
111f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11200 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 57 48 45  ounter */..  WHE
11210 52 45 54 52 41 43 45 28 28 22 62 65 73 74 49 6e  RETRACE(("bestIn
11220 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52  dex: tbl=%s notR
11230 65 61 64 79 3d 25 6c 6c 78 5c 6e 22 2c 20 70 53  eady=%llx\n", pS
11240 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
11250 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 70 50  notReady));.  pP
11260 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  robe = pSrc->pTa
11270 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 69 66 28  b->pIndex;.  if(
11280 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
11290 64 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  d ){.    pProbe 
112a0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
112b0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
112c0 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  no indices and t
112d0 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d  here are no term
112e0 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20  s in the where. 
112f0 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20   ** clause that 
11300 72 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57  refer to the ROW
11310 49 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ID, then we will
11320 20 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74   never be able t
11330 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69  o do.  ** anythi
11340 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
11350 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
11360 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  on this table.  
11370 57 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a  We might as.  **
11380 20 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72   well put it fir
11390 73 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f  st in the join o
113a0 72 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c  rder.  That way,
113b0 20 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20   perhaps it can 
113c0 62 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  be.  ** referenc
113d0 65 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c  ed by other tabl
113e0 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a  es in the join..
113f0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43    */.  memset(pC
11400 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
11410 70 43 6f 73 74 29 29 3b 0a 20 20 69 66 28 20 70  pCost));.  if( p
11420 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20  Probe==0 &&.    
11430 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
11440 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
11450 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f  Q|WO_IN|WO_LT|WO
11460 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
11470 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70  0)==0 &&.     (p
11480 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73  OrderBy==0 || !s
11490 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69  ortableByRowid(i
114a0 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  Cur, pOrderBy, p
114b0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72  WC->pMaskSet, &r
114c0 65 76 29 29 20 29 7b 0a 20 20 20 20 20 69 66 28  ev)) ){.     if(
114d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
114e0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
114f0 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  rseOrder ){.    
11500 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c 69 63 61    /* For applica
11510 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 72 61  tion testing, ra
11520 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73 65 20 74  ndomly reverse t
11530 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
11540 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  for.      ** SEL
11550 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
11560 68 61 74 20 6f 6d 69 74 20 74 68 65 20 4f 52 44  hat omit the ORD
11570 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
11580 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 0a 20 20  his will help.  
11590 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 63      ** to find c
115a0 61 73 65 73 20 77 68 65 72 65 0a 20 20 20 20 20  ases where.     
115b0 20 2a 2f 0a 20 20 20 20 20 20 70 43 6f 73 74 2d   */.      pCost-
115c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
115d0 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
115e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
115f0 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 72  ;.  }.  pCost->r
11600 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
11610 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  G_DBL;..  /* Che
11620 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45  ck for a rowid=E
11630 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
11640 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
11650 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73 0a  s. If there was.
11660 20 20 2a 2a 20 61 6e 20 49 4e 44 45 58 45 44 20    ** an INDEXED 
11670 42 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68  BY clause attach
11680 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  ed to this table
11690 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
116a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 53  ..  */.  if( !pS
116b0 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
116c0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
116d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
116e0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
116f0 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
11700 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
11710 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
11720 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
11730 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
11740 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
11750 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
11760 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
11770 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  ){.        /* Ro
11780 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20  wid== is always 
11790 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20  the best pick.  
117a0 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e  Look no further.
117b0 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20    Because only. 
117c0 20 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67         ** a sing
117d0 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61  le row is genera
117e0 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61  ted, output is a
117f0 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20  lways in sorted 
11800 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
11810 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
11820 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
11830 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e  ID_EQ | WHERE_UN
11840 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 70 43  IQUE;.        pC
11850 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
11860 31 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  1;.        WHERE
11870 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74  TRACE(("... best
11880 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a   is rowid\n"));.
11890 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72          pCost->r
118a0 43 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cost = 0;.      
118b0 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20    pCost->nRow = 
118c0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
118d0 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  n;.      }else i
118e0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
118f0 72 74 79 28 28 70 45 78 70 72 20 3d 20 70 54 65  rty((pExpr = pTe
11900 72 6d 2d 3e 70 45 78 70 72 29 2c 20 45 50 5f 78  rm->pExpr), EP_x
11910 49 73 53 65 6c 65 63 74 29 20 0a 20 20 20 20 20  IsSelect) .     
11920 20 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72          && pExpr
11930 2d 3e 78 2e 70 4c 69 73 74 20 0a 20 20 20 20 20  ->x.pList .     
11940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
11950 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20  owid IN (LIST): 
11960 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
11970 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
11980 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20  ber of list.    
11990 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
119a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 6f    */.        pCo
119b0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 70 43 6f 73  st->rCost = pCos
119c0 74 2d 3e 6e 52 6f 77 20 3d 20 70 45 78 70 72 2d  t->nRow = pExpr-
119d0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
119e0 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
119f0 72 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28  rCost *= estLog(
11a00 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29 3b 0a 20  pCost->rCost);. 
11a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11a20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
11a30 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69  (SELECT): cost i
11a40 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
11a50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
11a60 20 72 6f 77 73 0a 20 20 20 20 20 20 20 20 2a 2a   rows.        **
11a70 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
11a80 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
11a90 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
11aa0 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
11ab0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
11ac0 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20  value so make a 
11ad0 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20  wild guess. */. 
11ae0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52         pCost->nR
11af0 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  ow = 100;.      
11b00 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
11b10 20 32 30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   200;.      }.  
11b20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11b30 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f  "... rowid IN co
11b40 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 70 43 6f  st: %.9g\n", pCo
11b50 73 74 2d 3e 72 43 6f 73 74 29 29 3b 0a 20 20 20  st->rCost));.   
11b60 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 45 73 74   }.  .    /* Est
11b70 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  imate the cost o
11b80 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20  f a table scan. 
11b90 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   If we do not kn
11ba0 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20  ow how many.    
11bb0 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69  ** entries are i
11bc0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65  n the table, use
11bd0 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20   1 million as a 
11be0 67 75 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  guess..    */.  
11bf0 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20    cost = pProbe 
11c00 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  ? pProbe->aiRowE
11c10 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b  st[0] : 1000000;
11c20 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
11c30 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e  ("... table scan
11c40 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67   base cost: %.9g
11c50 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
11c60 20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45   wsFlags = WHERE
11c70 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20  _ROWID_RANGE;.  
11c80 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
11c90 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  r constraints on
11ca0 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69   a range of rowi
11cb0 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63  ds in a table sc
11cc0 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  an..    */.    p
11cd0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
11ce0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
11cf0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
11d00 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
11d10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
11d20 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
11d30 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
11d40 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
11d50 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
11d60 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  0) ){.        ws
11d70 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
11d80 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
11d90 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
11da0 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
11db0 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d<EXPR eliminate
11dc0 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20  s two-thirds of 
11dd0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rows */.      }.
11de0 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
11df0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
11e00 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
11e10 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20  T|WO_GE, 0) ){. 
11e20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11e30 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
11e40 54 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  T;.        cost 
11e50 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20  /= 3;  /* Guess 
11e60 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20  that rowid>EXPR 
11e70 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74  eliminates two-t
11e80 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f  hirds of rows */
11e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
11ea0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
11eb0 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64 75  rowid range redu
11ec0 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
11ed0 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
11ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 73   }else{.      ws
11ef0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
11f00 0a 20 20 20 20 6e 52 6f 77 20 3d 20 63 6f 73 74  .    nRow = cost
11f10 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
11f20 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f  he table scan do
11f30 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74  es not satisfy t
11f40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11f50 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 20  se, increase.   
11f60 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20   ** the cost by 
11f70 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74  NlogN to cover t
11f80 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f  he expense of so
11f90 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  rting. */.    if
11fa0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11fb0 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
11fc0 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
11fd0 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61  rderBy, pWC->pMa
11fe0 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a  skSet, &rev) ){.
11ff0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
12000 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
12010 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
12020 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
12030 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
12040 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
12050 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
12060 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12070 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  {.        cost +
12080 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
12090 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45  st);.        WHE
120a0 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f  RETRACE(("... so
120b0 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20  rting increases 
120c0 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
120d0 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
120e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
120f0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
12100 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
12110 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  eOrder ){.      
12120 2f 2a 20 46 6f 72 20 61 70 70 6c 69 63 61 74 69  /* For applicati
12130 6f 6e 20 74 65 73 74 69 6e 67 2c 20 72 61 6e 64  on testing, rand
12140 6f 6d 6c 79 20 72 65 76 65 72 73 65 20 74 68 65  omly reverse the
12150 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 66 6f   output order fo
12160 72 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  r.      ** SELEC
12170 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
12180 74 20 6f 6d 69 74 20 74 68 65 20 4f 52 44 45 52  t omit the ORDER
12190 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69   BY clause.  Thi
121a0 73 20 77 69 6c 6c 20 68 65 6c 70 0a 20 20 20 20  s will help.    
121b0 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 63 61 73    ** to find cas
121c0 65 73 20 77 68 65 72 65 0a 20 20 20 20 20 20 2a  es where.      *
121d0 2f 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  /.      wsFlags 
121e0 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
121f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12200 52 65 6d 65 6d 62 65 72 20 74 68 69 73 20 63 61  Remember this ca
12210 73 65 20 69 66 20 69 74 20 69 73 20 74 68 65 20  se if it is the 
12220 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
12230 20 20 20 69 66 28 20 63 6f 73 74 3c 70 43 6f 73     if( cost<pCos
12240 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  t->rCost ){.    
12250 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
12260 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f   cost;.      pCo
12270 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  st->nRow = nRow;
12280 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
12290 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77 73 46  an.wsFlags = wsF
122a0 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lags;.    }.  }.
122b0 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  .  bestOrClauseI
122c0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
122d0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
122e0 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
122f0 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  t);..  /* If the
12300 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20 74   pSrc table is t
12310 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
12320 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
12330 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20  en we may not.  
12340 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ** use an index 
12350 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e 55  to satisfy IS NU
12360 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
12370 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54  n that table.  T
12380 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61  his is.  ** beca
12390 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68  use columns migh
123a0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e  t end up being N
123b0 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65  ULL if the table
123c0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
123d0 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73  -.  ** a circums
123e0 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65 20  tance which the 
123f0 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c  index cannot hel
12400 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20  p us discover.  
12410 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20  Ticket #2177..  
12420 2a 2f 0a 20 20 69 66 28 20 28 70 53 72 63 2d 3e  */.  if( (pSrc->
12430 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
12440 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 65 71  FT)!=0 ){.    eq
12450 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
12460 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_IN;.  }else{
12470 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
12480 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
12490 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20  _ISNULL;.  }..  
124a0 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20  /* Look at each 
124b0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
124c0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
124d0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
124e0 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Src->pIndex;.  }
124f0 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b  .  for(; pProbe;
12500 20 70 50 72 6f 62 65 3d 28 70 53 72 63 2d 3e 70   pProbe=(pSrc->p
12510 49 6e 64 65 78 20 3f 20 30 20 3a 20 70 50 72 6f  Index ? 0 : pPro
12520 62 65 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  be->pNext)){.   
12530 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70   double inMultip
12540 6c 69 65 72 20 3d 20 31 3b 20 20 2f 2a 20 4e 75  lier = 1;  /* Nu
12550 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
12560 20 6c 6f 6f 6b 2d 75 70 73 20 6e 65 65 64 65 64   look-ups needed
12570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 4d 75   */.    int inMu
12580 6c 74 49 73 45 73 74 20 3d 20 30 3b 20 20 20 20  ltIsEst = 0;    
12590 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 4d    /* True if inM
125a0 75 6c 74 69 70 6c 69 65 72 20 69 73 20 61 6e 20  ultiplier is an 
125b0 65 73 74 69 6d 61 74 65 20 2a 2f 0a 0a 20 20 20  estimate */..   
125c0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
125d0 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
125e0 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
125f0 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
12600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
12610 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
12620 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
12630 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
12640 3d 45 58 50 52 20 6f 72 20 78 20 49 53 20 4e 55  =EXPR or x IS NU
12650 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
12660 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  r x IN (...) con
12670 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
12680 20 46 6f 72 20 61 20 74 65 72 6d 20 6f 66 20 74   For a term of t
12690 68 65 20 66 6f 72 6d 20 78 3d 45 58 50 52 20 6f  he form x=EXPR o
126a0 72 20 78 20 49 53 20 4e 55 4c 4c 20 77 65 20 6f  r x IS NULL we o
126b0 6e 6c 79 20 68 61 76 65 20 74 6f 20 64 6f 20 0a  nly have to do .
126c0 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
126d0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
126e0 42 75 74 20 66 6f 72 20 78 20 49 4e 20 28 2e 2e  But for x IN (..
126f0 2e 29 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  .) we have to do
12700 20 61 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72   a.    ** number
12710 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61 72 63   of binary searc
12720 68 65 64 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c  hed.    ** equal
12730 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
12740 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65  f entries on the
12750 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12760 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 20  perator..    ** 
12770 54 68 65 20 69 6e 4d 75 6c 74 69 70 6c 65 72 20  The inMultipler 
12780 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 72  variable with tr
12790 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
127a0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
127b0 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  ** binary search
127c0 65 73 20 6e 65 65 64 65 64 2e 0a 20 20 20 20 2a  es needed..    *
127d0 2f 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  /.    wsFlags = 
127e0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
127f0 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
12800 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
12810 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
12820 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
12830 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
12840 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
12850 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72   notReady, eqTer
12860 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  mMask, pProbe);.
12870 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
12880 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12890 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
128a0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
128b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
128c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
128d0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
128e0 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
128f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
12900 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
12910 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
12920 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
12930 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
12940 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
12950 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
12960 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20  iplier *= 25;.  
12970 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 49 73          inMultIs
12980 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Est = 1;.       
12990 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
129a0 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
129b0 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
129c0 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e  ier *= pExpr->x.
129d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31  pList->nExpr + 1
129e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
129f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
12a00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
12a10 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
12a20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
12a30 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
12a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12a50 20 20 20 20 6e 52 6f 77 20 3d 20 70 50 72 6f 62      nRow = pProb
12a60 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a  e->aiRowEst[i] *
12a70 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 3b 0a 20   inMultiplier;. 
12a80 20 20 20 2f 2a 20 49 66 20 69 6e 4d 75 6c 74 69     /* If inMulti
12a90 70 6c 69 65 72 20 69 73 20 61 6e 20 65 73 74 69  plier is an esti
12aa0 6d 61 74 65 20 61 6e 64 20 74 68 61 74 20 65 73  mate and that es
12ab0 74 69 6d 61 74 65 20 72 65 73 75 6c 74 73 20 69  timate results i
12ac0 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 6e 52 6f 77  n an.    ** nRow
12ad0 20 69 74 20 74 68 61 74 20 69 73 20 6d 6f 72 65   it that is more
12ae0 20 74 68 61 6e 20 68 61 6c 66 20 6e 75 6d 62 65   than half numbe
12af0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12b00 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74   table,.    ** t
12b10 68 65 6e 20 72 65 64 75 63 65 20 69 6e 4d 75 6c  hen reduce inMul
12b20 74 69 70 6c 65 72 20 2a 2f 0a 20 20 20 20 69 66  tipler */.    if
12b30 28 20 69 6e 4d 75 6c 74 49 73 45 73 74 20 26 26  ( inMultIsEst &&
12b40 20 6e 52 6f 77 2a 32 20 3e 20 70 50 72 6f 62 65   nRow*2 > pProbe
12b50 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b  ->aiRowEst[0] ){
12b60 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 70 50  .      nRow = pP
12b70 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30  robe->aiRowEst[0
12b80 5d 2f 32 3b 0a 20 20 20 20 20 20 69 6e 4d 75 6c  ]/2;.      inMul
12b90 74 69 70 6c 69 65 72 20 3d 20 6e 52 6f 77 2f 70  tiplier = nRow/p
12ba0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
12bb0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f  i];.    }.    co
12bc0 73 74 20 3d 20 6e 52 6f 77 20 2b 20 69 6e 4d 75  st = nRow + inMu
12bd0 6c 74 69 70 6c 69 65 72 2a 65 73 74 4c 6f 67 28  ltiplier*estLog(
12be0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
12bf0 5b 30 5d 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20  [0]);.    nEq = 
12c00 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  i;.    if( pProb
12c10 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
12c20 6f 6e 65 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f  one && nEq==pPro
12c30 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
12c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
12c50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
12c60 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20  OLUMN_IN );.    
12c70 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
12c80 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
12c90 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  MN_NULL );.     
12ca0 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
12cb0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
12cc0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
12cd0 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  LL))==0 ){.     
12ce0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
12cf0 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
12d00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57 48    }.    }.    WH
12d10 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
12d20 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d  . nEq=%d inMult=
12d30 25 2e 39 67 20 6e 52 6f 77 3d 25 2e 39 67 20 63  %.9g nRow=%.9g c
12d40 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 0a 20 20 20  ost=%.9g\n",.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 71               nEq
12d60 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20  , inMultiplier, 
12d70 6e 52 6f 77 2c 20 63 6f 73 74 29 29 3b 0a 0a 20  nRow, cost));.. 
12d80 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
12d90 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
12da0 2e 20 20 41 73 73 75 6d 65 20 74 68 61 74 20 65  .  Assume that e
12db0 61 63 68 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ach range constr
12dc0 61 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  aint.    ** make
12dd0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
12de0 63 65 20 31 2f 33 72 64 20 73 6d 61 6c 6c 65 72  ce 1/3rd smaller
12df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12e00 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
12e10 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  lumn ){.      in
12e20 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
12e30 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
12e40 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
12e50 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
12e60 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
12e70 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
12e80 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  _GE, pProbe);.  
12e90 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
12ea0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
12eb0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
12ec0 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
12ed0 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
12ee0 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
12ef0 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
12f00 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
12f10 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
12f20 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
12f30 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
12f40 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
12f50 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
12f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12f70 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
12f80 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
12f90 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
12fa0 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
12fb0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
12fc0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
12fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
12fe0 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   /= 3;.         
12ff0 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20   nRow /= 3;.    
13000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
13010 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
13020 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  . range reduces 
13030 6e 52 6f 77 20 74 6f 20 25 2e 39 67 20 61 6e 64  nRow to %.9g and
13040 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
13050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13060 20 20 20 20 20 20 6e 52 6f 77 2c 20 63 6f 73 74        nRow, cost
13070 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
13080 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
13090 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73  e additional cos
130a0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20  t of sorting if 
130b0 74 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72  that is a factor
130c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
130d0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
130e0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
130f0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
13100 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
13110 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20  NULL))==0.      
13120 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49 6e 64   && isSortingInd
13130 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70  ex(pParse,pWC->p
13140 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69  MaskSet,pProbe,i
13150 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71  Cur,pOrderBy,nEq
13160 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29 7b 0a  ,&rev).      ){.
13170 20 20 20 20 20 20 20 20 69 66 28 20 77 73 46 6c          if( wsFl
13180 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ags==0 ){.      
13190 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 57 48      wsFlags = WH
131a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
131b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
131c0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
131d0 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
131e0 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
131f0 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
13200 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
13210 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
13220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13230 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
13240 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
13250 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
13260 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72  E(("...... order
13270 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  by increases cos
13280 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
13290 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
132a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
132b0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
132c0 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
132d0 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  der ){.      /* 
132e0 46 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  For application 
132f0 74 65 73 74 69 6e 67 2c 20 72 61 6e 64 6f 6d 6c  testing, randoml
13300 79 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 75  y reverse the ou
13310 74 70 75 74 20 6f 72 64 65 72 20 66 6f 72 0a 20  tput order for. 
13320 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73       ** SELECT s
13330 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 6f  tatements that o
13340 6d 69 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  mit the ORDER BY
13350 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 77   clause.  This w
13360 69 6c 6c 20 68 65 6c 70 0a 20 20 20 20 20 20 2a  ill help.      *
13370 2a 20 74 6f 20 66 69 6e 64 20 63 61 73 65 73 20  * to find cases 
13380 77 68 65 72 65 0a 20 20 20 20 20 20 2a 2f 0a 20  where.      */. 
13390 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
133a0 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
133b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
133c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
133d0 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74  can get away wit
133e0 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  h using just the
133f0 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20   index without. 
13400 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69     ** ever readi
13410 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  ng the table.  I
13420 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
13430 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74  se, then halve t
13440 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
13450 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
13460 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46    */.    if( wsF
13470 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f  lags && pSrc->co
13480 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
13490 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
134a0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
134b0 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
134c0 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
134d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
134e0 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j<pProbe->nColum
134f0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
13500 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d   int x = pProbe-
13510 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
13520 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
13530 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
13540 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
13550 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
13560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13570 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
13580 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
13590 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
135a0 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32         cost /= 2
135b0 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
135c0 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64  RACE(("...... id
135d0 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63  x-only reduces c
135e0 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
135f0 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
13600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13610 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20   this index has 
13620 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77  achieved the low
13630 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c  est cost so far,
13640 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20   then use it..  
13650 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46    */.    if( wsF
13660 6c 61 67 73 21 3d 30 20 26 26 20 63 6f 73 74 20  lags!=0 && cost 
13670 3c 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  < pCost->rCost )
13680 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  {.      pCost->r
13690 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
136a0 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d     pCost->nRow =
136b0 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f   nRow;.      pCo
136c0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
136d0 20 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20   = wsFlags;.    
136e0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45    pCost->plan.nE
136f0 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 61  q = nEq;.      a
13700 73 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c  ssert( pCost->pl
13710 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
13720 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
13730 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
13740 75 2e 70 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  u.pIdx = pProbe;
13750 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13760 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74   Report the best
13770 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 70   result.  */.  p
13780 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
13790 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b  gs |= eqTermMask
137a0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
137b0 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25  "best index is %
137c0 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 6e 72  s, cost=%.9g, nr
137d0 6f 77 3d 25 2e 39 67 2c 20 77 73 46 6c 61 67 73  ow=%.9g, wsFlags
137e0 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a  =%x, nEq=%d\n",.
137f0 20 20 20 20 20 20 20 20 28 70 43 6f 73 74 2d 3e          (pCost->
13800 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
13810 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
13820 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
13830 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
13840 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f  dx->zName : "(no
13850 6e 65 29 22 2c 20 70 43 6f 73 74 2d 3e 6e 52 6f  ne)", pCost->nRo
13860 77 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  w,.        pCost
13870 2d 3e 72 43 6f 73 74 2c 20 70 43 6f 73 74 2d 3e  ->rCost, pCost->
13880 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 43  plan.wsFlags, pC
13890 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 29 29 3b  ost->plan.nEq));
138a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
138b0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f  he query plan fo
138c0 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c  r accessing tabl
138d0 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72  e pSrc->pTab. Wr
138e0 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  ite the.** best 
138f0 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69  query plan and i
13900 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65  ts cost into the
13910 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63   WhereCost objec
13920 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61  t supplied .** a
13930 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d  s the last param
13940 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  eter. This funct
13950 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74  ion may calculat
13960 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a  e the cost of.**
13970 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76   both real and v
13980 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61  irtual table sca
13990 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
139a0 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20  id bestIndex(.  
139b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
139d0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
139e0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
139f0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
13a00 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
13a10 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
13a20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
13a30 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
13a40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
13a50 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
13a60 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
13a70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
13a80 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
13a90 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
13aa0 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
13ab0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
13ac0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
13ad0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
13ae0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
13af0 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
13b00 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
13b10 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20  ery plan */.){. 
13b20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13b30 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  Src->pTab) ){.  
13b40 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
13b50 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20  info *p = 0;.   
13b60 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
13b70 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
13b80 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  Src, notReady, p
13b90 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 20  OrderBy, pCost, 
13ba0 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  &p);.    if( p->
13bb0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
13bc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13bd0 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72  3_free(p->idxStr
13be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
13bf0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
13c00 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c  e->db, p);.  }el
13c10 73 65 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65  se{.    bestBtre
13c20 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
13c30 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
13c40 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  dy, pOrderBy, pC
13c50 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ost);.  }.}../*.
13c60 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
13c70 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
13c80 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
13c90 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
13ca0 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
13cb0 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
13cc0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
13cd0 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
13ce0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
13cf0 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
13d00 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
13d10 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
13d20 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
13d30 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
13d40 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
13d50 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
13d60 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
13d70 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
13d80 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
13d90 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
13da0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
13db0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
13dc0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
13dd0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
13de0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13df0 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
13e00 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
13e10 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
13e20 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
13e30 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
13e40 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
13e50 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
13e60 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
13e70 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
13e80 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
13e90 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
13ea0 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
13eb0 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
13ec0 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
13ed0 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
13ee0 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
13ef0 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
13f00 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
13f10 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
13f20 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
13f30 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
13f40 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
13f50 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
13f60 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
13f70 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
13f80 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
13f90 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
13fa0 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
13fb0 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
13fc0 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
13fd0 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
13fe0 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
13ff0 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
14000 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
14010 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
14020 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
14030 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
14040 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
14050 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
14060 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
14070 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
14080 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
14090 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
140a0 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
140b0 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
140c0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
140d0 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
140e0 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
140f0 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
14100 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
14110 26 26 20 41 4c 57 41 59 53 28 28 70 54 65 72 6d  && ALWAYS((pTerm
14120 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14130 5f 43 4f 44 45 44 29 3d 3d 30 29 0a 20 20 20 20  _CODED)==0).    
14140 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
14150 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
14160 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
14170 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
14180 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20  romJoin)).  ){. 
14190 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
141a0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
141b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
141c0 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
141d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
141e0 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
141f0 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
14200 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
14210 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
14220 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
14230 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14240 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
14250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14260 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  }.}../*.** Apply
14270 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
14280 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14290 74 68 65 20 66 69 72 73 74 20 6e 20 63 6f 6c 75  the first n colu
142a0 6d 6e 73 20 6f 66 20 69 6e 64 65 78 0a 2a 2a 20  mns of index.** 
142b0 70 49 64 78 20 74 6f 20 74 68 65 20 76 61 6c 75  pIdx to the valu
142c0 65 73 20 69 6e 20 74 68 65 20 6e 20 72 65 67 69  es in the n regi
142d0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
142e0 74 20 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  t base..*/.stati
142f0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
14300 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
14310 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
14320 2c 20 69 6e 74 20 6e 2c 20 49 6e 64 65 78 20 2a  , int n, Index *
14330 70 49 64 78 29 7b 0a 20 20 69 66 28 20 6e 3e 30  pIdx){.  if( n>0
14340 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
14350 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14360 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
14370 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
14380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14390 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
143a0 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
143b0 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
143c0 28 76 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 73  (v, pIdx);.    s
143d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
143e0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
143f0 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
14400 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
14410 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
14420 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
14430 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
14440 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
14450 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
14460 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
14470 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
14480 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
14490 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
144a0 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
144b0 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
144c0 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
144d0 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
144e0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
144f0 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
14500 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
14510 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
14520 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
14530 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
14540 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
14550 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
14560 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
14570 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
14580 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
14590 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
145a0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
145b0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
145c0 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
145d0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
145e0 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
145f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14600 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
14610 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
14620 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
14630 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
14640 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14650 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
14660 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
14670 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20  pLevel, /* When 
14680 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
14690 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
146a0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
146b0 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
146c0 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
146d0 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
146e0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
146f0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
14700 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
14710 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
14720 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
14730 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
14740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
14750 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
14760 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
14770 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
14780 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
14790 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
147a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
147b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
147c0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
147d0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
147e0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
147f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
14800 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
14810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14820 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
14830 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
14840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14850 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
14860 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
14870 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
14880 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
14890 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  n;..    assert( 
148a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
148b0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
148c0 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
148d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
148e0 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
148f0 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
14900 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
14910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14920 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
14930 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62  Tab, 0);.    Vdb
14940 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 2e  eComment((v, "%.
14950 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c  *s", pX->span.n,
14960 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20   pX->span.z));. 
14970 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
14980 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
14990 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
149a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
149b0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
149c0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
149d0 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
149e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
149f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
14a00 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
14a10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
14a20 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
14a30 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
14a40 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
14a50 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
14a60 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
14a90 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
14aa0 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
14ab0 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
14ac0 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
14ad0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
14ae0 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
14af0 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
14b00 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
14b10 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
14b20 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
14b30 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
14b40 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
14b50 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
14b60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14b70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
14b80 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
14b90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14ba0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
14bb0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
14bc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
14bd0 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
14be0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
14bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14c00 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
14c10 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
14c20 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
14c30 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
14c40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14c50 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
14c60 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
14c70 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
14c80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14c90 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
14ca0 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
14cb0 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
14cc0 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
14cd0 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  ex.  The values 
14ce0 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
14cf0 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20  nts are left on 
14d00 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
14d10 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
14d20 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
14d30 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
14d40 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
14d50 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
14d60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
14d70 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
14d80 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
14d90 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
14da0 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
14db0 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
14dc0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
14dd0 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
14de0 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
14df0 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
14e00 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
14e10 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
14e20 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
14e30 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
14e40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14e50 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
14e60 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
14e70 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
14e80 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
14e90 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
14ea0 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f  nd b will be sto
14eb0 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63  red.** in consec
14ec0 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20  utive registers 
14ed0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  and the index of
14ee0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
14ef0 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
14f00 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
14f10 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d  ample above nEq=
14f20 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75  =2.  But this su
14f30 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66  broutine works f
14f40 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20  or any value.** 
14f50 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67  of nEq including
14f60 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20   0.  If nEq==0, 
14f70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14f80 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a  nearly a no-op..
14f90 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
14fa0 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c  g it does is all
14fb0 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c  ocate the pLevel
14fc0 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65  ->iMem memory ce
14fd0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ll..**.** This r
14fe0 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c  outine always al
14ff0 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74  locates at least
15000 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   one memory cell
15010 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
15020 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
15030 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54  t memory cell. T
15040 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15050 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15060 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15070 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
15080 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e  store the termin
15090 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c  ation.** key val
150a0 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
150b0 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
150c0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
150d0 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
150e0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
150f0 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
15100 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
15110 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
15120 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  ** use..*/.stati
15130 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
15140 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
15150 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15160 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15170 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
15180 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
15190 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
151a0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
151b0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
151c0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
151d0 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
151e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
151f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
15200 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
15210 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
15220 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
15230 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
15240 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20 20 20  nt nExtraReg    
15250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15260 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
15270 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
15280 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
15290 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
152a0 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ;   /* The numbe
152b0 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
152c0 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
152d0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
152e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
152f0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
15300 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15310 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
15320 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
15330 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
15340 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
15350 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
15360 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
15370 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
15380 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
15390 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
153a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
153b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
153c0 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
153d0 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
153e0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
153f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15400 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15410 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15430 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
15440 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
15470 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
15480 63 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  cate */..  /* Th
15490 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
154a0 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
154b0 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
154c0 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
154d0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
154e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
154f0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
15500 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
15510 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
15520 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
15530 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
15540 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
15550 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
15560 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
15570 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
15580 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
15590 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
155a0 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
155b0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
155c0 3d 20 6e 52 65 67 3b 0a 0a 20 20 2f 2a 20 45 76  = nReg;..  /* Ev
155d0 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
155e0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
155f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15600 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45  Idx->nColumn>=nE
15610 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  q );.  for(j=0; 
15620 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
15630 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74   int r1;.    int
15640 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
15650 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72  umn[j];.    pTer
15660 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
15670 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
15680 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ady, pLevel->pla
15690 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29  n.wsFlags, pIdx)
156a0 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
156b0 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61  pTerm==0) ) brea
156c0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  k;.    assert( (
156d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
156e0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
156f0 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
15700 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
15710 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
15720 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  el, regBase+j);.
15730 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
15740 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69  ase+j ){.      i
15750 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
15760 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15770 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15780 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20  se, regBase);.  
15790 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
157a0 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r1;.      }else{
157b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
157c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
157d0 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42  _SCopy, r1, regB
157e0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  ase+j);.      }.
157f0 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
15800 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
15810 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
15820 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15830 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15840 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
15850 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
15860 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
15870 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20  NULL|WO_IN))==0 
15880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
158a0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
158b0 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  +j, pLevel->addr
158c0 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Brk);.    }.  }.
158d0 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
158e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
158f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
15900 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
15910 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
15920 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15930 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
15940 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
15950 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
15960 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
15970 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
15980 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
15990 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
159a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
159b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
159c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
159d0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
159e0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
159f0 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
15a00 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
15a10 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
15a20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
15a30 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
15a40 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
15a50 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
15a60 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
15a70 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
15a80 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
15a90 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
15aa0 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
15ab0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15ac0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
15ad0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
15ae0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
15af0 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
15b00 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
15b10 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
15b20 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
15b30 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
15b40 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
15b50 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
15b60 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
15b70 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
15b80 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
15b90 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
15ba0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
15bb0 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
15bc0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
15bd0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
15be0 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
15bf0 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
15c00 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
15c10 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
15c20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
15c30 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
15c40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
15c50 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
15c60 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
15c70 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
15c80 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
15c90 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15cc0 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15cf0 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
15d00 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
15d10 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
15d20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
15d30 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
15d40 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
15d50 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
15d60 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
15d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15d80 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
15d90 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
15da0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
15db0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
15dc0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
15dd0 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
15de0 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
15df0 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
15e00 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
15e10 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
15e20 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
15e30 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
15e40 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
15e50 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
15e60 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
15e70 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
15e80 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
15e90 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
15ea0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
15eb0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
15ec0 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
15ed0 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
15ee0 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
15ef0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
15f00 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
15f10 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
15f20 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
15f30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
15f40 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
15f50 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
15f60 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
15f70 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
15f80 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
15f90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
15fa0 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
15fb0 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
15fc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
15fd0 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a  RCE_TABLE)==0;..
15fe0 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
15ff0 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
16000 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
16010 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
16020 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
16030 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
16040 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
16050 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
16060 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
16070 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
16080 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
16090 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
160a0 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
160b0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
160c0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
160d0 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
160e0 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
160f0 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
16100 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
16110 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
16120 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
16130 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
16140 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
16150 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
16160 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
16170 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
16180 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
16190 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
161a0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
161b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
161c0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
161d0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
161e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
161f0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
16200 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
16210 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16220 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
16230 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
16240 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
16250 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
16260 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
16270 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
16280 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
16290 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
162a0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
162b0 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
162c0 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
162d0 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
162e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
162f0 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
16300 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
16310 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
16320 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
16330 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
16340 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
16350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16360 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
16370 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
16380 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
16390 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
163a0 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
163b0 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69  flag"));.  }..#i
163c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
163d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
163e0 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
163f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
16400 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
16410 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
16420 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
16430 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
16440 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
16450 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
16460 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16470 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
16480 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
16490 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
164a0 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
164b0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71  Filter */.    sq
164c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
164d0 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
164e0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
164f0 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43  bIdx;.    int nC
16500 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61  onstraint = pVta
16510 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  bIdx->nConstrain
16520 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  t;.    struct sq
16530 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
16540 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
16550 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
16590 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
165a0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  e;.    const str
165b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
165c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
165d0 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
16610 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
16620 74 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d 20 73  t;..    iReg = s
16630 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16640 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
16650 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66  traint+2);.    f
16660 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
16670 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
16680 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
16690 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
166a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
166b0 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
166c0 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
166d0 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
166e0 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
166f0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
16700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16710 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d  ode(pParse, pWC-
16720 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d  >a[iTerm].pExpr-
16730 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b  >pRight, iReg+j+
16740 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
16750 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16770 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   k==nConstraint 
16780 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
16790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
167a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
167b0 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  er, pVtabIdx->id
167c0 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
167d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
167e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
167f0 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a  , j-1, iReg+1);.
16800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16810 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
16820 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ter, iCur, addrB
16830 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49  rk, iReg, pVtabI
16840 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
16870 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50  ToFreeIdxStr ? P
16880 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
16890 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61  TATIC);.    pVta
168a0 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
168b0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
168c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
168d0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
168e0 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
168f0 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
16900 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
16910 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
16920 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
16930 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
16940 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54  evel, &pWC->a[iT
16950 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erm]);.      }. 
16960 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
16970 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
16980 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
16990 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
169a0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
169b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
169c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
169d0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
169e0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
169f0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 7d  nstraint+2);.  }
16a00 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
16a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16a20 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
16a30 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
16a40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
16a50 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f  OWID_EQ ){.    /
16a60 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
16a70 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
16a80 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
16a90 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
16aa0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
16ab0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
16ac0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
16ad0 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
16ae0 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
16af0 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
16b00 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
16b10 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
16b20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
16b30 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
16b40 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  /.    iReleaseRe
16b50 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
16b60 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16b70 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
16b80 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
16b90 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
16ba0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
16bb0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
16bc0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16bd0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
16be0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
16bf0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
16c00 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
16c10 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
16c20 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 52 6f 77  e==0 );.    iRow
16c30 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
16c40 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
16c50 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
16c60 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
16c70 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
16c80 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
16c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ca0 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
16cb0 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
16cc0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
16cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16ce0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
16cf0 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
16d00 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
16d10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
16d20 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
16d30 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
16d40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
16d50 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
16d60 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
16d70 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
16d80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
16d90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
16da0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
16db0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
16dc0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
16dd0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
16de0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
16df0 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
16e00 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
16e10 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
16e20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
16e30 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
16e40 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
16e50 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
16e60 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
16e70 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
16e80 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
16e90 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
16ea0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
16eb0 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
16ec0 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
16ed0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
16ee0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
16ef0 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
16f00 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
16f10 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
16f20 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
16f30 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
16f40 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
16f50 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
16f60 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
16f70 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
16f80 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
16f90 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
16fa0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
16fb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
16fc0 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
16fd0 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
16fe0 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
16ff0 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
17000 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
17010 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
17020 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
17030 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
17040 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
17050 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
17060 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
17070 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
17080 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
17090 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
170a0 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
170b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
170c0 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
170d0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
170e0 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
170f0 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
17100 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
17110 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
17120 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
17130 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
17140 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17150 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
17160 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
17170 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
17180 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
17190 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
171a0 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
171b0 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
171c0 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
171d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
171e0 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
171f0 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
17200 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
17210 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
17220 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
17230 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
17240 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
17250 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
17260 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ur );.      r1 =
17270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17280 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
17290 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
172a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
172b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
172c0 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
172d0 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
172e0 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
172f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
17300 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
17310 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
17320 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
17330 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
17340 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17350 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17360 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
17370 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
17380 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
17390 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
173a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
173b0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
173c0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
173d0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
173e0 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
173f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
17400 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
17410 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
17420 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
17430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17440 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
17450 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 6d  =iCur );.      m
17460 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
17470 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
17480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17490 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
174a0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
174b0 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
174c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
174d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
174e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
174f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
17500 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
17510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
17520 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
17530 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
17540 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
17550 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
17560 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
17570 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
17580 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17590 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
175a0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
175b0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
175c0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
175d0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
175e0 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
175f0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 28 70 53  pLevel->p5 = (pS
17600 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d  tart==0 && pEnd=
17610 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66  =0) ?1:0;.    if
17620 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
17630 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
17640 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
17650 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
17660 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17680 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
17690 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
176a0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
176b0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
176c0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
176d0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
176e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
176f0 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
17700 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
17710 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
17720 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
17730 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17740 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
17750 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
17760 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
17770 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
17780 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
17790 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
177a0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  MN_RANGE|WHERE_C
177b0 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20  OLUMN_EQ) ){.   
177c0 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63   /* Case 3: A sc
177d0 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  an using an inde
177e0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
177f0 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
17800 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
17810 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
17820 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
17830 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d   **         term
17840 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  s ("==" or "IN" 
17850 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20  operators) that 
17860 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20  refer to the N. 
17870 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
17880 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
17890 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74  of the index. It
178a0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
178b0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
178c0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
178d0 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e  traints (>, <, >
178e0 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20  = or <=) on the 
178f0 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20  indexed.    **  
17900 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68         column th
17910 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
17920 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75  ollows the N equ
17930 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20  alities. Only . 
17940 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
17950 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
17960 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
17970 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
17980 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  est must.    ** 
17990 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
179a0 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
179b0 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61  erators. For exa
179c0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
179d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64    **         ind
179e0 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29  ex is on (x,y,z)
179f0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
17a00 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65  wing clauses are
17a10 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20   all .    **    
17a20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
17a30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
17a40 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20           x=5.   
17a50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
17a60 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20  =5 AND y=10.    
17a70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
17a80 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
17a90 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
17aa0 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
17ab0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
17ac0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20      x=5 AND y=5 
17ad0 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a  AND z<=10.    **
17ae0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
17af0 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
17b00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
17b10 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
17b20 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  nly.    **      
17b30 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a     the x=5 term:
17b40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17b50 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
17b60 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20  D z<10.    **.  
17b70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
17b80 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
17b90 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
17ba0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
17bb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49      **         I
17bc0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
17bd0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
17be0 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73  aints, then N is
17bf0 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   at.    **      
17c00 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20     least one..  
17c10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
17c20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
17c30 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
17c40 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
17c50 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  RE clause.    **
17c60 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
17c70 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
17c80 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
17c90 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
17ca0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
17cb0 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
17cc0 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
17cd0 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
17ce0 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20  Y..    */  .    
17cf0 69 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d  int aStartOp[] =
17d00 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
17d10 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
17d20 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
17d30 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
17d40 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
17d50 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
17d60 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
17d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17d80 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
17d90 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
17da0 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
17db0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
17dc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
17dd0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
17de0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
17df0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
17e00 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
17e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
17e20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
17e30 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
17e40 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
17e50 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
17e60 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
17e70 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
17e80 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
17e90 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
17ea0 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
17eb0 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
17ec0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
17ed0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
17ee0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
17ef0 20 20 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d      int aEndOp[]
17f00 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
17f10 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
17f20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
17f30 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
17f40 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
17f50 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
17f60 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
17f70 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
17f80 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
17f90 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
17fa0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
17fb0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
17fc0 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
17fd0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a  evel->plan.nEq;.
17fe0 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
17ff0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
18000 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18010 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
18020 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
18030 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
18060 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
18070 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
18080 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
180a0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
180b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
180c0 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
180d0 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
180e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
180f0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
18100 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
18110 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
18120 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
18130 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
18140 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
18150 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
18160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18170 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
18180 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
18190 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
181a0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
181b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
181c0 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
181d0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
181e0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
181f0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
18200 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
18210 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
18220 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
18230 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
18240 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18250 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
18260 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
18270 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
18280 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
18290 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
182a0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
182b0 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  r;         /* Th
182c0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
182d0 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
182e0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
182f0 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
18300 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
18310 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
18320 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
18330 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
18340 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
18350 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ..    pIdx = pLe
18360 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
18370 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
18380 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
18390 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61  .    k = pIdx->a
183a0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20  iColumn[nEq];   
183b0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20    /* Column for 
183c0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
183d0 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f  raints */..    /
183e0 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
183f0 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
18400 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
18410 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
18420 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
18430 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
18440 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
18450 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
18460 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
18470 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
18480 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
18490 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
184a0 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
184b0 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
184c0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
184d0 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
184e0 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
184f0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
18500 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
18510 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
18520 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
18530 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
18540 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
18550 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
18560 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
18570 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
18580 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
18590 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
185a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
185b0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
185c0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
185d0 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c  .     && (pLevel
185e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
185f0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20  HERE_ORDERBY).  
18600 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f     && (pIdx->nCo
18610 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b  lumn>nEq).    ){
18620 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
18630 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
18640 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20  r==1 ); */.     
18650 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
18660 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
18670 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
18680 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29  >aiColumn[nEq] )
18690 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e  ; */.      isMin
186a0 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20  Query = 1;.     
186b0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
186c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
186d0 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74  nd any inequalit
186e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  y constraint ter
186f0 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  ms for the start
18700 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a   and end .    **
18710 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a   of the range. .
18720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18730 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
18740 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
18750 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
18760 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54  RangeEnd = findT
18770 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
18780 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
18790 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29  LT|WO_LE), pIdx)
187a0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
187b0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
187c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
187d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
187e0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
187f0 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
18800 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
18810 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
18820 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  dy, (WO_GT|WO_GE
18830 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
18840 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
18850 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
18860 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
18870 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
18880 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
18890 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
188a0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
188b0 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
188c0 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
188d0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
188e0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
188f0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
18900 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
18910 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
18920 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
18930 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
18940 64 79 2c 20 6e 45 78 74 72 61 52 65 67 29 3b 0a  dy, nExtraReg);.
18950 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
18960 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
18970 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
18980 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
18990 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
189a0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
189b0 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
189c0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
189d0 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
189e0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
189f0 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
18a00 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
18a10 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
18a20 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
18a30 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
18a40 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  ( bRev==(pIdx->a
18a50 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
18a60 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
18a70 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
18a80 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
18a90 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
18aa0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
18ab0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
18ac0 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
18ad0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
18ae0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
18af0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
18b00 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
18b10 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
18b20 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
18b30 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
18b40 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
18b50 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
18b60 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
18b70 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
18b80 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
18b90 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
18ba0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
18bb0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
18bc0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
18bd0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
18be0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
18bf0 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
18c00 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
18c10 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
18c20 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
18c30 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
18c40 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
18c50 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
18c60 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
18c70 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
18c80 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
18c90 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
18ca0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
18cb0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
18cc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18cd0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e  ode(pParse, pRan
18ce0 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
18cf0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
18d00 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nEq);.      sqli
18d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18d20 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
18d30 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
18d40 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
18d50 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  aint++;.    }els
18d60 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
18d70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18d80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18d90 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
18da0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
18db0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
18dc0 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
18dd0 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
18de0 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
18df0 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
18e00 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
18e10 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
18e20 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20  traint, pIdx);. 
18e30 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
18e40 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
18e50 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
18e60 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
18e70 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
18e80 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
18e90 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
18ea0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
18eb0 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
18ec0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
18ed0 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
18ee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18ef0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
18f00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
18f10 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
18f20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18f30 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
18f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f50 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  p4(v, op, iIdxCu
18f60 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
18f70 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ase, .          
18f80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18f90 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43  TE_INT_TO_PTR(nC
18fa0 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49  onstraint), P4_I
18fb0 4e 54 33 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  NT32);..    /* L
18fc0 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
18fd0 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
18fe0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
18ff0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
19000 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
19010 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
19020 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
19030 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
19040 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  eEnd ){.      sq
19050 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
19060 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
19070 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
19080 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19090 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65 45  (pParse, pRangeE
190a0 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
190b0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
190c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
190d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
190e0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
190f0 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
19100 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
19110 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
19120 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49  gBase, nEq+1, pI
19130 64 78 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  dx);.      nCons
19140 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  traint++;.    }.
19150 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
19160 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
19170 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
19180 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19190 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
191a0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
191b0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
191c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
191d0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
191e0 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28     op = aEndOp[(
191f0 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71  pRangeEnd || nEq
19200 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b  ) * (1 + bRev)];
19210 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
19220 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20  p==OP_Noop );.  
19230 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
19240 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
19250 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
19260 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66  _IdxLT );.    if
19270 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ( op!=OP_Noop ){
19280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19290 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
192a0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
192b0 2c 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20 20  , regBase,.     
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
192e0 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74  _PTR(nConstraint
192f0 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
19300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19310 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
19320 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
19330 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19340 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
19350 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
19360 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
19370 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
19380 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
19390 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
193a0 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
193b0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
193c0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
193d0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
193e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
193f0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
19400 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
19410 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
19430 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
19440 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
19450 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
19460 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
19470 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
19480 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
19490 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
194a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
194b0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
194c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
194d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
194e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
194f0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
19500 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20  r, nEq, r1);.   
19510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19520 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
19530 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29  l, r1, addrCont)
19540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19550 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19560 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
19570 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
19580 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
19590 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
195a0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
195b0 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
195c0 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
195d0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
195e0 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21  eEnd);.    if( !
195f0 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
19600 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
19610 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
19620 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19630 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
19640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19650 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
19660 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
19670 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
19680 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
19690 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
196a0 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
196b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
196c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
196d0 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
196e0 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
196f0 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a  d seek */.    }.
19700 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
19710 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
19720 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
19730 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
19740 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
19750 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
19760 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
19770 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
19780 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
19790 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
197a0 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
197b0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
197c0 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
197d0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
197e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
197f0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
19800 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
19810 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
19820 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
19830 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77    /* Case 4:  Tw
19840 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
19850 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
19860 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
19870 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
19880 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
19890 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
198a0 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
198b0 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
198c0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
198d0 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
198e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
198f0 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
19900 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
19910 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
19920 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
19930 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
19940 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
19950 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
19960 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
19970 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
19980 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
19990 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
199a0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
199b0 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
199c0 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
199d0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
199e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
199f0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
19a10 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
19a20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
19a30 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
19a40 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
19a50 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
19a60 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
19a70 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
19a80 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
19a90 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
19aa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19ab0 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
19ac0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
19ad0 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
19ae0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
19af0 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
19b00 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
19b10 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
19b20 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
19b30 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
19b40 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
19b50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
19b60 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
19b70 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
19b80 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
19b90 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
19ba0 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
19bb0 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
19bc0 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
19bd0 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
19be0 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
19bf0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
19c00 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
19c10 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
19c20 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
19c30 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
19c40 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
19c50 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
19c60 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
19c70 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
19c80 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
19c90 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
19ca0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
19cb0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
19cc0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
19cd0 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
19ce0 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
19cf0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
19d00 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
19d10 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
19d20 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
19d30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19d40 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
19d50 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
19d60 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
19d70 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
19d80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
19d90 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
19dc0 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
19dd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
19de0 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
19df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
19e00 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
19e10 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
19e20 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
19e30 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
19e40 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  rms */.    Where
19e50 54 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20 20 20  Term *pFinal;   
19e60 20 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62 74 65    /* Final subte
19e70 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f 52  rm within the OR
19e80 2d 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20  -clause. */.    
19e90 53 72 63 4c 69 73 74 20 6f 6e 65 54 61 62 3b 20  SrcList oneTab; 
19ea0 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65         /* Shorte
19eb0 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 2a  ned table list *
19ec0 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  /..    int regRe
19ed0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
19ee0 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
19ef0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65   /* Register use
19f00 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20  d with OP_Gosub 
19f10 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
19f20 77 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wset;           
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
19f50 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a   RowSet object *
19f60 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
19f70 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
19fa0 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  ing rowid */.   
19fb0 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d   int iLoopBody =
19fc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19fd0 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74  Label(v);  /* St
19fe0 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79  art of loop body
19ff0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74   */.    int iRet
1a000 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1a030 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a  regReturn init *
1a040 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
1a050 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c   .    pTerm = pL
1a060 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65  evel->plan.u.pTe
1a070 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rm;.    assert( 
1a080 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
1a090 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
1a0a0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20  Operator==WO_OR 
1a0b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1a0c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1a0d0 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
1a0e0 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
1a0f0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
1a100 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69 6e 61  o->wc;.    pFina
1a110 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  l = &pOrWc->a[pO
1a120 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 0a  rWc->nTerm-1];..
1a130 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
1a140 53 72 63 4c 69 73 74 20 63 6f 6e 74 61 69 6e 69  SrcList containi
1a150 6e 67 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  ng just the tabl
1a160 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  e being scanned 
1a170 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 2a 2f  by this loop. */
1a180 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53 72 63  .    oneTab.nSrc
1a190 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62   = 1;.    oneTab
1a1a0 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  .nAlloc = 1;.   
1a1b0 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d 20 2a   oneTab.a[0] = *
1a1c0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 2f  pTabItem;..    /
1a1d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1a1e0 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
1a1f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
1a200 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
1a210 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
1a220 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
1a230 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
1a240 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
1a250 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
1a260 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
1a270 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
1a280 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
1a290 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
1a2a0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
1a2b0 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
1a2c0 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
1a2d0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
1a2e0 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
1a2f0 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
1a300 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
1a310 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
1a320 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
1a330 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
1a340 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
1a350 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1a360 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
1a370 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
1a380 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
1a390 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
1a3a0 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
1a3b0 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
1a3c0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
1a3d0 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
1a3e0 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
1a3f0 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
1a400 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
1a410 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
1a420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1a430 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1a440 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1a450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
1a460 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1a470 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
1a480 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
1a490 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1a4a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a4b0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1a4c0 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1a4d0 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1a4e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a4f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1a500 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1a510 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1a520 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
1a530 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
1a540 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
1a550 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
1a560 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
1a570 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
1a580 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72  ==iCur || pOrTer
1a590 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1a5a0 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _AND ){.        
1a5b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
1a5c0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
1a5d0 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
1a5e0 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
1a5f0 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  /..        /* Lo
1a600 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
1a610 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
1a620 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
1a630 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
1a640 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
1a650 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1a660 65 2c 20 26 6f 6e 65 54 61 62 2c 20 70 4f 72 54  e, &oneTab, pOrT
1a670 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20  erm->pExpr, 0,. 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49         WHERE_OMI
1a6a0 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f  T_OPEN | WHERE_O
1a6b0 4d 49 54 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  MIT_CLOSE | WHER
1a6c0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3b 0a  E_FORCE_TABLE);.
1a6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1a6e0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
1a6f0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1a700 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1a710 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1a720 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1a730 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
1a740 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
1a750 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
1a760 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
1a770 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
1a780 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1a790 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
1a7a0 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
1a7b0 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1a7e0 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
1a7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a800 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
1a810 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
1a820 77 73 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  wset, .         
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a850 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
1a860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1a890 5f 50 54 52 28 69 53 65 74 29 2c 20 50 34 5f 49  _PTR(iSet), P4_I
1a8a0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20  NT32);.         
1a8b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
1a8c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a8d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
1a8e0 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
1a8f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
1a900 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
1a910 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
1a920 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
1a930 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
1a940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1a950 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
1a960 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
1a970 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a980 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a990 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
1a9a0 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
1a9b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
1a9c0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1a9d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a9e0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1a9f0 73 65 74 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  set); */.    sql
1aa00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aa10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
1aa20 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1aa30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1aa40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1aa50 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
1aa60 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1aa70 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
1aa80 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
1aa90 72 6e 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  rn;.    disableT
1aaa0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
1aab0 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
1aac0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1aad0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1aae0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
1aaf0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
1ab00 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
1ab10 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
1ab20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
1ab30 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
1ab40 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
1ab50 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
1ab60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1ab70 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
1ab80 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
1ab90 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1aba0 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
1abb0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
1abc0 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
1abd0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
1abe0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ev==1 );.    ass
1abf0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1ac00 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 );.    pLevel-
1ac10 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
1ac20 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
1ac30 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1ac40 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
1ac50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ac60 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
1ac70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1ac80 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
1ac90 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
1aca0 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
1acb0 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61  EP;.  }.  notRea
1acc0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
1acd0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
1ace0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
1acf0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1ad00 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1ad10 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1ad20 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1ad30 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1ad40 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1ad50 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1ad60 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  k = 0;.  for(pTe
1ad70 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
1ad80 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
1ad90 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
1ada0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
1adb0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1adc0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1add0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
1ade0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1adf0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1ae00 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
1ae10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1ae20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
1ae30 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
1ae40 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
1ae50 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
1ae60 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
1ae70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1ae80 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
1ae90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1aea0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1aeb0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1aec0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
1aed0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1aee0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
1aef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1af00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1af10 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1af20 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1af30 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1af40 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70      k = 1;.    p
1af50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
1af60 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
1af70 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
1af80 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
1af90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1afa0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
1afb0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
1afc0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
1afd0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
1afe0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
1aff0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
1b000 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
1b010 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
1b020 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
1b030 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
1b040 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b050 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b060 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b070 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
1b080 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1b090 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1b0a0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
1b0b0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
1b0c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b0d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1b0e0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
1b0f0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
1b100 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
1b110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1b120 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b130 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b140 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1b150 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1b160 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1b170 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
1b180 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1b190 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1b1a0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1b1b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b1c0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1b1d0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
1b1e0 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
1b1f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b200 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
1b210 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b220 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1b230 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
1b240 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
1b250 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1b260 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
1b270 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
1b280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1b290 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b2a0 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
1b2b0 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
1b2c0 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a  rn notReady;.}..
1b2d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b2e0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
1b2f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1b300 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
1b310 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
1b320 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
1b330 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
1b340 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
1b350 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1b360 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
1b370 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
1b380 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
1b390 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
1b3a0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1b3b0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1b3c0 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
1b3d0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
1b3e0 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
1b3f0 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
1b400 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
1b410 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
1b420 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b440 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
1b450 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
1b460 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
1b470 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  LITE_TEST */.../
1b480 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
1b490 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
1b4a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1b4b0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
1b4c0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
1b4d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1b4e0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
1b4f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1b500 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
1b510 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
1b520 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1b530 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
1b540 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
1b550 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
1b560 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
1b570 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e    /* assert( pIn
1b580 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1b590 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  xStr==0 || db->m
1b5a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a  allocFailed ); *
1b5b0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
1b5c0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1b5d0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  dxStr ){.       
1b5e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b5f0 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  pInfo->idxStr);.
1b600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b620 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
1b630 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
1b640 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
1b650 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
1b660 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b670 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
1b680 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1b690 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
1b6a0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
1b6b0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
1b6c0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
1b6d0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1b6e0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
1b6f0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
1b700 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
1b710 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
1b720 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
1b730 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1b740 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
1b750 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
1b760 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
1b770 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
1b780 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
1b790 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
1b7a0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
1b7b0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
1b7c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1b7d0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1b7e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1b7f0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
1b800 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
1b810 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
1b820 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
1b830 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
1b840 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
1b850 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
1b860 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1b870 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
1b880 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
1b890 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
1b8a0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
1b8b0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
1b8c0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
1b8d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b8e0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
1b8f0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
1b900 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
1b910 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1b920 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
1b930 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
1b940 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
1b950 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
1b960 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
1b970 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1b980 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
1b990 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
1b9a0 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
1b9b0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
1b9c0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
1b9d0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
1b9e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1b9f0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
1ba00 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
1ba10 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
1ba20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
1ba30 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
1ba60 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
1ba70 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
1ba80 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
1ba90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1baa0 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
1bad0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
1bae0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
1baf0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
1bb00 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
1bb10 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
1bb20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1bb30 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
1bb40 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
1bb50 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
1bb60 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
1bb70 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
1bb80 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
1bb90 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
1bba0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1bbb0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
1bbc0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
1bbd0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
1bbe0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
1bbf0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
1bc00 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
1bc10 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
1bc20 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
1bc30 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
1bc40 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bc50 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
1bc60 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
1bc70 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
1bc80 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
1bc90 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
1bca0 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
1bcb0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
1bcc0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
1bcd0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
1bce0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
1bcf0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
1bd00 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
1bd10 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
1bd20 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
1bd30 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
1bd40 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
1bd50 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
1bd60 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
1bd70 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1bd80 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
1bd90 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
1bda0 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
1bdb0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
1bdc0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
1bdd0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
1bde0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
1bdf0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
1be00 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
1be10 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
1be20 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
1be30 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
1be40 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
1be50 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1be60 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
1be70 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
1be80 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
1be90 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
1bea0 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
1beb0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
1bec0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
1bed0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
1bee0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
1bef0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
1bf00 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
1bf10 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
1bf20 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
1bf30 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
1bf40 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
1bf50 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
1bf60 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
1bf70 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
1bf80 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
1bf90 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
1bfa0 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
1bfb0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
1bfc0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
1bfd0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
1bfe0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
1bff0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
1c000 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1c010 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
1c020 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
1c030 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
1c040 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
1c050 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
1c060 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
1c070 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
1c080 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
1c090 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
1c0a0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
1c0b0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
1c0c0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
1c0d0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
1c0e0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
1c0f0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
1c100 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
1c110 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
1c120 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
1c130 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
1c140 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
1c150 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1c160 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
1c170 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
1c180 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
1c190 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
1c1a0 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
1c1b0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
1c1c0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
1c1d0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
1c1e0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
1c1f0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
1c200 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
1c210 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
1c220 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
1c230 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
1c240 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
1c250 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
1c260 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
1c270 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
1c280 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
1c290 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
1c2a0 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
1c2b0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
1c2c0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
1c2d0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
1c2e0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
1c2f0 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
1c300 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1c310 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1c320 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1c330 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
1c340 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1c350 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
1c360 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c370 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1c380 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1c390 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
1c3a0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
1c3b0 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
1c3c0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
1c3d0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
1c3e0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
1c3f0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
1c400 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
1c410 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
1c420 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
1c430 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c440 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
1c450 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
1c460 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
1c470 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
1c480 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
1c490 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
1c4a0 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
1c4b0 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
1c4c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
1c4d0 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
1c4e0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
1c4f0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1c500 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
1c510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1c520 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
1c530 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
1c540 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
1c550 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
1c560 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
1c570 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
1c580 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1c590 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
1c5a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
1c5b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1c5d0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1c5e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1c5f0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
1c600 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
1c610 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
1c620 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
1c630 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1c640 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1c650 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
1c660 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
1c670 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1c680 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
1c690 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
1c6a0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1c6b0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
1c6c0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
1c6d0 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Int.h */.){.  in
1c6e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1c6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c700 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1c710 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
1c720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
1c730 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
1c740 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
1c750 74 72 75 63 74 20 2a 2f 0a 20 20 57 68 65 72 65  truct */.  Where
1c760 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1c770 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
1c780 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
1c790 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
1c7a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
1c7b0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c7c0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
1c7d0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
1c7e0 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
1c7f0 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
1c800 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
1c810 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
1c820 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
1c830 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
1c840 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
1c850 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
1c860 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
1c870 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c890 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1c8a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1c8b0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1c8c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1c8d0 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67  Item;  /* A sing
1c8e0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54  le entry from pT
1c8f0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
1c900 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1c910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1c920 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
1c930 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74   the pWInfo list
1c940 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b   */.  int iFrom;
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
1c970 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
1c980 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
1c990 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
1c9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
1c9b0 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
1c9c0 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e  of all pWC->a[].
1c9d0 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  wtFlags */.  sql
1c9e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1c9f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1ca00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1ca10 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  /..  /* The numb
1ca20 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1ca30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ca40 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
1ca50 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
1ca60 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
1ca70 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk .  */.  if( p
1ca80 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
1ca90 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
1caa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cab0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
1cac0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
1cad0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
1cae0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c   0;.  }..  /* Al
1caf0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
1cb00 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
1cb10 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
1cb20 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
1cb30 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
1cb40 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
1cb50 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
1cb60 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
1cb70 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
1cb80 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
1cb90 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
1cba0 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
1cbb0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
1cbc0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
1cbd0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
1cbe0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
1cbf0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
1cc00 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
1cc10 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
1cc20 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
1cc30 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
1cc40 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
1cc50 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
1cc60 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
1cc70 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
1cc80 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
1cc90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
1cca0 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
1ccb0 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
1ccc0 29 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  )+(pTabList->nSr
1ccd0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  c-1)*sizeof(Wher
1cce0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
1ccf0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
1cd00 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
1cd10 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b      nByteWInfo +
1cd20 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57   .      sizeof(W
1cd30 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20  hereClause) +.  
1cd40 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
1cd50 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20  MaskSet).  );.  
1cd60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1cd70 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1cd80 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
1cd90 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
1cda0 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73  nLevel = pTabLis
1cdb0 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66  t->nSrc;.  pWInf
1cdc0 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
1cdd0 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
1cde0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
1cdf0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
1ce00 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
1ce10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ce20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
1ce30 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
1ce40 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
1ce50 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
1ce60 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
1ce70 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
1ce80 67 73 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  gs;.  pMaskSet =
1ce90 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
1cea0 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53  &pWC[1];..  /* S
1ceb0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
1cec0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
1ced0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
1cee0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
1cef0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
1cf00 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
1cf10 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
1cf20 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
1cf30 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
1cf40 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
1cf50 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
1cf60 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
1cf70 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
1cf80 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
1cf90 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
1cfa0 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
1cfb0 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
1cfc0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
1cfd0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
1cfe0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
1cff0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
1d000 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
1d010 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
1d020 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
1d030 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
1d040 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
1d050 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73  here && (pTabLis
1d060 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71  t->nSrc==0 || sq
1d070 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1d080 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
1d090 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
1d0a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1d0b0 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
1d0c0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
1d0d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1d0e0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
1d0f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
1d100 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
1d110 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
1d120 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
1d130 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
1d140 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
1d150 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
1d160 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
1d170 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
1d180 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
1d190 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
1d1a0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
1d1b0 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
1d1c0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
1d1d0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
1d1e0 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
1d1f0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
1d200 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
1d210 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
1d220 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
1d230 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1d240 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1d250 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
1d260 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
1d270 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1d280 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
1d290 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
1d2a0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
1d2b0 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
1d2c0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
1d2d0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
1d2e0 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
1d2f0 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
1d300 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
1d310 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
1d320 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
1d330 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
1d340 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
1d350 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
1d360 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
1d370 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
1d380 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2f 0a  ket #3015..  */.
1d390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1d3a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1d3b0 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
1d3c0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
1d3d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
1d3e0 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
1d3f0 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
1d400 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
1d410 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
1d420 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
1d430 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1d440 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
1d450 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
1d460 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
1d470 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
1d480 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
1d490 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
1d4a0 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
1d4b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1d4c0 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
1d4d0 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
1d4e0 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
1d4f0 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
1d500 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
1d510 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
1d520 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
1d530 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
1d540 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
1d550 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
1d560 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
1d570 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
1d580 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
1d590 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
1d5a0 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
1d5b0 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
1d5c0 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
1d5d0 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
1d5e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72  sed..  */.  expr
1d5f0 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c  AnalyzeAll(pTabL
1d600 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28  ist, pWC);.  if(
1d610 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1d620 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
1d630 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
1d640 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74   }..  /* Chose t
1d650 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f  he best index to
1d660 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61   use for each ta
1d670 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
1d680 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
1d690 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c  * This loop fill
1d6a0 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
1d6b0 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a  ng fields:.  **.
1d6c0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
1d6d0 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65  [].pIdx      The
1d6e0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
1d6f0 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20  r this level of 
1d700 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20  the loop..  **  
1d710 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46   pWInfo->a[].wsF
1d720 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78 78  lags   WHERE_xxx
1d730 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   flags associate
1d740 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a  d with pIdx.  **
1d750 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e     pWInfo->a[].n
1d760 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d  Eq       The num
1d770 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e  ber of == and IN
1d780 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
1d790 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
1d7a0 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20  iFrom     Which 
1d7b0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1d7c0 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67   clause is being
1d7d0 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57   coded.  **   pW
1d7e0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75  Info->a[].iTabCu
1d7f0 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
1d800 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
1d810 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20  base table.  ** 
1d820 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49    pWInfo->a[].iI
1d830 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45  dxCur   The VDBE
1d840 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d850 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49  index.  **   pWI
1d860 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20  nfo->a[].pTerm  
1d870 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d     When wsFlags=
1d880 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63  =WO_OR, the OR-c
1d890 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a  lause term.  **.
1d8a0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
1d8b0 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20  lso figures out 
1d8c0 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65  the nesting orde
1d8d0 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
1d8e0 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61  he FROM.  ** cla
1d8f0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  use..  */.  notR
1d900 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
1d910 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  )0;.  pTabItem =
1d920 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20   pTabList->a;.  
1d930 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
1d940 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d  >a;.  andFlags =
1d950 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43   ~0;.  WHERETRAC
1d960 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
1d970 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
1d980 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d  ;.  for(i=iFrom=
1d990 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
1d9a0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1d9b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
1d9c0 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  el++){.    Where
1d9d0 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20  Cost bestPlan;  
1d9e0 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65         /* Most e
1d9f0 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65  fficient plan se
1da00 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
1da10 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da30 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74  Index for FROM t
1da40 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d  able at pTabItem
1da50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20   */.    int j;  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1da80 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62  ng over FROM tab
1da90 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  les */.    int b
1daa0 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20  estJ = 0;       
1dab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
1dac0 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
1dad0 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1daf0 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
1db00 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
1db10 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b     int once = 0;
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db30 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73  * True when firs
1db40 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20  t table is seen 
1db50 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
1db60 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a  bestPlan, 0, siz
1db70 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a  eof(bestPlan));.
1db80 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f      bestPlan.rCo
1db90 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
1dba0 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  DBL;.    for(j=i
1dbb0 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26  From, pTabItem=&
1dbc0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
1dbd0 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
1dbe0 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
1dbf0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f  +){.      int do
1dc00 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f  NotReorder;    /
1dc10 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74  * True if this t
1dc20 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  able should not 
1dc30 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  be reordered */.
1dc40 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
1dc50 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f  sCost;     /* Co
1dc60 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  st information f
1dc70 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c  rom best[Virtual
1dc80 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20  ]Index() */.    
1dc90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1dca0 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20  erBy;  /* ORDER 
1dcb0 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e  BY clause for in
1dcc0 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  dex to optimize 
1dcd0 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52  */..      doNotR
1dce0 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49  eorder =  (pTabI
1dcf0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1dd00 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1dd10 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66  S))!=0;.      if
1dd20 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52  ( once && doNotR
1dd30 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
1dd40 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
1dd50 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
1dd60 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1dd70 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
1dd80 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
1dd90 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
1dda0 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
1ddb0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1ddc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ddd0 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30  OrderBy = ((i==0
1dde0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f   && ppOrderBy )?
1ddf0 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 0a  *ppOrderBy:0);..
1de00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1de10 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
1de20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1de30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1de40 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
1de50 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
1de60 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1de70 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1de80 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66  fo **pp = &pWInf
1de90 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
1dea0 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 56 69  ;.        bestVi
1deb0 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
1dec0 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d  e, pWC, pTabItem
1ded0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
1dee0 65 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70  erBy, &sCost, pp
1def0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  );.      }else .
1df00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1df10 20 20 20 20 20 20 20 62 65 73 74 42 74 72 65 65         bestBtree
1df20 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1df30 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74  C, pTabItem, not
1df40 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c  Ready, pOrderBy,
1df50 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20   &sCost);.      
1df60 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  }.      if( once
1df70 3d 3d 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f  ==0 || sCost.rCo
1df80 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  st<bestPlan.rCos
1df90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63  t ){.        onc
1dfa0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
1dfb0 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b  estPlan = sCost;
1dfc0 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d  .        bestJ =
1dfd0 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
1dfe0 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64    if( doNotReord
1dff0 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
1e000 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e  }.    assert( on
1e010 63 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ce );.    assert
1e020 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74  ( notReady & get
1e030 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
1e040 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
1e050 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ].iCursor) );.  
1e060 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
1e070 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c  ** Optimizer sel
1e080 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f  ects table %d fo
1e090 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
1e0a0 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
1e0b0 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
1e0c0 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
1e0d0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
1e0e0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
1e0f0 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)!=0 ){.      
1e100 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
1e110 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
1e120 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
1e130 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
1e140 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
1e150 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
1e160 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
1e170 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1e180 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1e190 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
1e1a0 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
1e1b0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
1e1c0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1e1d0 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
1e1e0 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
1e1f0 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  y &= ~getMask(pM
1e200 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1e210 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
1e220 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
1e230 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73  >iFrom = (u8)bes
1e240 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  tJ;..    /* Chec
1e250 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61  k that if the ta
1e260 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ble scanned by t
1e270 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  his loop iterati
1e280 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a  on had an.    **
1e290 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1e2a0 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  se attached to i
1e2b0 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65  t, that the name
1e2c0 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67  d index is being
1e2d0 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  .    ** used for
1e2e0 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f   the scan. If no
1e2f0 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f  t, then query co
1e300 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61  mpilation has fa
1e310 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74  iled..    ** Ret
1e320 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
1e330 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20    */.    pIdx = 
1e340 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
1e350 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  J].pIndex;.    i
1e360 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
1e370 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
1e380 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e390 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
1e3a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e3b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e3c0 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69  e, "cannot use i
1e3d0 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d  ndex: %s", pIdx-
1e3e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
1e3f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1e400 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c  Error;.      }el
1e410 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
1e420 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  f an INDEXED BY 
1e430 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20  clause is used, 
1e440 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  the bestIndex() 
1e450 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  function is.    
1e460 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
1e470 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  d to find the in
1e480 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e  dex specified in
1e490 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
1e4a0 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
1e4b0 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20  * if it find an 
1e4c0 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f  index at all. */
1e4d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e4e0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75   bestPlan.plan.u
1e4f0 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20  .pIdx==pIdx );. 
1e500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e510 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
1e520 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
1e530 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
1e540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1e550 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1e560 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1e570 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1e580 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
1e590 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
1e5a0 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
1e5b0 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
1e5c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
1e5d0 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
1e5e0 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
1e5f0 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
1e600 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
1e610 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
1e620 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79  {.    *ppOrderBy
1e630 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1e640 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
1e650 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
1e660 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
1e670 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
1e680 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
1e690 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
1e6a0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
1e6b0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
1e6c0 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
1e6d0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
1e6e0 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
1e6f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1e700 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
1e710 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1e720 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
1e730 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
1e740 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
1e750 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1e760 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
1e770 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
1e780 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
1e790 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1e7a0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1e7b0 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
1e7c0 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
1e7d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
1e7e0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
1e7f0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
1e800 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
1e810 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
1e820 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
1e830 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
1e840 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
1e850 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
1e860 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
1e870 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
1e880 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1e890 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1e8a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1e8b0 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
1e8c0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
1e8d0 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72  er Goto */.  for
1e8e0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
1e8f0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
1e900 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1e910 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
1e920 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
1e930 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
1e940 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
1e950 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e960 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
1e970 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
1e980 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  dex */..#ifndef 
1e990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1e9a0 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72  AIN.    if( pPar
1e9b0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
1e9c0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d  {.      char *zM
1e9d0 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  sg;.      struct
1e9e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e9f0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1ea00 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1ea10 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  m];.      zMsg =
1ea20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1ea30 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20  db, "TABLE %s", 
1ea40 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1ea50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1ea60 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1ea70 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1ea80 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1ea90 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a  g, "%s AS %s", z
1eaa0 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
1eab0 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
1eac0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
1ead0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1eae0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1eaf0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1eb00 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1eb10 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1eb20 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c   WITH INDEX %s",
1eb30 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67  .           zMsg
1eb40 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  , pLevel->plan.u
1eb50 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pIdx->zName);. 
1eb60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1eb70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1eb80 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
1eb90 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  I_OR ){.        
1eba0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1ebb0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1ebc0 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49   "%s VIA MULTI-I
1ebd0 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73  NDEX UNION", zMs
1ebe0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1ebf0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1ec00 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
1ec10 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
1ec20 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
1ec30 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1ec40 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1ec50 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
1ec60 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
1ec70 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1ec80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ec90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1eca0 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
1ecb0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1ecc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1ecd0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1ece0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ecf0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1ed00 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
1ed10 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
1ed20 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  x;.        zMsg 
1ed30 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1ed40 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1ed50 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
1ed60 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
1ed70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ed80 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
1ed90 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
1eda0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
1edb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1edc0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1edd0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1ede0 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
1edf0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1ee00 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1ee10 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42  Msg, "%s ORDER B
1ee20 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
1ee30 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ee40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ee50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
1ee60 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
1ee70 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
1ee80 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ee90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
1eea0 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
1eeb0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
1eec0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1eed0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
1eee0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
1eef0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1ef00 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
1ef10 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
1ef20 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
1ef30 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
1ef40 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
1ef50 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
1ef60 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
1ef70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1ef80 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1ef90 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
1efa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1efb0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1efc0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1efd0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
1efe0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1eff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f000 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f010 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
1f020 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1f030 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
1f040 74 20 63 68 61 72 2a 29 70 54 61 62 2d 3e 70 56  t char*)pTab->pV
1f050 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  tab, P4_VTAB);. 
1f060 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1f070 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
1f080 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1f090 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
1f0a0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1f0b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1f0c0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30  RE_OMIT_OPEN)==0
1f0d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
1f0e0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
1f0f0 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
1f100 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
1f110 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
1f120 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
1f130 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
1f140 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
1f150 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  op);.      if( !
1f160 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
1f170 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
1f180 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42  BMS ){.        B
1f190 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
1f1a0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
1f1b0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
1f1c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
1f1d0 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
1f1e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1f0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1f200 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1f210 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 53 51 4c  ntAddr(v)-1, SQL
1f220 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
1f230 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
1f240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
1f250 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
1f260 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1f270 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
1f280 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
1f290 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
1f2a0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
1f2b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
1f2c0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
1f2d0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1f2e0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
1f2f0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1f300 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1f310 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  !=0 ){.      Ind
1f320 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c  ex *pIx = pLevel
1f330 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
1f340 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
1f350 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
1f360 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
1f370 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74   pIx);.      int
1f380 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1f390 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1f3a0 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
1f3b0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
1f3c0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
1f3d0 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d  ssert( iIdxCur>=
1f3e0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f3f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f400 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
1f410 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
1f420 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1f440 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
1f450 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1f460 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1f470 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
1f480 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
1f490 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1f4a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1f4b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
1f4c0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
1f4d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1f4e0 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
1f4f0 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
1f500 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
1f510 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
1f520 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
1f530 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
1f540 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
1f550 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
1f560 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
1f570 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
1f580 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
1f590 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
1f5a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
1f5b0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
1f5c0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
1f5d0 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
1f5e0 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72  (pWInfo, i, wctr
1f5f0 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79  lFlags, notReady
1f600 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
1f610 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e 66  Continue = pWInf
1f620 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e 74  o->a[i].addrCont
1f630 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
1f640 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
1f650 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
1f660 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
1f670 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
1f680 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
1f690 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
1f6a0 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
1f6b0 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
1f6c0 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
1f6d0 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
1f6e0 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
1f6f0 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
1f700 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
1f710 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
1f720 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
1f730 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
1f740 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
1f750 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
1f760 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
1f770 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
1f780 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
1f790 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1f7a0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1f7b0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rc; i++){.    ch
1f7c0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
1f7d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
1f7e0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
1f7f0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
1f800 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1f810 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
1f820 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
1f830 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
1f840 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
1f850 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
1f860 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
1f870 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
1f880 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
1f890 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
1f8a0 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
1f8b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1f8c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1f8d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
1f8e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f8f0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
1f900 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
1f910 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
1f920 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
1f930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f940 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
1f950 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
1f960 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
1f970 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
1f980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f990 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1f9a0 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
1f9b0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
1f9c0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
1f9d0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1f9e0 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
1f9f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
1fa00 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1fa10 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
1fa20 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
1fa30 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1fa40 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1fa50 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
1fa60 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
1fa70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1fa80 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1fa90 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
1faa0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
1fab0 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
1fac0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
1fad0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1fae0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
1faf0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
1fb00 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65  e3Strlen30(pLeve
1fb10 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1fb20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
1fb30 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
1fb40 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
1fb50 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
1fb60 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1fb70 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1fb80 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
1fb90 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
1fba0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
1fbb0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
1fbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
1fbd0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
1fbe0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
1fbf0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1fc00 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
1fc10 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1fc20 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29  Plan], "{} ", 3)
1fc30 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
1fc40 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
1fc50 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
1fc60 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
1fc70 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
1fc80 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
1fc90 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1fca0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
1fcb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
1fcc0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
1fcd0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
1fce0 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
1fcf0 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
1fd00 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
1fd10 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
1fd20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
1fd30 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
1fd40 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
1fd50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
1fd60 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
1fd70 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
1fd80 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57    */.  return pW
1fd90 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
1fda0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
1fdb0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
1fdc0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72  ginError:.  wher
1fdd0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
1fde0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
1fdf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1fe00 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
1fe10 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
1fe20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
1fe30 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
1fe40 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
1fe50 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1fe60 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1fe70 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
1fe80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
1fe90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1fea0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1feb0 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
1fec0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1fed0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
1fee0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
1fef0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1ff00 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1ff10 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
1ff20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ff30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ff40 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
1ff50 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71   code..  */.  sq
1ff60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1ff70 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
1ff80 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
1ff90 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
1ffa0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
1ffb0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
1ffc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ffd0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
1ffe0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
1fff0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
20000 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
20010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20020 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65  eAddOp2(v, pLeve
20030 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
20040 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
20050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20060 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
20070 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a  vel->p5);.    }.
20080 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
20090 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
200a0 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
200b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
200c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
200d0 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
200e0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
200f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
20100 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
20110 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
20120 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
20130 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
20140 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
20150 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
20160 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
20170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20180 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
20190 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
201a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
201b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
201c0 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75  P_Next, pIn->iCu
201d0 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
201e0 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
201f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
20200 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
20210 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
20220 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20230 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  e(db, pLevel->u.
20240 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20  in.aInLoop);.   
20250 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
20260 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20270 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
20280 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
20290 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
202a0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
202b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
202c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
202d0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
202e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
202f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20300 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
20310 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
20320 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
20330 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
20340 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
20350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20360 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
20370 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
20380 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
20390 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
203a0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
203b0 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
203c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
203d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
203e0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
203f0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
20400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20420 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
20430 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
20440 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
20450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20460 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
20470 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
20480 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
20490 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
204a0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
204b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
204c0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
204d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
204e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
204f0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
20500 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
20510 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
20520 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
20530 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
20540 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
20550 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
20560 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
20570 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
20580 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
20590 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
205a0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
205b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
205c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
205d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
205e0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
205f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
20600 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
20610 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
20620 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
20630 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
20640 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
20650 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
20660 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
20670 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d  ERE_OMIT_CLOSE)=
20680 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20690 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
206a0 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  ss && (pLevel->p
206b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
206c0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
206d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
206e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
206f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
20700 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
20710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20720 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
20730 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
20740 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
20750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20760 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
20770 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
20780 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
20790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
207a0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
207b0 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
207c0 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
207d0 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
207e0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
207f0 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
20800 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
20810 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
20820 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
20830 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
20840 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
20850 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
20860 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
20870 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
20880 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
20890 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
208a0 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
208b0 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
208c0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
208d0 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
208e0 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
208f0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
20900 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
20910 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
20920 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
20930 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
20940 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
20950 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
20960 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
20970 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
20980 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
20990 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
209a0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
209b0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
209c0 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
209d0 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
209e0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
209f0 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
20a00 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
20a10 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
20a20 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
20a30 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
20a40 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
20a50 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
20a60 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
20a70 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
20a80 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
20a90 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
20aa0 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
20ab0 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
20ac0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
20ad0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
20ae0 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65  x;.      int use
20af0 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76  IndexOnly = pLev
20b00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
20b10 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
20b20 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  Y;..      assert
20b30 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
20b40 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
20b50 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
20b60 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
20b70 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
20b80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20b90 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
20ba0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
20bb0 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
20bc0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20bd0 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
20be0 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
20bf0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
20c00 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
20c10 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
20c20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
20c30 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
20c40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20c50 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
20c60 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
20c70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20c80 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
20c90 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
20ca0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
20cb0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
20cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
20cf0 73 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f  ssert(!useIndexO
20d00 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e  nly || j<pIdx->n
20d10 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
20d20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
20d30 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
20d50 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
20d60 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
20d70 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
20d80 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
20d90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20da0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
20db0 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e  NullRow && useIn
20dc0 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  dexOnly ){.     
20dd0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
20de0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
20df0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20e00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
20e10 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
20e20 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
20e30 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
20e40 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.