/ Hex Artifact Content
Login

Artifact cbf29fc2b8b8011500f11523ccaa2bd86f33d1ba:


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 34 30  : where.c,v 1.40
0340: 35 20 32 30 30 39 2f 30 36 2f 31 30 20 31 39 3a  5 2009/06/10 19:
0350: 33 33 3a 32 39 20 64 72 68 20 45 78 70 20 24 0a  33:29 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 42 69 74 6d 61  masks */.  Bitma
1610: 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20 20 20 20  sk vmask;       
1620: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 69      /* Bitmask i
1630: 64 65 6e 74 69 66 79 69 6e 67 20 76 69 72 74 75  dentifying virtu
1640: 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
1650: 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20 20 20   */.  u8 op;    
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1670: 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74 6f 72  * Split operator
1680: 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f  .  TK_AND or TK_
1690: 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  OR */.  int nTer
16a0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
16c0: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c  rms */.  int nSl
16d0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
16e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
16f0: 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f  ntries in a[] */
1700: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1720: 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65  ach a[] describe
1730: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
1740: 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a  WHERE cluase */.
1750: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1760: 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a  TE_SMALL_STACK).
1770: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
1780: 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[1];    /* In
1790: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
17a0: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
17b0: 6c 73 65 0a 20 20 57 68 65 72 65 54 65 72 6d 20  lse.  WhereTerm 
17c0: 61 53 74 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f  aStatic[8];    /
17d0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
17e0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
17f0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1800: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 77  ** A WhereTerm w
1810: 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  ith eOperator==W
1820: 4f 5f 4f 52 20 68 61 73 20 69 74 73 20 75 2e 70  O_OR has its u.p
1830: 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  OrInfo pointer s
1840: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
1850: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1860: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1880: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
1890: 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20  WhereOrInfo {.  
18a0: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
18b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
18c0: 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73  mposition into s
18d0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  ubterms */.  Bit
18e0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
18f0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1900: 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c   of all indexabl
1910: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1920: 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  clause */.};../*
1930: 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20  .** A WhereTerm 
1940: 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d  with eOperator==
1950: 57 4f 5f 41 4e 44 20 68 61 73 20 69 74 73 20 75  WO_AND has its u
1960: 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65  .pAndInfo pointe
1970: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
1980: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
1990: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
19a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
19b0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
19c0: 63 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  ct WhereAndInfo 
19d0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
19e0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
19f0: 54 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  The subexpressio
1a00: 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a  n broken out */.
1a10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
1a20: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1a30: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1a40: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
1a50: 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74  a mapping.** bet
1a60: 77 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72  ween VDBE cursor
1a70: 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74   numbers and bit
1a80: 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  s of the bitmask
1a90: 73 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a  s in WhereTerm..
1aa0: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63  **.** The VDBE c
1ab0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1ac0: 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73  e small integers
1ad0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a   contained in .*
1ae0: 2a 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69  * SrcList_item.i
1af0: 43 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e  Cursor and Expr.
1b00: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20  iTable fields.  
1b10: 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48  For any given WH
1b20: 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ERE .** clause, 
1b30: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1b40: 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67  rs might not beg
1b50: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74 68  in with 0 and th
1b60: 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74  ey might.** cont
1b70: 61 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20  ain gaps in the 
1b80: 6e 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e  numbering sequen
1b90: 63 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74  ce.  But we want
1ba0: 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d   to make maximum
1bb0: 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62  .** use of the b
1bc0: 69 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61  its in our bitma
1bd0: 73 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75 63  sks.  This struc
1be0: 74 75 72 65 20 70 72 6f 76 69 64 65 73 20 61 20  ture provides a 
1bf0: 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  mapping.** from 
1c00: 74 68 65 20 73 70 61 72 73 65 20 63 75 72 73 6f  the sparse curso
1c10: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63  r numbers into c
1c20: 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67  onsecutive integ
1c30: 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  ers beginning.**
1c40: 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49   with 0..**.** I
1c50: 66 20 57 68 65 72 65 4d 61 73 6b 53 65 74 2e 69  f WhereMaskSet.i
1c60: 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73  x[A]==B it means
1c70: 20 74 68 61 74 20 54 68 65 20 41 2d 74 68 20 62   that The A-th b
1c80: 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a  it of a Bitmask.
1c90: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56  ** corresponds V
1ca0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1cb0: 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62  r B.  The A-th b
1cc0: 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20  it of a bitmask 
1cd0: 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46  is 1<<A..**.** F
1ce0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1cf0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d00: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
1d10: 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75  these VDBE.** cu
1d20: 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c  rsors:  4, 5, 8,
1d30: 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68   29, 57, 73.  Th
1d40: 65 6e 20 74 68 65 20 20 57 68 65 72 65 4d 61 73  en the  WhereMas
1d50: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a  kSet structure.*
1d60: 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73  * would map thos
1d70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1d80: 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72   into bits 0 thr
1d90: 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ough 5..**.** No
1da0: 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70 70  te that the mapp
1db0: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
1dc0: 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20  sarily ordered. 
1dd0: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a   In the example.
1de0: 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61  ** above, the ma
1df0: 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c  pping might go l
1e00: 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c  ike this:  4->3,
1e10: 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d   5->1, 8->2, 29-
1e20: 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33  >0,.** 57->5, 73
1e30: 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20  ->4.  Or one of 
1e40: 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e  719 other combin
1e50: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20  ations might be 
1e60: 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73  used. It.** does
1e70: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74   not really matt
1e80: 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70  er.  What is imp
1e90: 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20 73  ortant is that s
1ea0: 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20  parse cursor.** 
1eb0: 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20  numbers all get 
1ec0: 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20  mapped into bit 
1ed0: 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65 67  numbers that beg
1ee0: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f  in with 0 and co
1ef0: 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73  ntain.** no gaps
1f00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
1f10: 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74  eMaskSet {.  int
1f20: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f40: 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64  mber of assigned
1f50: 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a   cursor values *
1f60: 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b  /.  int ix[BMS];
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69    /* Cursor assi
1f90: 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74  gned to each bit
1fa0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1fb0: 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
1fc0: 20 72 65 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75   records a looku
1fd0: 70 20 73 74 72 61 74 65 67 79 20 61 6e 64 20 74  p strategy and t
1fe0: 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20  he estimated.** 
1ff0: 63 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67  cost of pursuing
2000: 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2010: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
2020: 6f 73 74 20 7b 0a 20 20 57 68 65 72 65 50 6c 61  ost {.  WherePla
2030: 6e 20 70 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68  n plan;    /* Th
2040: 65 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  e lookup strateg
2050: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43  y */.  double rC
2060: 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65  ost;      /* Ove
2070: 72 61 6c 6c 20 63 6f 73 74 20 6f 66 20 70 75 72  rall cost of pur
2080: 73 75 69 6e 67 20 74 68 69 73 20 73 65 61 72 63  suing this searc
2090: 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
20a0: 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
20b0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
20c0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
20d0: 20 72 6f 77 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   rows */.};../*.
20e0: 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20  ** Bitmasks for 
20f0: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
2100: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61  at indices are a
2110: 62 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20  ble to exploit. 
2120: 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d   An.** OR-ed com
2130: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73  bination of thes
2140: 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20  e values can be 
2150: 75 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68  used when search
2160: 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73  ing for.** terms
2170: 20 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c   in the where cl
2180: 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ause..*/.#define
2190: 20 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31   WO_IN     0x001
21a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
21b0: 20 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65     0x002.#define
21c0: 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45   WO_LT     (WO_E
21d0: 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29  Q<<(TK_LT-TK_EQ)
21e0: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20  ).#define WO_LE 
21f0: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2200: 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LE-TK_EQ)).#defi
2210: 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f  ne WO_GT     (WO
2220: 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45  _EQ<<(TK_GT-TK_E
2230: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
2240: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
2250: 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GE-TK_EQ)).#de
2260: 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30  fine WO_MATCH  0
2270: 78 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x040.#define WO_
2280: 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65  ISNULL 0x080.#de
2290: 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30  fine WO_OR     0
22a0: 78 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x100       /* Tw
22b0: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
22c0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
22d0: 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20  #define WO_AND  
22e0: 20 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a    0x200       /*
22f0: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44   Two or more AND
2300: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
2310: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f   */..#define WO_
2320: 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20  ALL    0xfff    
2330: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
2340: 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20  l possible WO_* 
2350: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
2360: 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66  e WO_SINGLE 0x0f
2370: 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  f       /* Mask 
2380: 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f  of all non-compo
2390: 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  und WO_* values 
23a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20  */../*.** Value 
23b0: 66 6f 72 20 77 73 46 6c 61 67 73 20 72 65 74 75  for wsFlags retu
23c0: 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64 65  rned by bestInde
23d0: 78 28 29 20 61 6e 64 20 73 74 6f 72 65 64 20 69  x() and stored i
23e0: 6e 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65 6c 2e  n.** WhereLevel.
23f0: 77 73 46 6c 61 67 73 2e 20 20 54 68 65 73 65 20  wsFlags.  These 
2400: 66 6c 61 67 73 20 64 65 74 65 72 6d 69 6e 65 20  flags determine 
2410: 77 68 69 63 68 20 73 65 61 72 63 68 0a 2a 2a 20  which search.** 
2420: 73 74 72 61 74 65 67 69 65 73 20 61 72 65 20 61  strategies are a
2430: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a  ppropriate..**.*
2440: 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e  * The least sign
2450: 69 66 69 63 61 6e 74 20 31 32 20 62 69 74 73 20  ificant 12 bits 
2460: 69 73 20 72 65 73 65 72 76 65 64 20 61 73 20 61  is reserved as a
2470: 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61   mask for WO_ va
2480: 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54  lues above..** T
2490: 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  he WhereLevel.ws
24a0: 46 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 75  Flags field is u
24b0: 73 75 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f  sually set to WO
24c0: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e  _IN|WO_EQ|WO_ISN
24d0: 55 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ULL..** But if t
24e0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
24f0: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
2500: 20 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72   left join, Wher
2510: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 0a 2a  eLevel.wsFlags.*
2520: 2a 20 69 73 20 73 65 74 20 74 6f 20 57 4f 5f 49  * is set to WO_I
2530: 4e 7c 57 4f 5f 45 51 2e 20 20 54 68 65 20 57 68  N|WO_EQ.  The Wh
2540: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
2550: 20 66 69 65 6c 64 20 63 61 6e 20 74 68 65 6e 20   field can then 
2560: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 74 68  be used as.** th
2570: 65 20 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72  e "op" parameter
2580: 20 74 6f 20 66 69 6e 64 54 65 72 6d 20 77 68 65   to findTerm whe
2590: 6e 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  n we are resolvi
25a0: 6e 67 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ng equality cons
25b0: 74 72 61 69 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55  traints..** ISNU
25c0: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  LL constraints w
25d0: 69 6c 6c 20 74 68 65 6e 20 6e 6f 74 20 62 65 20  ill then not be 
25e0: 75 73 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  used on the righ
25f0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
2600: 74 0a 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69 63 6b  t.** join.  Tick
2610: 65 74 73 20 23 32 31 37 37 20 61 6e 64 20 23 32  ets #2177 and #2
2620: 31 38 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  189..*/.#define 
2630: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20  WHERE_ROWID_EQ  
2640: 20 20 20 30 78 30 30 30 30 31 30 30 30 20 20 2f     0x00001000  /
2650: 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  * rowid=EXPR or 
2660: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a  rowid IN (...) *
2670: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2680: 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 30 78 30  ROWID_RANGE  0x0
2690: 30 30 30 32 30 30 30 20 20 2f 2a 20 72 6f 77 69  0002000  /* rowi
26a0: 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f  d<EXPR and/or ro
26b0: 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66  wid>EXPR */.#def
26c0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
26d0: 5f 45 51 20 20 20 20 30 78 30 30 30 31 30 30 30  _EQ    0x0001000
26e0: 30 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20  0  /* x=EXPR or 
26f0: 78 20 49 4e 20 28 2e 2e 2e 29 20 6f 72 20 78 20  x IN (...) or x 
2700: 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69  IS NULL */.#defi
2710: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
2720: 52 41 4e 47 45 20 30 78 30 30 30 32 30 30 30 30  RANGE 0x00020000
2730: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
2740: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
2750: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
2760: 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34 30 30  N_IN    0x000400
2770: 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e  00  /* x IN (...
2780: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
2790: 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20  RE_COLUMN_NULL  
27a0: 30 78 30 30 30 38 30 30 30 30 20 20 2f 2a 20 78  0x00080000  /* x
27b0: 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66   IS NULL */.#def
27c0: 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ine WHERE_INDEXE
27d0: 44 20 20 20 20 20 20 30 78 30 30 30 66 30 30 30  D      0x000f000
27e0: 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 74  0  /* Anything t
27f0: 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2800: 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  x */.#define WHE
2810: 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20  RE_IN_ABLE      
2820: 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a 20 41  0x000f1000  /* A
2830: 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61  ble to support a
2840: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  n IN operator */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
2860: 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  OP_LIMIT    0x00
2870: 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45 58 50  100000  /* x<EXP
2880: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
2890: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
28a0: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
28b0: 49 54 20 20 20 20 30 78 30 30 32 30 30 30 30 30  IT    0x00200000
28c0: 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78    /* x>EXPR or x
28d0: 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  >=EXPR constrain
28e0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
28f0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20  RE_IDX_ONLY     
2900: 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20 55  0x00800000  /* U
2910: 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20  se index only - 
2920: 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64  omit table */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45  efine WHERE_ORDE
2940: 52 42 59 20 20 20 20 20 20 30 78 30 31 30 30 30  RBY      0x01000
2950: 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74 20 77  000  /* Output w
2960: 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63 6f  ill appear in co
2970: 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23  rrect order */.#
2980: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45 56  define WHERE_REV
2990: 45 52 53 45 20 20 20 20 20 20 30 78 30 32 30 30  ERSE      0x0200
29a0: 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20 69 6e  0000  /* Scan in
29b0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
29c0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29d0: 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78 30  UNIQUE       0x0
29e0: 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65 6c 65  4000000  /* Sele
29f0: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
2a00: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66   one row */.#def
2a10: 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41  ine WHERE_VIRTUA
2a20: 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30 30 30  LTABLE 0x0800000
2a30: 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74 75 61  0  /* Use virtua
2a40: 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73 73 69  l-table processi
2a50: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ng */.#define WH
2a60: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20  ERE_MULTI_OR    
2a70: 20 30 78 31 30 30 30 30 30 30 30 20 20 2f 2a 20   0x10000000  /* 
2a80: 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  OR using multipl
2a90: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 0a 2f 2a  e indices */../*
2aa0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2ab0: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2ac0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2ad0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2ae0: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2af0: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2b00: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2b10: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2b20: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2b30: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2b40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2b50: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2b60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2b70: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2b80: 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70 69  skSet   /* Mappi
2b90: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2ba0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2bb0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20  bitmasks */.){. 
2bc0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2bd0: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2be0: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2bf0: 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  t;.  pWC->nTerm 
2c00: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
2c10: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
2c20: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
2c30: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
2c40: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
2c50: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  sk = 0;.}../* Fo
2c60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2c70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2c80: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2c90: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
2ca0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2cb0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2cc0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2cd0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
2ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2cf0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
2d00: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2d10: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
2d20: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
2d30: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
2d40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2d50: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
2d60: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2d70: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2d80: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
2d90: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
2da0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
2db0: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
2dc0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
2dd0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
2de0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
2df0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
2e00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2e20: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
2e30: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
2e40: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2e50: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
2e60: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
2e70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2e80: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
2e90: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
2ea0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2eb0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
2ec0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
2ed0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
2ee0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
2ef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2f00: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
2f10: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
2f20: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
2f30: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
2f40: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
2f50: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
2f60: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
2f70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
2f80: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
2f90: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
2fa0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
2fb0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
2fc0: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
2fd0: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
2fe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ff0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
3000: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
3010: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
3020: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3030: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
3040: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
3050: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3070: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
3080: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3090: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
30a0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
30b0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
30c0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
30d0: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
30e0: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
30f0: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
3100: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
3110: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
3120: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
3130: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
3140: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
3150: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3160: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3170: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3180: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3190: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
31a0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
31b0: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
31c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
31d0: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
31e0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
31f0: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
3200: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
3210: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
3220: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
3230: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
3240: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
3250: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3260: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3270: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3280: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3290: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
32a0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
32b0: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
32c0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
32d0: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
32e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
32f0: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
3300: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3310: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
3320: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
3330: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
3340: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
3350: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3360: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3370: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3380: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3390: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
33a0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
33b0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
33c0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
33d0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
33e0: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
33f0: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
3400: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
3410: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
3420: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
3430: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
3440: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3460: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3470: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3480: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3490: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
34a0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
34b0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70  int idx;.  if( p
34c0: 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e  WC->nTerm>=pWC->
34d0: 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65  nSlot ){.    Whe
34e0: 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70  reTerm *pOld = p
34f0: 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74  WC->a;.    sqlit
3500: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
3510: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57  arse->db;.    pW
3520: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  C->a = sqlite3Db
3530: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3540: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3550: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
3560: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
3570: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
3580: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
3590: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20  NAMIC ){.       
35a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
35b0: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  te(db, p);.     
35c0: 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20   }.      pWC->a 
35d0: 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65  = pOld;.      re
35e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
35f0: 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c    memcpy(pWC->a,
3600: 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57   pOld, sizeof(pW
3610: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54  C->a[0])*pWC->nT
3620: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  erm);.    if( pO
3630: 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  ld!=pWC->aStatic
3640: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3650: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64  3DbFree(db, pOld
3660: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
3670: 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65  ->nSlot = sqlite
3680: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
3690: 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66  , pWC->a)/sizeof
36a0: 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d  (pWC->a[0]);.  }
36b0: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
36c0: 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54  >a[idx = pWC->nT
36d0: 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d  erm++];.  pTerm-
36e0: 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54  >pExpr = p;.  pT
36f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77  erm->wtFlags = w
3700: 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d  tFlags;.  pTerm-
3710: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
3720: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
3730: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
3740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3750: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
3760: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
3770: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
3780: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
3790: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
37a0: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
37b0: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
37c0: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
37d0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
37e0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
37f0: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
3800: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3810: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
3820: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
3830: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
3840: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
3850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
3860: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
3870: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
3880: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
3890: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
38a0: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
38b0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
38c0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
38d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
38e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
38f0: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
3900: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
3910: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
3920: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
3930: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
3940: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
3950: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
3960: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
3970: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
3980: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
3990: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
39a0: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
39b0: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
39c0: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
39d0: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
39e0: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
39f0: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
3a00: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
3a10: 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20  he slot[] array 
3a20: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
3a30: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
3a40: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
3a50: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
3a60: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3a70: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
3a80: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
3a90: 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  Expr, int op){. 
3aa0: 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f   pWC->op = (u8)o
3ab0: 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  p;.  if( pExpr==
3ac0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
3ad0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20  ( pExpr->op!=op 
3ae0: 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
3af0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45  seInsert(pWC, pE
3b00: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 0);.  }else
3b10: 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  {.    whereSplit
3b20: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65  (pWC, pExpr->pLe
3b30: 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65  ft, op);.    whe
3b40: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3b50: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b  pr->pRight, op);
3b60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
3b70: 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72  itialize an expr
3b80: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
3b90: 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  (a WhereMaskSet 
3ba0: 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69  object).*/.#defi
3bb0: 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50  ne initMaskSet(P
3bc0: 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20  )  memset(P, 0, 
3bd0: 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a  sizeof(*P))../*.
3be0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
3bf0: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
3c00: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
3c10: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
3c20: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
3c30: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
3c40: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
3c50: 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  getMask(WhereMas
3c60: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
3c70: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
3c80: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
3c90: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 73 69   pMaskSet->n<=si
3ca0: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
3cb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
3cc0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
3cd0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
3ce0: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
3cf0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
3d00: 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29  urn ((Bitmask)1)
3d10: 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  <<i;.    }.  }. 
3d20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3d30: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
3d40: 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72   mask for cursor
3d50: 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20   iCursor..**.** 
3d60: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72  There is one cur
3d70: 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e  sor per table in
3d80: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3d90: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
3da0: 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68  .** tables in th
3db0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
3dc0: 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65   limited by a te
3dd0: 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a  st early in the.
3de0: 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
3df0: 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20  egin() routine. 
3e00: 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   So we know that
3e10: 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69   the pMaskSet->i
3e20: 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c  x[].** array wil
3e30: 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77  l never overflow
3e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e50: 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72   createMask(Wher
3e60: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
3e70: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
3e80: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  {.  assert( pMas
3e90: 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53  kSet->n < ArrayS
3ea0: 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ize(pMaskSet->ix
3eb0: 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d  ) );.  pMaskSet-
3ec0: 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b  >ix[pMaskSet->n+
3ed0: 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a  +] = iCursor;.}.
3ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3ef0: 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72  ine walks (recur
3f00: 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65  sively) an expre
3f10: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67  ssion tree and g
3f20: 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69  enerates.** a bi
3f30: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
3f40: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   which tables ar
3f50: 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65  e used in that e
3f60: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
3f70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  e..**.** In orde
3f80: 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  r for this routi
3f90: 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20  ne to work, the 
3fa0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
3fb0: 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72   must have.** pr
3fc0: 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64  eviously invoked
3fd0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
3fe0: 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68  xprNames() on th
3ff0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53  e expression.  S
4000: 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ee.** the header
4010: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
4020: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
4030: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
4040: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ion..** The sqli
4050: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
4060: 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c  mes() routines l
4070: 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ooks for column 
4080: 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74  names and.** set
4090: 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20  s their opcodes 
40a0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
40b0: 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62   their Expr.iTab
40c0: 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20  le fields to.** 
40d0: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
40e0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61  number of the ta
40f0: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
4100: 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a  ne just has to.*
4110: 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20  * translate the 
4120: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
4130: 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  nto bitmask valu
4140: 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a  es and OR all.**
4150: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f   the bitmasks to
4160: 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  gether..*/.stati
4170: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
4180: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
4190: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72  reMaskSet*, Expr
41a0: 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  List*);.static B
41b0: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
41c0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
41d0: 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63  eMaskSet*, Selec
41e0: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
41f0: 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61  ask exprTableUsa
4200: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
4210: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
4220: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
4230: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
4240: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4250: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
4260: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
4270: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
4280: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
4290: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
42a0: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
42b0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
42c0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
42d0: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
42e0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
42f0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
4300: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
4310: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
4320: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
4330: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
4340: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
4350: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53  MaskSet, p->x.pS
4360: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  elect);.  }else{
4370: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4380: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4390: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
43a0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  List);.  }.  ret
43b0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
43c0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
43d0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
43e0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
43f0: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
4400: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
4410: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
4420: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
4430: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4440: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
4450: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
4460: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4470: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
4480: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
4490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
44a0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
44b0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
44c0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
44d0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
44e0: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
44f0: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
4500: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
4510: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73  e( pS ){.    mas
4520: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
4530: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4540: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
4550: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4560: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4570: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
4580: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
4590: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
45a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
45b0: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
45c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
45d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
45e0: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
45f0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4600: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4610: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
4620: 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d  g);.    pS = pS-
4630: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
4640: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
4650: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4660: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
4670: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
4680: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
4690: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
46a0: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
46b0: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
46c0: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
46d0: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
46e0: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
46f0: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61  ", "<=", ">=", a
4700: 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74  nd "IN"..*/.stat
4710: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
4720: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
4730: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
4740: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
4750: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
4760: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
4770: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4780: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
4790: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
47a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
47b0: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
47c0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
47d0: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
47e0: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
47f0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
4800: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
4810: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
4820: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
4830: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
4840: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
4850: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
4860: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
4870: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
4880: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
4890: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
48a0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
48b0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
48c0: 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74  *.** If a collat
48d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
48e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
48f0: 65 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20  either the left 
4900: 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65  or right.** side
4910: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4920: 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61  on, it remains a
4930: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4940: 68 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74  he same side aft
4950: 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74  er.** the commut
4960: 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c  ation. So "Y col
4970: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
4980: 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58  " becomes .** "X
4990: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
49a0: 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62  op Y". This is b
49b0: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
49c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
49d0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
49e0: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
49f0: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
4a00: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
4a10: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
4a20: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
4a30: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
4a40: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78  reason the EP_Ex
4a50: 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  pCollate flag.**
4a60: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
4a70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a80: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
4a90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
4aa0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
4ab0: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
4ac0: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
4ad0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
4ae0: 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74  );.  u16 expLeft
4af0: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
4b00: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
4b10: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65  Collate);.  asse
4b20: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45  rt( allowedOp(pE
4b30: 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70  xpr->op) && pExp
4b40: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op!=TK_IN );.
4b50: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d    pExpr->pRight-
4b60: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
4b70: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
4b80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
4b90: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  t);.  pExpr->pLe
4ba0: 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ft->pColl = sqli
4bb0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
4bc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
4bd0: 65 66 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c  eft);.  SWAP(Col
4be0: 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69  lSeq*,pExpr->pRi
4bf0: 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72  ght->pColl,pExpr
4c00: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b  ->pLeft->pColl);
4c10: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
4c20: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
4c30: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4c40: 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  & ~EP_ExpCollate
4c50: 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70  ) | expLeft;.  p
4c60: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
4c70: 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  gs = (pExpr->pLe
4c80: 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f  ft->flags & ~EP_
4c90: 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78  ExpCollate) | ex
4ca0: 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45  pRight;.  SWAP(E
4cb0: 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  xpr*,pExpr->pRig
4cc0: 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ht,pExpr->pLeft)
4cd0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
4ce0: 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p>=TK_GT ){.    
4cf0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
4d00: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_GT+2 );.    as
4d10: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
4d20: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  LE+2 );.    asse
4d30: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
4d40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
4d50: 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20  K_GT<TK_LE );.  
4d60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4d70: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
4d80: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
4d90: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
4da0: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
4db0: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
4dc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
4dd0: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
4de0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
4df0: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
4e00: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
4e10: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
4e20: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
4e30: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
4e40: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
4e50: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
4e60: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
4e70: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
4e80: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
4e90: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
4ea0: 20 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45     assert( (WO_E
4eb0: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c  Q<<(op-TK_EQ)) <
4ec0: 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63   0x7fff );.    c
4ed0: 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c   = (u16)(WO_EQ<<
4ee0: 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d  (op-TK_EQ));.  }
4ef0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
4f00: 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57  K_ISNULL || c==W
4f10: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73  O_ISNULL );.  as
4f20: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20  sert( op!=TK_IN 
4f30: 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  || c==WO_IN );. 
4f40: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4f50: 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29  EQ || c==WO_EQ )
4f60: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
4f70: 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LT || c==WO_L
4f80: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
4f90: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57  p!=TK_LE || c==W
4fa0: 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LE );.  assert
4fb0: 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63  ( op!=TK_GT || c
4fc0: 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73  ==WO_GT );.  ass
4fd0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c  ert( op!=TK_GE |
4fe0: 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20  | c==WO_GE );.  
4ff0: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
5000: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
5010: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
5020: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
5030: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
5040: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
5050: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
5060: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
5070: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
5080: 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  Cur and <op> is 
5090: 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f  one of.** the WO
50a0: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64  _xx operator cod
50b0: 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  es specified by 
50c0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
50d0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
50e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
50f0: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
5100: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
5110: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
5120: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
5130: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
5140: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
5150: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
5160: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
5170: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
5180: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
5190: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
51a0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
51b0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
51c0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
51d0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
51e0: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
51f0: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
5200: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
5210: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
5220: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5230: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
5240: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
5250: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
5260: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
5270: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
5280: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
5290: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
52a0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
52b0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
52c0: 74 20 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t k;.  assert( i
52d0: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26  Cur>=0 );.  op &
52e0: 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28  = WO_ALL;.  for(
52f0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d  pTerm=pWC->a, k=
5300: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b  pWC->nTerm; k; k
5310: 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
5320: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
5330: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20  tCursor==iCur.  
5340: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
5350: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
5360: 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
5370: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
5380: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
5390: 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  n.       && (pTe
53a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
53b0: 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  op)!=0.    ){.  
53c0: 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
53d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
53e0: 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  !=WO_ISNULL ){. 
53f0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
5400: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
5410: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5420: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
5430: 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20  char idxaff;.   
5440: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
5450: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
5460: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
5470: 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61 66 66  ..        idxaff
5480: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
5490: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
54a0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
54b0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
54c0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
54d0: 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69   idxaff) ) conti
54e0: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  nue;..        /*
54f0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
5500: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
5510: 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  ce required from
5520: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20   an index for.  
5530: 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62        ** it to b
5540: 65 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74  e useful for opt
5550: 69 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73 69  imising expressi
5560: 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69  on pX. Store thi
5570: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  s.        ** val
5580: 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70  ue in variable p
5590: 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  Coll..        */
55a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
55b0: 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
55c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
55d0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
55e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
55f0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
5600: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
5610: 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20  assert(pColl || 
5620: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a  pParse->nErr);..
5630: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5640: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
5650: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
5660: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5670: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
5680: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
5690: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
56a0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
56b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
56c0: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
56d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
56e0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
56f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
5700: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a  rn pTerm;.    }.
5710: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5720: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
5730: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5740: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
5750: 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65  ze(SrcList*, Whe
5760: 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b  reClause*, int);
5770: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
5780: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
5790: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
57a0: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
57b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
57c0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
57d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
57e0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
57f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
5800: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
5810: 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74  pWC         /* t
5820: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5830: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
5840: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
5850: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
5860: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
5870: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
5880: 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69  pTabList, pWC, i
5890: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
58a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
58b0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
58c0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
58d0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
58e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
58f0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
5900: 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61  rator that.** ca
5910: 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75  n be optimized u
5920: 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20  sing inequality 
5930: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65  constraints.  Re
5940: 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
5950: 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c  is.** so and fal
5960: 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  se if not..**.**
5970: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
5980: 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  e operator to be
5990: 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68   optimizible, th
59a0: 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20  e RHS must be a 
59b0: 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61  string.** litera
59c0: 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  l that does not 
59d0: 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c  begin with a wil
59e0: 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74  dcard.  .*/.stat
59f0: 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47  ic int isLikeOrG
5a00: 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lob(.  Parse *pP
5a10: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
5a20: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5a30: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5a40: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
5a50: 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ,      /* Test t
5a60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
5a70: 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65  /.  int *pnPatte
5a80: 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  rn,   /* Number 
5a90: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
5aa0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
5ab0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  s */.  int *pisC
5ac0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
5ad0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5ae0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5af0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5b00: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5b10: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5b20: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5b30: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5b40: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20  const char *z;  
5b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5b70: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
5b80: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5b90: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
5ba0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
5bb0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
5bc0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
5bd0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5be0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5bf0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5c00: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5c10: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5c20: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c40: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
5c50: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
5c60: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
5c70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5c80: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
5c90: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
5ca0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
5cb0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
5cc0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
5cd0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 43 6f  aracters */.  Co
5ce0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
5cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
5d00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5d10: 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73 71 6c 69  or LHS */.  sqli
5d20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5d30: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5d40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5d50: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
5d60: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
5d70: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
5d80: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
5d90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
5da0: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
5db0: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
5dc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
5dd0: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
5de0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
5df0: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
5e00: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
5e10: 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
5e20: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72 65  STRING ){.    re
5e30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
5e40: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5e50: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5e60: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5e70: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
5e80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c  n 0;.  }.  pColl
5e90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
5ea0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
5eb0: 65 66 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  eft);.  assert( 
5ec0: 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 4c 65 66  pColl!=0 || pLef
5ed0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  t->iColumn==-1 )
5ee0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
5ef0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5f00: 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21  f( (pColl->type!
5f10: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e  =SQLITE_COLL_BIN
5f20: 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61 73 65 29  ARY || *pnoCase)
5f30: 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c   &&.      (pColl
5f40: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
5f50: 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 2a  OLL_NOCASE || !*
5f60: 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20  pnoCase) ){.    
5f70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5f80: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
5f90: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
5fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
5fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20  ) return 0;.  z 
5fc0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
5fd0: 65 6e 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20  en;.  cnt = 0;. 
5fe0: 20 69 66 28 20 41 4c 57 41 59 53 28 7a 29 20 29   if( ALWAYS(z) )
5ff0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  {.    while( (c=
6000: 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21  z[cnt])!=0 && c!
6010: 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[0] && c!=wc[
6020: 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29  1] && c!=wc[2] )
6030: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
6040: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
6050: 6e 74 3d 3d 30 20 7c 7c 20 63 3d 3d 30 20 7c 7c  nt==0 || c==0 ||
6060: 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 2d   255==(u8)z[cnt-
6070: 31 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1] ){.    return
6080: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f   0;.  }.  *pisCo
6090: 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d  mplete = z[cnt]=
60a0: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
60b0: 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74  1]==0;.  *pnPatt
60c0: 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74  ern = cnt;.  ret
60d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
60e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
60f0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
6100: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
6110: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6120: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
6130: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6140: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
6150: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
6160: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
6170: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
6180: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
6190: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
61a0: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
61b0: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
61c0: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
61d0: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
61e0: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
61f0: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
6200: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
6210: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
6220: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
6230: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
6240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6250: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6260: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6270: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6290: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
62a0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
62b0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
62c0: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
62d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
62e0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
62f0: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
6300: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
6310: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6320: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
6330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6340: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
6350: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
6360: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
6370: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
6380: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
6390: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
63a0: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
63b0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
63c0: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
63d0: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
63e0: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
63f0: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
6400: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
6410: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
6420: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
6430: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
6440: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
6450: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
6460: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
6470: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
6480: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
64a0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
64b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
64c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
64d0: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65  .** Analyze a te
64e0: 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  rm that consists
64f0: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
6500: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  OR-connected.** 
6510: 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e  subterms.  So in
6520: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  :.**.**     ... 
6530: 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44  WHERE  (a=5) AND
6540: 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20   (b=7 OR c=9 OR 
6550: 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29  d=13) AND (d=13)
6560: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
6580: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6590: 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ^.**.** This rou
65a0: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65  tine analyzes te
65b0: 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20  rms such as the 
65c0: 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74  middle term in t
65d0: 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65  he above example
65e0: 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65  ..** A WhereOrTe
65f0: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d  rm object is com
6600: 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68  puted and attach
6610: 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75  ed to the term u
6620: 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  nder.** analysis
6630: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
6640: 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74  the outcome of t
6650: 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65  he analysis.  He
6660: 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  nce:.**.**     W
6670: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
6680: 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e     |=  TERM_ORIN
6690: 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  FO.**     WhereT
66a0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d  erm.u.pOrInfo  =
66b0: 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20    a dynamically 
66c0: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f  allocated WhereO
66d0: 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a  rTerm object.**.
66e0: 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  ** The term bein
66f0: 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20  g analyzed must 
6700: 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  have two or more
6710: 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64   of OR-connected
6720: 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20   subterms..** A 
6730: 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d  single subterm m
6740: 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66  ight be a set of
6750: 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73   AND-connected s
6760: 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ub-subterms..** 
6770: 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d  Examples of term
6780: 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73  s under analysis
6790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20  :.**.**     (A) 
67a0: 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52      t1.x=t2.y OR
67b0: 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31   t1.x=t2.z OR t1
67c0: 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33  .y=15 OR t1.z=t3
67d0: 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20  .a+5.**     (B) 
67e0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65      x=expr1 OR e
67f0: 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72  xpr2=x OR x=expr
6800: 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20  3.**     (C)    
6810: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74   t1.x=t2.y OR (t
6820: 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e  1.x=t2.z AND t1.
6830: 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29  y=15).**     (D)
6840: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
6850: 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41  (y>11 AND y<22 A
6860: 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c  ND z LIKE '*hell
6870: 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20  o*').**     (E) 
6880: 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71      (p.a=1 AND q
6890: 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20  .b=2 AND r.c=3) 
68a0: 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e  OR (p.x=4 AND q.
68b0: 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a  y=5 AND r.z=6).*
68c0: 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a  *.** CASE 1:.**.
68d0: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
68e0: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
68f0: 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20  rm T.C=expr for 
6900: 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75  some single colu
6910: 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e  mn of C.** a sin
6920: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
6930: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
6940: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
6950: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
6960: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
6970: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
6980: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
6990: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
69a0: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
69b0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
69c0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
69d0: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
69e0: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
69f0: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
6a00: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
6a10: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
6a20: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
6a30: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
6a40: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
6a50: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
6a60: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
6a70: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
6a80: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
6a90: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
6aa0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
6ab0: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
6ac0: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
6ad0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
6ae0: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
6af0: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
6b00: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
6b10: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
6b20: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
6b30: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
6b40: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
6b50: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
6b60: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
6b70: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
6b80: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
6b90: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
6ba0: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
6bb0: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
6bc0: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
6bd0: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
6be0: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
6bf0: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
6c00: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
6c10: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
6c20: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
6c30: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
6c40: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
6c50: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
6c60: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
6c70: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
6c80: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
6c90: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
6ca0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
6cb0: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
6cc0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
6cd0: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
6ce0: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
6cf0: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
6d00: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
6d10: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
6d20: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
6d30: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
6d40: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
6d50: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
6d60: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
6d70: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
6d80: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
6d90: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
6da0: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
6db0: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
6dc0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
6dd0: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
6de0: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
6df0: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
6e00: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
6e10: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
6e20: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
6e30: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
6e40: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
6e50: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
6e60: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6e70: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
6e80: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
6e90: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
6ea0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
6eb0: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
6ec0: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
6ed0: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
6ee0: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
6ef0: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
6f00: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
6f10: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
6f20: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
6f30: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
6f40: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
6f50: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
6f60: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
6f70: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
6f80: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
6f90: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
6fa0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
6fb0: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
6fc0: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
6fd0: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
6fe0: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
6ff0: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
7000: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
7010: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
7020: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
7030: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
7040: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
7050: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
7060: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
7070: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
7080: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
7090: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
70a0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
70b0: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
70c0: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
70d0: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
70e0: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
70f0: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
7100: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
7110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7120: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
7130: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
7140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
7150: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7160: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7170: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
7180: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
7190: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
71a0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
71b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
71c0: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
71d0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
71e0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
71f0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
7200: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
7210: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7220: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
7230: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7250: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7260: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7270: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7280: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7290: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
72a0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
72b0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
72c0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
72e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
72f0: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
7300: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7310: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
7320: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
7330: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
7340: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
7370: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
7380: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
7390: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
73a0: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
73b0: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
73c0: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
73d0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
73e0: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
73f0: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7400: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7410: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7420: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7430: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7440: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
7450: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
7460: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
7470: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
7480: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
7490: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
74b0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
74c0: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
74d0: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
74e0: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
74f0: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7500: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7510: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7520: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7530: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
7540: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
7550: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
7560: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
7570: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
7580: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
7590: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
75a0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
75b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
75c0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
75d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
75e0: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
75f0: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
7600: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7610: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
7620: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
7630: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
7640: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7650: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
7660: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
7670: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
7680: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
7690: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
76a0: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
76b0: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
76c0: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
76d0: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
76e0: 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
76f0: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
7700: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
7710: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
7720: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
7730: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7740: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7750: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
7760: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
7770: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
7780: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
7790: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
77a0: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
77b0: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
77c0: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
77d0: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
77e0: 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66  pWC->vmask);.  f
77f0: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
7800: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
7810: 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69  Wc->a; i>=0 && i
7820: 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70  ndexable; i--, p
7830: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69  OrTerm++){.    i
7840: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
7850: 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47  erator & WO_SING
7860: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)==0 ){.      
7870: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41  WhereAndInfo *pA
7880: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  ndInfo;.      as
7890: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
78a0: 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20  Operator==0 );. 
78b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
78c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
78d0: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
78e0: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
78f0: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
7900: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
7910: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
7920: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7930: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
7940: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
7950: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
7960: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
7970: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
7980: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
7990: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
79a0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
79b0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
79c0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
79d0: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
79e0: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
79f0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
7a00: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
7a10: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
7a20: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
7a30: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
7a40: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
7a50: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
7a60: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
7a70: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
7a80: 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20  skSet);.        
7a90: 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57  whereSplit(pAndW
7aa0: 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  C, pOrTerm->pExp
7ab0: 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  r, TK_AND);.    
7ac0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41      exprAnalyzeA
7ad0: 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29  ll(pSrc, pAndWC)
7ae0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
7af0: 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
7b00: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
7b10: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
7b20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
7b30: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64     for(j=0, pAnd
7b40: 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20  Term=pAndWC->a; 
7b50: 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b  j<pAndWC->nTerm;
7b60: 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b   j++, pAndTerm++
7b70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
7b80: 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d  ssert( pAndTerm-
7b90: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
7ba0: 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65        if( allowe
7bb0: 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45  dOp(pAndTerm->pE
7bc0: 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20  xpr->op) ){.    
7bd0: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
7be0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
7bf0: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
7c00: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
7c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7c20: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7c30: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
7c40: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
7c50: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
7c60: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7c70: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
7c80: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
7c90: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
7ca0: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
7cb0: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
7cc0: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
7cd0: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
7ce0: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
7cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
7d00: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
7d10: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7d20: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
7d30: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
7d40: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
7d50: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
7d60: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
7d70: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
7d80: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
7d90: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
7da0: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
7db0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
7dc0: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
7dd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
7de0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
7df0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
7e00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
7e10: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  WO_EQ ){.       
7e20: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7e30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7e40: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
7e50: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
7e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7e70: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
7e80: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
7e90: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
7ea0: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
7eb0: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
7ec0: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
7ed0: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
7ee0: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
7ef0: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
7f00: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
7f10: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
7f20: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
7f30: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7f40: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
7f50: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
7f60: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
7f70: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
7f80: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
7f90: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
7fa0: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
7fb0: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
7fc0: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
7fd0: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
7fe0: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
7ff0: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
8000: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
8010: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
8020: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
8030: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
8040: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
8050: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
8060: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
8070: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
8080: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
8090: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
80a0: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
80b0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
80c0: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
80d0: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
80e0: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
80f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
8100: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
8110: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
8120: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
8130: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
8140: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
8150: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
8160: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
8170: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
8180: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
8190: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
81a0: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
81b0: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
81c0: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
81d0: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
81e0: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
81f0: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
8200: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
8210: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
8220: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
8230: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
8240: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
8250: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
8260: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8270: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8280: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8290: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
82a0: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
82b0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
82c0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
82d0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
82e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
82f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8300: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
8310: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
8320: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
8330: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
8340: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
8350: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
8360: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
8370: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
8380: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
8390: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
83a0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
83b0: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
83c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
83d0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
83e0: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
83f0: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
8400: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
8410: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
8420: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
8430: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
8440: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
8450: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
8460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8470: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
8480: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
8490: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
84a0: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
84b0: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
84c0: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
84d0: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
84e0: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
84f0: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
8500: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
8510: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
8520: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
8530: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
8540: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
8550: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
8560: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8570: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
8580: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
8590: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
85a0: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
85b0: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
85c0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
85d0: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
85e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
85f0: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
8600: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
8610: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
8620: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
8630: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8640: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
8650: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8660: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8670: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8680: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
8690: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
86a0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
86b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
86c0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
86d0: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b  rsor==iCursor ){
86e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
86f0: 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20  is is the 2-bit 
8700: 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20  case and we are 
8710: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
8720: 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  eration and.    
8730: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
8740: 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68   term is from th
8750: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
8760: 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73  n.  So skip this
8770: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   term. */.      
8780: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
8790: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
87a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
87b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  }.        if( (c
87c0: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
87d0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
87e0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
87f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8800: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
8810: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
8820: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
8830: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
8840: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
8850: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
8860: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
8870: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
8880: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
8890: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
88a0: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
88b0: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
88c0: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
88d0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
88e0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
88f0: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
8900: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
8910: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
8920: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
8930: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
8940: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
8950: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8960: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
8970: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8980: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8990: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
89a0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
89b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
89c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
89d0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
89e0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
89f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
8a00: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
8a10: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
8a20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8a40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
8a50: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
8a60: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
8a70: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
8a80: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
8a90: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
8aa0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
8ab0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8ac0: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
8ad0: 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f   assert( (chngTo
8ae0: 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29  IN&(chngToIN-1))
8af0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
8b00: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
8b10: 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  =getMask(pMaskSe
8b20: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
8b30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
8b50: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
8b60: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
8b70: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
8b80: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
8b90: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
8ba0: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
8bb0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
8bc0: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
8bd0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
8be0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
8bf0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8c00: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
8c10: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
8c20: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
8c30: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
8c40: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8c50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
8c60: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8c70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8c80: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
8c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
8ca0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8cb0: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8cc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8cd0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8ce0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
8cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
8d00: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
8d10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8d20: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
8d30: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
8d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8d50: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
8d60: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
8d70: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
8d80: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
8d90: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
8da0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
8db0: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
8dc0: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
8dd0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
8de0: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
8df0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
8e00: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
8e10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
8e20: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
8e30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
8e40: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
8e50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8e60: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
8e70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8e80: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8e90: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
8ea0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
8eb0: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
8ec0: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
8ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
8ee0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8ef0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
8f10: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8f20: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
8f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8f40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8f50: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
8f60: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
8f70: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
8f80: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
8f90: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
8fa0: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
8fb0: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
8fc0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
8fd0: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
8fe0: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
8ff0: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
9000: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
9010: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
9020: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
9030: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
9040: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
9050: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
9060: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9070: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9080: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
9090: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
90a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
90b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
90c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
90d0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
90e0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
90f0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9100: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
9110: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
9120: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
9130: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
9140: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
9150: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
9160: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9170: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
9180: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
9190: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
91a0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
91b0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
91c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
91d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
91e0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
91f0: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9200: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9210: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9220: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
9230: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
9240: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9250: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
9260: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29  Expr->pRight, 0)
9270: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
9280: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9290: 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61  tAppend(pWC->pPa
92a0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
92b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
92c0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
92d0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
92e0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
92f0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
9300: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9310: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
9320: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
9330: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
9340: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
9350: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
9360: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
9370: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
9380: 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73  w;.        trans
9390: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
93a0: 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
93b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
93c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
93d0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
93e0: 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  t) );.        pN
93f0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
9400: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
9410: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
9420: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
9430: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
9440: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
9450: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9460: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
9470: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
9480: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
9490: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
94a0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
94b0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
94c0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
94d0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
94e0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
94f0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
9500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9520: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
9530: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9540: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9550: 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65  or = 0;  /* case
9560: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
9570: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
9580: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9590: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
95a0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
95b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
95c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  */.../*.** The i
95d0: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
95e0: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
95f0: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
9600: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
9610: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
9620: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
9630: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
9640: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
9650: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
9660: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
9670: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
9680: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
9690: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
96a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
96b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
96c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
96d0: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
96e0: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
96f0: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
9700: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
9710: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
9720: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9730: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9740: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9750: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
9760: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
9770: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
9780: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
9790: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
97a0: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
97b0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
97c0: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
97d0: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
97e0: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
97f0: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
9800: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
9810: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
9820: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
9830: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
9840: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
9850: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
9860: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
9870: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
9880: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
9890: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
98a0: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
98b0: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
98c0: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
98d0: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
98e0: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
98f0: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
9900: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
9910: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
9920: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
9930: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
9940: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
9950: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
9960: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
9970: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
9980: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9990: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
99a0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
99b0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
99c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
99d0: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
99e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
99f0: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
9a00: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
9a10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
9a20: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
9a30: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
9a40: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9a50: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
9a60: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20   *pMaskSet;     
9a70: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74       /* Set of t
9a80: 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73  able index masks
9a90: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
9aa0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9ab0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
9ac0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
9ad0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
9ae0: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b00: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9b10: 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  f the pExpr->pLe
9b20: 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ft */.  Bitmask 
9b30: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
9b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
9b50: 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78  equesites of pEx
9b60: 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  pr */.  Bitmask 
9b70: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a  extraRight = 0;.
9b80: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a    int nPattern;.
9b90: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
9ba0: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
9bb0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
9be0: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
9bf0: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
9c00: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
9c10: 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61  Parse;     /* Pa
9c20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9c40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
9c50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9c60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
9c70: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
9c80: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9c90: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
9ca0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
9cb0: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
9cc0: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
9cd0: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
9ce0: 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65  ->pExpr;.  prere
9cf0: 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c  qLeft = exprTabl
9d00: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9d10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9d20: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
9d30: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
9d40: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
9d50: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
9d60: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  0 );.    if( Exp
9d70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
9d80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
9d90: 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  ) ){.      pTerm
9da0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
9db0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
9dc0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9dd0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
9de0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9df0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9e00: 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74  Right = exprList
9e10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9e20: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Set, pExpr->x.pL
9e30: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ist);.    }.  }e
9e40: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
9e50: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
9e60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9e70: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
9e80: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9e90: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
9ea0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9eb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9ec0: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
9ed0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
9ee0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9ef0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
9f00: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9f10: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
9f20: 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20      Bitmask x = 
9f30: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
9f40: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
9f50: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  oinTable);.    p
9f60: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20  rereqAll |= x;. 
9f70: 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20     extraRight = 
9f80: 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75  x-1;  /* ON clau
9f90: 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74  se terms may not
9fa0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
9fb0: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
9fd0: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f   on left table o
9fe0: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
9ff0: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a  Ticket #3015 */.
a000: 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65    }.  pTerm->pre
a010: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
a020: 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66  ll;.  pTerm->lef
a030: 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  tCursor = -1;.  
a040: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
a050: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f   -1;.  pTerm->eO
a060: 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69  perator = 0;.  i
a070: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  f( allowedOp(op)
a080: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
a090: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
a0a0: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
a0b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
a0c0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
a0d0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
a0e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
a0f0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a100: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a110: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a120: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
a130: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
a140: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
a150: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a160: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
a170: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a180: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20  atorMask(op);.  
a190: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
a1a0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
a1b0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
a1c0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
a1d0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
a1e0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
a1f0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
a200: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
a210: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a220: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
a230: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a240: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
a250: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
a260: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
a270: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a280: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
a290: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a2a0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
a2b0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
a2c0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
a2d0: 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d  (pWC, pDup, TERM
a2e0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
a2f0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
a300: 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20  if( idxNew==0 ) 
a310: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a320: 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69  pNew = &pWC->a[i
a330: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20  dxNew];.        
a340: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20  pNew->iParent = 
a350: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
a360: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
a370: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
a380: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
a390: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54   = 1;.        pT
a3a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
a3b0: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
a3c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3d0: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
a3e0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
a3f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
a400: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
a410: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
a420: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75       pLeft = pDu
a430: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
a440: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
a450: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
a460: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
a470: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
a480: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
a490: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52     pNew->prereqR
a4a0: 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66  ight = prereqLef
a4b0: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
a4c0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
a4d0: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
a4e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
a4f0: 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d  eratorMask(pDup-
a500: 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >op);.    }.  }.
a510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a520: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
a530: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
a540: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
a550: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
a560: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
a570: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
a580: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
a590: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
a5a0: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
a5b0: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
a5c0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
a5d0: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
a5e0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
a5f0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
a600: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a610: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
a620: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
a630: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
a640: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
a650: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
a660: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
a670: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
a680: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
a690: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
a6a0: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
a6b0: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
a6c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
a6d0: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
a6e0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
a6f0: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
a700: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
a710: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
a720: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
a730: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
a740: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
a750: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
a760: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
a770: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
a780: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a790: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a7a0: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
a7b0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
a7c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
a7d0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a7e0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
a7f0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
a800: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
a810: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
a820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a830: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
a840: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a850: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
a860: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
a870: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
a880: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
a890: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
a8a0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
a8b0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
a8c0: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a8f0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
a900: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a930: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
a940: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
a950: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
a960: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a970: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
a980: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
a990: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
a9a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a9b0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
a9c0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a9d0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
a9e0: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
a9f0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
aa00: 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ];.      pWC->a[
aa10: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
aa20: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d  = idxTerm;.    }
aa30: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
aa40: 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64  ld = 2;.  }.#end
aa50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
aa60: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
aa70: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
aa80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
aa90: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
aaa0: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
aab0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
aac0: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c  QUERY).  /* Anal
aad0: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
aae0: 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74  is composed of t
aaf0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
ab00: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
ab10: 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72  .  ** an OR oper
ab20: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ator..  */.  els
ab30: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
ab40: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73  =TK_OR ){.    as
ab50: 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54  sert( pWC->op==T
ab60: 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70  K_AND );.    exp
ab70: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70  rAnalyzeOrTerm(p
ab80: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Src, pWC, idxTer
ab90: 6d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m);.  }.#endif /
aba0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
abb0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
abc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
abd0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
abe0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
abf0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
ac00: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
ac10: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
ac20: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
ac30: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
ac40: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
ac50: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
ac60: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
ac70: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
ac80: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
ac90: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
aca0: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
acb0: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
acc0: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
acd0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
ace0: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
acf0: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
ad00: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
ad10: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
ad20: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
ad30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c  ..  */.  if( isL
ad40: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
ad50: 2c 20 70 45 78 70 72 2c 20 26 6e 50 61 74 74 65  , pExpr, &nPatte
ad60: 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  rn, &isComplete,
ad70: 20 26 6e 6f 43 61 73 65 29 0a 20 20 20 20 20 20   &noCase).      
ad80: 20 20 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54     && pWC->op==T
ad90: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
ada0: 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  r *pLeft, *pRigh
adb0: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  t;.    Expr *pSt
adc0: 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20  r1, *pStr2;.    
add0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c  Expr *pNewExpr1,
ade0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
adf0: 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64   int idxNew1, id
ae00: 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66  xNew2;..    pLef
ae10: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
ae20: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
ae30: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
ae40: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
ae50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
ae60: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
ae70: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
ae80: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
ae90: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31  );.    if( pStr1
aea0: 20 29 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b   ) pStr1->u.zTok
aeb0: 65 6e 5b 6e 50 61 74 74 65 72 6e 5d 20 3d 20 30  en[nPattern] = 0
aec0: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
aed0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aee0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
aef0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
af00: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
af10: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
af20: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
af30: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
af40: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
af50: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
af60: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
af70: 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20  nPattern-1];.   
af80: 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
af90: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
afb0: 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
afc0: 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
afd0: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
afe0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
aff0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
b000: 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
b010: 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
b020: 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
b030: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
b040: 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
b050: 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
b060: 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
b070: 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
b080: 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
b090: 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
b0a0: 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
b0b0: 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
b0c0: 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
b0d0: 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
b0e0: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
b0f0: 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
b100: 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
b110: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
b120: 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
b130: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 0a 20 20  omplete = 0;..  
b140: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
b150: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
b160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b170: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
b180: 20 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31   }.    pNewExpr1
b190: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b1a0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73  pParse, TK_GE, s
b1b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b1c0: 2c 70 4c 65 66 74 2c 30 29 2c 70 53 74 72 31 2c  ,pLeft,0),pStr1,
b1d0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
b1e0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
b1f0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
b200: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
b210: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
b220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
b230: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
b240: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
b250: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
b260: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
b270: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b280: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c  arse, TK_LT, sql
b290: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
b2a0: 4c 65 66 74 2c 30 29 2c 70 53 74 72 32 2c 30 29  Left,0),pStr2,0)
b2b0: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
b2c0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b2d0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
b2e0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b2f0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b300: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b310: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
b320: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
b330: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
b340: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b350: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b360: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
b370: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
b380: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
b390: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
b3a0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
b3b0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
b3c0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
b3d0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
b3e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
b3f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
b400: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
b410: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b420: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b430: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
b440: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
b450: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
b460: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
b470: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
b480: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
b490: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
b4a0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
b4b0: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
b4c0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
b4d0: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
b4e0: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
b4f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
b500: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
b510: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
b520: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
b530: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
b540: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
b550: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
b560: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
b570: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
b580: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b590: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
b5a0: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
b5b0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
b5c0: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
b5d0: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
b5e0: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
b5f0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b600: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
b610: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b620: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b630: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
b640: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
b650: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b660: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
b670: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
b680: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b690: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
b6a0: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
b6b0: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
b6c0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
b6d0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b6e0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
b6f0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b700: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b730: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b740: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
b750: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
b760: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
b770: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
b780: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
b790: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
b7a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b7b0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
b7c0: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
b7d0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
b7e0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
b7f0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
b800: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
b810: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
b820: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
b830: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
b840: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
b850: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
b860: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
b870: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
b880: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
b890: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
b8a0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
b8b0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b8c0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b8d0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
b8e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
b8f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
b900: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
b910: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
b920: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
b930: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
b940: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b950: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b960: 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50  TABLE */..  /* P
b970: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
b980: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
b990: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
b9a0: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
b9b0: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
b9c0: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
b9d0: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
b9e0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
b9f0: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
ba00: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
ba10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
ba20: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
ba30: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
ba40: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
ba50: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
ba60: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
ba70: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
ba80: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
ba90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
baa0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
bab0: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
bac0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
bad0: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
bae0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
baf0: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
bb00: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
bb10: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
bb20: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
bb30: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
bb40: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
bb50: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
bb60: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
bb70: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
bb80: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
bbb0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
bbc0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
bbd0: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
bbe0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
bbf0: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
bc00: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
bc10: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
bc20: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
bc30: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
bc40: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
bc50: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
bc60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bc70: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
bc80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
bc90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bca0: 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20  decides if pIdx 
bcb0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
bcc0: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
bcd0: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20   BY.** clause.  
bce0: 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65  If it can, it re
bcf0: 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64  turns 1.  If pId
bd00: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
bd10: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
bd20: 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f   clause, this ro
bd30: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
bd40: 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
bd50: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
bd60: 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c  lause from a SEL
bd70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
bd80: 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c  pTab is the.** l
bd90: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft-most table i
bda0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
bdb0: 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53  e of that same S
bdc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
bdd0: 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  and.** the table
bde0: 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75   has a cursor nu
bdf0: 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20  mber of "base". 
be00: 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65   pIdx is an inde
be10: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  x on pTab..**.**
be20: 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e   nEqCol is the n
be30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
be40: 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72   of pIdx that ar
be50: 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69  e used as equali
be60: 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  ty.** constraint
be70: 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65  s.  Any of these
be80: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20   columns may be 
be90: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65  missing from the
bea0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
beb0: 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63  use and the matc
bec0: 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61  h can still be a
bed0: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
bee0: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
bef0: 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 6d   ORDER BY that m
bf00: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
bf10: 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
bf20: 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20  ither.** ASC or 
bf30: 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66  DESC.  (Terms of
bf40: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
bf50: 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65 6e  ause past the en
bf60: 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a  d of a UNIQUE.**
bf70: 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65   index do not ne
bf80: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
bf90: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20  is constraint.) 
bfa0: 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75   The *pbRev valu
bfb0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31  e is.** set to 1
bfc0: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
bfd0: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44   clause is all D
bfe0: 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73 65  ESC and it is se
bff0: 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65  t to 0 if.** the
c000: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c010: 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a   is all ASC..*/.
c020: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72  static int isSor
c030: 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72  tingIndex(.  Par
c040: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c050: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c060: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
c070: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
c080: 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20  Set, /* Mapping 
c090: 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f  from table curso
c0a0: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
c0b0: 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  maps */.  Index 
c0c0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
c0d0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
c0e0: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f  e are testing */
c0f0: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
c100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
c110: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
c120: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
c130: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
c140: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
c150: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
c160: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c170: 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20  int nEqCol,     
c180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c190: 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d  r of index colum
c1a0: 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74  ns with == const
c1b0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
c1c0: 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20  *pbRev          
c1d0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
c1e0: 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44  if ORDER BY is D
c1f0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ESC */.){.  int 
c200: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
c210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c220: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
c230: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
c240: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c250: 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65    /* XOR of inde
c260: 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73  x and ORDER BY s
c270: 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f  ort direction */
c280: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c2b0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
c2c0: 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
c2d0: 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b  ist_item *pTerm;
c2e0: 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66      /* A term of
c2f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c300: 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ause */.  sqlite
c310: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c320: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
c330: 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
c340: 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  nTerm = pOrderBy
c350: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
c360: 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  t( nTerm>0 );.. 
c370: 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20   /* Match terms 
c380: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
c390: 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63  clause against c
c3a0: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
c3b0: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
c3c0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e   ** Note that in
c3d0: 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d  dices have pIdx-
c3e0: 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72  >nColumn regular
c3f0: 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20   columns plus.  
c400: 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  ** one additiona
c410: 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  l column contain
c420: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20  ing the rowid.  
c430: 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  The rowid column
c440: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  .  ** of the ind
c450: 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77  ex is also allow
c460: 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  ed to match agai
c470: 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  nst the ORDER BY
c480: 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20  .  ** clause..  
c490: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
c4a0: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
c4b0: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
c4c0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
c4d0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c4e0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
c4f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
c500: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
c510: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
c520: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
c530: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
c540: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
c550: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
c560: 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
c570: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
c580: 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69  is term */.    i
c590: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
c5a0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f    /* The i-th co
c5b0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
c5c0: 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64  x.  -1 for rowid
c5d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72   */.    int iSor
c5e0: 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20  tOrder;    /* 1 
c5f0: 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20  for DESC, 0 for 
c600: 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ASC on the i-th 
c610: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
c620: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
c630: 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  oll; /* Name of 
c640: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
c650: 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
c660: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20  index term */.. 
c670: 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
c680: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
c690: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
c6a0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
c6b0: 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
c6c0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74        /* Can not
c6d0: 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f   use an index so
c6e0: 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74  rt on anything t
c6f0: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c  hat is not a col
c700: 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  umn in the.     
c710: 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61   ** left-most ta
c720: 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ble of the FROM 
c730: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
c740: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c750: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c760: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c770: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
c780: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
c790: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
c7a0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
c7b0: 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
c7c0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
c7d0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
c7e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
c7f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
c800: 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  ==pIdx->pTable->
c810: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
c820: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
c830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f       }.      iSo
c840: 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e  rtOrder = pIdx->
c850: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
c860: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64       zColl = pId
c870: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
c880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c890: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
c8a0: 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20     iSortOrder = 
c8b0: 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  0;.      zColl =
c8c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
c8d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78     }.    if( pEx
c8e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
c8f0: 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53  lumn || sqlite3S
c900: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
c910: 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
c920: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f       /* Term j o
c930: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
c940: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
c950: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66  atch column i of
c960: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
c970: 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c      if( i<nEqCol
c980: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
c990: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
c9a0: 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  n that is constr
c9b0: 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c  ained by == fail
c9c0: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20  s to match an.  
c9d0: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
c9e0: 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20  Y term, that is 
c9f0: 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65  OK.  Just ignore
ca00: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   that column of 
ca10: 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
ca20: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
ca30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
ca40: 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e  se if( i==pIdx->
ca50: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
ca60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75     /* Index colu
ca70: 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69  mn i is the rowi
ca80: 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65  d.  All other te
ca90: 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  rms match. */.  
caa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cac0: 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78    /* If an index
cad0: 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f   column fails to
cae0: 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f   match and is no
caf0: 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
cb00: 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   ==.        ** t
cb10: 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61  hen the index ca
cb20: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
cb30: 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72   ORDER BY constr
cb40: 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aint..        */
cb50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cb60: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
cb70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
cb80: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  x->aSortOrder!=0
cb90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cba0: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
cbb0: 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f  ==0 || pTerm->so
cbc0: 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
cbd0: 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f    assert( iSortO
cbe0: 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74  rder==0 || iSort
cbf0: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
cc00: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
cc10: 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65  iSortOrder ^ pTe
cc20: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
cc30: 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20     if( i>nEqCol 
cc40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  ){.      if( ter
cc50: 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74  mSortOrder!=sort
cc60: 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Order ){.       
cc70: 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20   /* Indices can 
cc80: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
cc90: 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
cca0: 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  ms past the.    
ccb0: 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
ccc0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
ccd0: 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20  all either DESC 
cce0: 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20  or ASC. */.     
ccf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
cd00: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
cd10: 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
cd20: 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
cd30: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
cd40: 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20      pTerm++;.   
cd50: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26   if( iColumn<0 &
cd60: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
cd70: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
cd80: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
cd90: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  base) ){.      /
cda0: 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64  * If the indexed
cdb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70   column is the p
cdc0: 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65  rimary key and e
cdd0: 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65  verything matche
cde0: 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61  s.      ** so fa
cdf0: 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  r and none of th
ce00: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  e ORDER BY terms
ce10: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65   to the right re
ce20: 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20  ference other.  
ce30: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e      ** tables in
ce40: 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20   the join, then 
ce50: 77 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74  we are assured t
ce60: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61  hat the index ca
ce70: 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20  n be used .     
ce80: 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61   ** to sort beca
ce90: 75 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  use the primary 
cea0: 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e  key is unique an
ceb0: 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65  d so none of the
cec0: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
ced0: 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b  columns will mak
cee0: 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65  e any difference
cef0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cf00: 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d  j = nTerm;.    }
cf10: 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d  .  }..  *pbRev =
cf20: 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20   sortOrder!=0;. 
cf30: 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b   if( j>=nTerm ){
cf40: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d  .    /* All term
cf50: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
cf60: 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76  Y clause are cov
cf70: 65 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64  ered by this ind
cf80: 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ex so.    ** thi
cf90: 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  s index can be u
cfa0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  sed for sorting.
cfb0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
cfc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
cfd0: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
cfe0: 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e  ne && i==pIdx->n
cff0: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20  Column.      && 
d000: 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72  !referencesOther
d010: 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c  Tables(pOrderBy,
d020: 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61   pMaskSet, j, ba
d030: 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  se) ){.    /* Al
d040: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20  l terms of this 
d050: 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65  index match some
d060: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f   prefix of the O
d070: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
d080: 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e     ** and the in
d090: 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e  dex is UNIQUE an
d0a0: 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68  d no terms on th
d0b0: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52  e tail of the OR
d0c0: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
d0d0: 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f  ause reference o
d0e0: 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61  ther tables in a
d0f0: 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20   join.  If this 
d100: 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e  is all true then
d110: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65  .    ** the orde
d120: 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73  r by clause is s
d130: 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20  uperfluous. */. 
d140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
d150: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d160: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c  /*.** Check tabl
d170: 65 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  e to see if the 
d180: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d190: 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20  in pOrderBy can 
d1a0: 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  be satisfied.** 
d1b0: 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72  by sorting in or
d1c0: 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52  der of ROWID.  R
d1d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f  eturn true if so
d1e0: 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20   and set *pbRev 
d1f0: 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f  to be.** true fo
d200: 72 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20  r reverse ROWID 
d210: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f  and false for fo
d220: 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65  rward ROWID orde
d230: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
d240: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
d250: 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  (.  int base,   
d260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d270: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
d280: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
d290: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
d2a0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
d2b0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
d2c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
d2d0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
d2e0: 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20  Set, /* Mapping 
d2f0: 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f  from table curso
d300: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
d310: 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20  .  int *pbRev   
d320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
d330: 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20  t to 1 if ORDER 
d340: 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b  BY is DESC */.){
d350: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61  .  Expr *p;..  a
d360: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
d370: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d380: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d390: 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65  0 );.  p = pOrde
d3a0: 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  rBy->a[0].pExpr;
d3b0: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
d3c0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
d3d0: 61 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d  able==base && p-
d3e0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20  >iColumn==-1.   
d3f0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
d400: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
d410: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31  rBy, pMaskSet, 1
d420: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a  , base) ){.    *
d430: 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79  pbRev = pOrderBy
d440: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
d450: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d470: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
d480: 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74   a crude estimat
d490: 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74  e of the logarit
d4a0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
d4b0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
d4c0: 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62  sults need not b
d4d0: 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69  e exact.  This i
d4e0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
d4f0: 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68  estimating.** th
d500: 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20  e total cost of 
d510: 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61  performing opera
d520: 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67  tions with O(log
d530: 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a  N) or O(NlogN).*
d540: 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42  * complexity.  B
d550: 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74  ecause N is just
d560: 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20   a guess, it is 
d570: 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79  no great tragedy
d580: 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61   if.** logN is a
d590: 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a   little off..*/.
d5a0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73  static double es
d5b0: 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a  tLog(double N){.
d5c0: 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20    double logN = 
d5d0: 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20  1;.  double x = 
d5e0: 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78  10;.  while( N>x
d5f0: 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20   ){.    logN += 
d600: 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a  1;.    x *= 10;.
d610: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67    }.  return log
d620: 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  N;.}../*.** Two 
d630: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
d640: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
d650: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
d660: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
d670: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
d680: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
d690: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
d6a0: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
d6b0: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
d6c0: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
d6d0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
d6e0: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
d6f0: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
d700: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d710: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d720: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
d730: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
d740: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
d750: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
d760: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
d770: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
d780: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
d790: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
d7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
d7b0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
d7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
d7d0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
d7e0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
d7f0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
d800: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
d810: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d820: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d830: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d840: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d850: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
d860: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
d870: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
d880: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d890: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
d8a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
d8b0: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
d8c0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d8d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d8e0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
d8f0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
d900: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
d910: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
d920: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
d930: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
d940: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
d950: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
d960: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
d970: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
d980: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
d990: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
d9a0: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
d9b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
d9c0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
d9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
d9e0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
d9f0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
da00: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
da10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
da20: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
da30: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
da40: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
da50: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
da60: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
da70: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
da80: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
da90: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
daa0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
dab0: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
dac0: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
dad0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
dae0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
daf0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
db00: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
db10: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
db20: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
db30: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
db40: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
db50: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
db60: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
db70: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
db80: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
db90: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ).#endif../* .**
dba0: 20 52 65 71 75 69 72 65 64 20 62 65 63 61 75 73   Required becaus
dbb0: 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 69 73  e bestIndex() is
dbc0: 20 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f   called by bestO
dbd0: 72 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a  rClauseIndex() .
dbe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
dbf0: 65 73 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61  estIndex(.    Pa
dc00: 72 73 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  rse*, WhereClaus
dc10: 65 2a 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  e*, struct SrcLi
dc20: 73 74 5f 69 74 65 6d 2a 2c 20 42 69 74 6d 61 73  st_item*, Bitmas
dc30: 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68  k, ExprList*, Wh
dc40: 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a  ereCost*);../*.*
dc50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
dc60: 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
dc70: 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61  an scanning stra
dc80: 74 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65  tegy that can be
dc90: 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74   used .** to opt
dca0: 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78  imize an 'OR' ex
dcb0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
dcc0: 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45   part of a WHERE
dcd0: 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20   clause. .**.** 
dce0: 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  The table associ
dcf0: 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63  ated with FROM c
dd00: 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20  lause term pSrc 
dd10: 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a  may be either a.
dd20: 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65  ** regular B-Tre
dd30: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72  e table or a vir
dd40: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
dd50: 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f  tatic void bestO
dd60: 72 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20  rClauseIndex(.  
dd70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dd90: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
dda0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
ddb0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
ddc0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
ddd0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
dde0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ddf0: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
de00: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
de10: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
de20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
de30: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
de40: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
de50: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
de60: 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
de70: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
de80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
de90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
dea0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
deb0: 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
dec0: 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
ded0: 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23  ery plan */.){.#
dee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
def0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
df00: 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  ON.  const int i
df10: 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
df20: 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
df30: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
df40: 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
df50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d   */.  const Bitm
df60: 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65  ask maskSrc = ge
df70: 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
df80: 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20  Set, iCur);  /* 
df90: 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63  Bitmask for pSrc
dfa0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
dfb0: 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d  * const pWCEnd =
dfc0: 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
dfd0: 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  erm];        /* 
dfe0: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
dff0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e000: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
e010: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
e020: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
e030: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  HERE clause */..
e040: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
e050: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
e060: 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20  ms for a usable 
e070: 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20  WO_OR term. */. 
e080: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
e090: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
e0a0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
e0b0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
e0c0: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20  tor==WO_OR .    
e0d0: 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65   && ((pTerm->pre
e0e0: 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72  reqAll & ~maskSr
e0f0: 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  c) & notReady)==
e100: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
e110: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
e120: 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63  exable & maskSrc
e130: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
e140: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
e150: 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
e160: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
e170: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
e180: 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
e190: 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
e1a0: 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
e1b0: 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
e1c0: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
e1d0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48    int flags = WH
e1e0: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
e1f0: 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61      double rTota
e200: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75  l = 0;.      dou
e210: 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  ble nRow = 0;.. 
e220: 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
e230: 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
e240: 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
e250: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
e260: 20 57 68 65 72 65 43 6f 73 74 20 73 54 65 72 6d   WhereCost sTerm
e270: 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57 48  Cost;.        WH
e280: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d  ERETRACE(("... M
e290: 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65  ulti-index OR te
e2a0: 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25  sting for term %
e2b0: 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20  d of %d....\n", 
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4f 72 54  .          (pOrT
e2d0: 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c  erm - pOrWC->a),
e2e0: 20 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61   (pTerm - pWC->a
e2f0: 29 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20  ).        ));.  
e300: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
e310: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
e320: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _AND ){.        
e330: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
e340: 41 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  AndWC = &pOrTerm
e350: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
e360: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
e370: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 41  Index(pParse, pA
e380: 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52  ndWC, pSrc, notR
e390: 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d 43  eady, 0, &sTermC
e3a0: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ost);.        }e
e3b0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
e3c0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
e3d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  r ){.          W
e3e0: 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
e3f0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
e400: 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43  pWC.pParse = pWC
e410: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
e420: 20 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b      tempWC.pMask
e430: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
e440: 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Set;.          t
e450: 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
e460: 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
e470: 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
e480: 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
e490: 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
e4a0: 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
e4b0: 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43  (pParse, &tempWC
e4c0: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
e4d0: 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29  , 0, &sTermCost)
e4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
e500: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
e510: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
e520: 20 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74   sTermCost.rCost
e530: 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
e540: 3d 20 73 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77  = sTermCost.nRow
e550: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54  ;.        if( rT
e560: 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f  otal>=pCost->rCo
e570: 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  st ) break;.    
e580: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
e590: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
e5a0: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
e5b0: 63 72 65 61 73 65 20 74 68 65 20 73 63 61 6e 20  crease the scan 
e5c0: 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74 20  cost to account 
e5d0: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
e5e0: 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 6f  e cost of the so
e5f0: 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  rt. */.      if(
e600: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a   pOrderBy!=0 ){.
e610: 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
e620: 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
e630: 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45  ow);.        WHE
e640: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f  RETRACE(("... so
e650: 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20  rting increases 
e660: 4f 52 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  OR cost to %.9g\
e670: 6e 22 2c 20 72 54 6f 74 61 6c 29 29 3b 0a 20 20  n", rTotal));.  
e680: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
e690: 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  If the cost of s
e6a0: 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68  canning using th
e6b0: 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f  is OR term for o
e6c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20  ptimization is. 
e6d0: 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
e6e0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  n the current co
e6f0: 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f  st stored in pCo
e700: 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20  st, replace the 
e710: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a  contents.      *
e720: 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20  * of pCost. */. 
e730: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
e740: 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65  ("... multi-inde
e750: 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e  x OR cost=%.9g n
e760: 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f  row=%.9g\n", rTo
e770: 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20  tal, nRow));.   
e780: 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 43     if( rTotal<pC
e790: 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
e7a0: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
e7b0: 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20  st = rTotal;.   
e7c0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77       pCost->nRow
e7d0: 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20   = nRow;.       
e7e0: 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
e7f0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
e800: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
e810: 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72  n.u.pTerm = pTer
e820: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
e830: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
e850: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a  TIMIZATION */.}.
e860: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e870: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
e880: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
e890: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
e8a0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
e8b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
e8c0: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
e8d0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
e8e0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
e8f0: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
e900: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
e910: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
e920: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
e930: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e940: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
e950: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
e960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e970: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
e980: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
e990: 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43  Parse, .  WhereC
e9a0: 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74  lause *pWC,.  st
e9b0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
e9c0: 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
e9d0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
e9e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
e9f0: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
ea00: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
ea10: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
ea20: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
ea30: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
ea40: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
ea50: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
ea60: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
ea70: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
ea80: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
ea90: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
eaa0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
eab0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
eac0: 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52  IdxInfo;..  WHER
ead0: 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
eae0: 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
eaf0: 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53  for %s...\n", pS
eb00: 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
eb10: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
eb20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
eb30: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
eb40: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
eb50: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
eb60: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
eb70: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
eb80: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
eb90: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
eba0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
ebb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
ebc0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
ebd0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
ebe0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
ebf0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f  sert( (pTerm->eO
ec00: 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e  perator&(pTerm->
ec10: 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30  eOperator-1))==0
ec20: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ec30: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ec40: 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  or==WO_IN );.   
ec50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
ec60: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
ec70: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
ec80: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ec90: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
eca0: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
ecb0: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
ecc0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
ecd0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ece0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
ecf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
ed00: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
ed10: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
ed20: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
ed30: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
ed40: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
ed50: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ed60: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
ed70: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
ed80: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
ed90: 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
eda0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
edb0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
edc0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
edd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
ede0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
edf0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
ee00: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
ee10: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
ee20: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
ee30: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f   }.    if( i==pO
ee40: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
ee50: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
ee60: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
ee70: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
ee80: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
ee90: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
eea0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
eeb0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
eec0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
eed0: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
eee0: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
eef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
ef10: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
ef20: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
ef30: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
ef60: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
ef70: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
ef80: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
ef90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
efa0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
efb0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f   memory");.    /
efc0: 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
efd0: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
efe0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
eff0: 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  T... */.    retu
f000: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
f010: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
f020: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
f030: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f040: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
f050: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
f060: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
f070: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
f080: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
f090: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
f0a0: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
f0b0: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
f0c0: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
f0d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
f0e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
f0f0: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
f100: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
f110: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f120: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
f130: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
f140: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
f150: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f160: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
f170: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
f180: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
f190: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
f1a0: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
f1b0: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
f1c0: 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
f1d0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
f1e0: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
f1f0: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
f200: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
f210: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
f220: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f230: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
f240: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
f250: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
f260: 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
f270: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
f280: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
f290: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
f2a0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
f2b0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f2c0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
f2d0: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
f2e0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
f2f0: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
f340: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
f350: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
f360: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
f370: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
f380: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
f390: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
f3a0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
f3b0: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
f3c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
f3d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
f3e0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  ))==0 );.    tes
f3f0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
f400: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
f410: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f420: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f430: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
f440: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
f450: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
f460: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
f470: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
f480: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
f490: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
f4a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
f4b0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
f4c0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78  et = i;.    pIdx
f4d0: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
f4e0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
f4f0: 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  r;.    /* The di
f500: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
f510: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
f520: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
f530: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
f540: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
f550: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
f560: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
f570: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
f580: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
f590: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
f5a0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
f5b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
f5c0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
f5d0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
f5e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
f5f0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
f600: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
f610: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f620: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
f630: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
f640: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
f650: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
f660: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
f670: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
f680: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
f690: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
f6a0: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
f6b0: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
f6c0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
f6d0: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
f6e0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
f6f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
f700: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
f710: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
f720: 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
f730: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
f740: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
f750: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
f760: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
f770: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
f780: 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
f790: 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
f7a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
f7b0: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
f7c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
f7d0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
f7e0: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
f7f0: 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
f800: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
f810: 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
f820: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
f830: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
f840: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
f850: 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
f860: 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
f870: 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
f880: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
f890: 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
f8a0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
f8b0: 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
f8c0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e  _index_info poin
f8d0: 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
f8e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
f8f0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
f900: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
f910: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
f920: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
f930: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
f940: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
f950: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
f960: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
f970: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
f980: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
f990: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f9a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
f9b0: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
f9c0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
f9d0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
f9e0: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
f9f0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
fa00: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
fa10: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
fa20: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
fa30: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
fa40: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
fa50: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
fa60: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
fa70: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
fa80: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
fa90: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
faa0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
fab0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
fac0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
fad0: 62 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 3b  b = pTab->pVtab;
fae0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
faf0: 72 63 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c  rc;..  (void)sql
fb00: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 50  ite3SafetyOff(pP
fb10: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45  arse->db);.  WHE
fb20: 52 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49  RETRACE(("xBestI
fb30: 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20  ndex for %s\n", 
fb40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
fb50: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
fb60: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
fb70: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
fb80: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
fb90: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
fba0: 55 54 50 55 54 53 28 70 29 3b 0a 20 20 28 76 6f  UTPUTS(p);.  (vo
fbb0: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
fbc0: 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  On(pParse->db);.
fbd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fbe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
fbf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
fc00: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
fc10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
fc20: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
fc30: 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
fc40: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
fc50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fc60: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
fc70: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
fc80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fc90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fca0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
fcb0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
fcc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
fcd0: 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
fce0: 65 2d 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  e->db, pVtab->zE
fcf0: 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
fd00: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
fd10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
fd20: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
fd30: 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
fd40: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
fd50: 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
fd60: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
fd70: 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
fd80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fd90: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
fda0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
fdb0: 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
fdc0: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
fdd0: 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
fde0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
fdf0: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
fe00: 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nErr;.}.../*.**
fe10: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73   Compute the bes
fe20: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69  t index for a vi
fe30: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
fe40: 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  ** The best inde
fe50: 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79  x is computed by
fe60: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
fe70: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
fe80: 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d  rtual.** table m
fe90: 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  odule.  This rou
fea0: 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a  tine is really j
feb0: 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68  ust a wrapper th
fec0: 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68  at sets up.** th
fed0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
fee0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
fef0: 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
ff00: 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a  ommunicate with.
ff10: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  ** xBestIndex..*
ff20: 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20  *.** In a join, 
ff30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
ff40: 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c  ht be called mul
ff50: 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20  tiple times for 
ff60: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74  the.** same virt
ff70: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
ff80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ff90: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
ffa0: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69  created.** and i
ffb0: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68  nitialized on th
ffc0: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
ffd0: 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  on and reused on
ffe0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
fff0: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20  ** invocations. 
10000 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
10010 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10020 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
10030 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  hen.** code is g
10040 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65  enerated to acce
10050 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ss the virtual t
10060 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65  able.  The where
10070 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a  InfoDelete() .**
10080 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63   routine takes c
10090 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74  are of freeing t
100a0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
100b0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
100c0 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f  after.** everybo
100d0 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  dy has finished 
100e0 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  with it..*/.stat
100f0 69 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74  ic void bestVirt
10100 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ualIndex(.  Pars
10110 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10130 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
10140 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
10150 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
10160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10170 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10180 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10190 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
101a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
101b0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
101c0 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
101d0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
101e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
101f0 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
10200 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
10210 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
10220 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
10230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
10240 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
10250 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
10260 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ost,            
10270 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
10280 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
10290 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
102a0 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
102b0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72    /* Index infor
102c0 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f  mation passed to
102d0 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29   xBestIndex */.)
102e0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
102f0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
10300 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10310 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
10320 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
10330 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
10340 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
10350 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
10360 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
10370 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
10380 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
10390 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
103a0 74 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  t nOrderBy;..  /
103b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
103c0 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
103d0 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
103e0 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
103f0 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
10400 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
10410 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
10420 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
10430 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
10440 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
10450 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
10460 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
10470 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
10480 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
10490 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
104a0 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pCost, 0, sizeof
104b0 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f  (*pCost));.  pCo
104c0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
104d0 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
104e0 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  TABLE;..  /* If 
104f0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
10500 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
10510 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
10520 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c  eviously.  ** al
10530 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74  located and init
10540 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c  ialized, then al
10550 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
10560 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20  alize it now..  
10570 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
10580 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66  *ppIdxInfo;.  if
10590 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
105a0 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20  .    *ppIdxInfo 
105b0 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c  = pIdxInfo = all
105c0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
105d0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
105e0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
105f0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
10600 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10610 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
10620 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73  his point, the s
10630 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10640 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
10650 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73   pIdxInfo points
10660 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61  .  ** to will ha
10670 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ve been initiali
10680 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69  zed, either duri
10690 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ng the current i
106a0 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a  nvocation or.  *
106b0 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72  * during some pr
106c0 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ior invocation. 
106d0 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76   Now we just hav
106e0 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74  e to customize t
106f0 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20  he.  ** details 
10700 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20  of pIdxInfo for 
10710 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
10720 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20  cation and pass 
10730 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74  it to.  ** xBest
10740 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  Index..  */..  /
10750 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d  * The module nam
10760 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
10770 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73  d. Also, by this
10780 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73   point there mus
10790 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e  t.  ** be a poin
107a0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
107b0 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
107c0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a  . Otherwise.  **
107d0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
107e0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75  olumnNames() wou
107f0 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75  ld have picked u
10800 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20  p the error. .  
10810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
10820 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26  b->azModuleArg &
10830 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  & pTab->azModule
10840 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65  Arg[0] );.  asse
10850 72 74 28 20 70 54 61 62 2d 3e 70 56 74 61 62 20  rt( pTab->pVtab 
10860 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
10870 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
10880 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
10890 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
108a0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  .  ** output var
108b0 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a  iables to zero..
108c0 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74    **.  ** aConst
108d0 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69  raint[].usable i
108e0 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74  s true for const
108f0 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65  raints where the
10900 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a   right-hand.  **
10910 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
10920 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
10930 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
10940 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
10950 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
10960 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
10970 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
10980 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
10990 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
109a0 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20         column = 
109b0 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  expr.  **.  ** a
109c0 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  nd we are evalua
109d0 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65  ting a join, the
109e0 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
109f0 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20   on column is . 
10a00 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
10a10 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
10a20 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
10a30 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
10a40 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  t.  ** of the ta
10a50 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
10a60 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  olumn..  **.  **
10a70 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
10a80 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  s[] array contai
10a90 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
10aa0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ll constraints. 
10ab0 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65   ** on the curre
10ac0 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20  nt table.  That 
10ad0 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65  way we only have
10ae0 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f   to compute it o
10af0 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  nce.  ** even th
10b00 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72  ough we might tr
10b10 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65  y to pick the be
10b20 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c  st index multipl
10b30 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f  e times..  ** Fo
10b40 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
10b50 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
10b60 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
10b70 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
10b80 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62   ** join might b
10b90 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77  e different so w
10ba0 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70  e have to recomp
10bb0 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66  ute the usable f
10bc0 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69  lag.  ** each ti
10bd0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  me..  */.  pIdxC
10be0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
10bf0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
10c00 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
10c10 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
10c20 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
10c30 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
10c40 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
10c50 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
10c60 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10c70 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
10c80 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
10c90 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
10ca0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
10cb0 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
10cc0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70  ns->usable =  (p
10cd0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10ce0 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
10cf0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d   ?1:0;.  }.  mem
10d00 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
10d10 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
10d20 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  *pIdxInfo->nCons
10d30 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70  traint);.  if( p
10d40 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
10d50 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
10d60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
10d70 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
10d80 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d  .  }.  pIdxInfo-
10d90 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  >idxStr = 0;.  p
10da0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
10db0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
10dc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
10dd0 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  r = 0;.  pIdxInf
10de0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
10df0 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64  ed = 0;.  /* ((d
10e00 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65  ouble)2) In case
10e10 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
10e20 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
10e30 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d  . */.  pIdxInfo-
10e40 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
10e50 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
10e60 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20  / ((double)2);. 
10e70 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78   nOrderBy = pIdx
10e80 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a  Info->nOrderBy;.
10e90 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20    if( !pOrderBy 
10ea0 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
10eb0 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >nOrderBy = 0;. 
10ec0 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65   }..  if( vtabBe
10ed0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
10ee0 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20  pTab, pIdxInfo) 
10ef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10f00 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73   }..  /* The cos
10f10 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
10f20 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
10f30 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
10f40 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74  L (the.  ** init
10f50 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
10f60 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
10f70 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
10f80 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f  hen the.  ** (co
10f90 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
10fa0 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
10fb0 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20  ever be true..  
10fc0 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64  ** .  ** Use "(d
10fd0 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64  ouble)2" instead
10fe0 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73   of "2.0" in cas
10ff0 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  e OMIT_FLOATING_
11000 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64  POINT .  ** is d
11010 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  efined..  */.  i
11020 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
11030 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c  BL/((double)2))<
11040 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
11050 74 65 64 43 6f 73 74 20 29 7b 0a 20 20 20 20 70  tedCost ){.    p
11060 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53  Cost->rCost = (S
11070 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
11080 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65  double)2));.  }e
11090 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  lse{.    pCost->
110a0 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f  rCost = pIdxInfo
110b0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b  ->estimatedCost;
110c0 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  .  }.  pCost->pl
110d0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20  an.u.pVtabIdx = 
110e0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
110f0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
11100 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
11110 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
11120 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
11130 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f  DERBY;.  }.  pCo
11140 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30  st->plan.nEq = 0
11150 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  ;.  pIdxInfo->nO
11160 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
11170 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  y;..  /* Try to 
11180 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69  find a more effi
11190 63 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74  cient access pat
111a0 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75  tern by using mu
111b0 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20  ltiple indexes. 
111c0 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20   ** to optimize 
111d0 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e  an OR expression
111e0 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
111f0 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a  E clause. .  */.
11200 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e    bestOrClauseIn
11210 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
11220 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
11230 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
11240 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
11250 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11260 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
11270 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
11280 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
11290 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
112a0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
112b0 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
112c0 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
112d0 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
112e0 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
112f0 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  plied as the.** 
11300 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  last parameter..
11310 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
11320 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e   cost plan wins.
11330 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
11340 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
11350 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
11360 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
11370 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
11380 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
11390 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 6c   the selected pl
113a0 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  an..** Factors t
113b0 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
113c0 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
113d0 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
113e0 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
113f0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
11400 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
11410 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
11420 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
11430 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
11440 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
11450 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
11460 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
11470 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
11480 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
11490 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
114a0 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
114b0 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
114c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
114d0 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
114e0 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ED BY clause (pS
114f0 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
11500 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
11510 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
11520 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
11530 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
11540 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
11550 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
11560 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
11570 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73   no such plan is
11580 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
11590 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
115a0 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
115b0 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69  DBL. If a plan i
115c0 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65  s found that use
115d0 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  s the named inde
115e0 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  x, .** then the 
115f0 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74  cost is calculat
11600 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20  ed in the usual 
11610 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  way..**.** If a 
11620 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
11630 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  se (pSrc->notInd
11640 65 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74  exed!=0) was att
11650 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
11660 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45  le .** in the SE
11670 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
11680 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
11690 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
116a0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a  However, the .**
116b0 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d   selected plan m
116c0 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64  ay still take ad
116d0 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 74  vantage of the t
116e0 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e 20 72  ables built-in r
116f0 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  owid.** index..*
11700 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
11710 73 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  stBtreeIndex(.  
11720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11740 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
11750 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
11760 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
11770 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11780 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
11790 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
117a0 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
117b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
117c0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
117d0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
117e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
117f0 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
11800 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
11810 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
11820 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
11830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
11840 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11850 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
11860 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
11870 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
11880 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20  ery plan */.){. 
11890 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
118a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
118b0 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
118c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
118d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  e */.  int iCur 
118e0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
118f0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
11900 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
11910 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
11920 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11940 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
11950 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
11960 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11980 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
11990 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
119a0 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 20  .  int wsFlags; 
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
119c0 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
119d0 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a  ed with pProbe *
119e0 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  /.  int nEq;    
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
11a10 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
11a20 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  s */.  int eqTer
11a30 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
11a40 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61     /* Mask of va
11a50 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
11a60 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62  rators */.  doub
11a70 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
11a80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
11a90 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
11aa0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
11ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ac0 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
11ad0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
11ae0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11af0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11b10 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
11b20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
11b30 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
11b40 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e   notReady=%llx\n
11b50 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
11b60 4e 61 6d 65 2c 6e 6f 74 52 65 61 64 79 29 29 3b  Name,notReady));
11b70 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63  .  pProbe = pSrc
11b80 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
11b90 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
11ba0 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 70 50  ndexed ){.    pP
11bb0 72 6f 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  robe = 0;.  }.. 
11bc0 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
11bd0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20   has no indices 
11be0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
11bf0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68   terms in the wh
11c00 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  ere.  ** clause 
11c10 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
11c20 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65  e ROWID, then we
11c30 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
11c40 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61  ble to do.  ** a
11c50 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
11c60 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
11c70 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  scan on this tab
11c80 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  le.  We might as
11c90 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69  .  ** well put i
11ca0 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a  t first in the j
11cb0 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74  oin order.  That
11cc0 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69 74   way, perhaps it
11cd0 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66   can be.  ** ref
11ce0 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72  erenced by other
11cf0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
11d00 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  oin..  */.  mems
11d10 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a  et(pCost, 0, siz
11d20 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20  eof(*pCost));.  
11d30 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26  if( pProbe==0 &&
11d40 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70  .     findTerm(p
11d50 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
11d60 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
11d70 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
11d80 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20  O_GE,0)==0 &&.  
11d90 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20     (pOrderBy==0 
11da0 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f  || !sortableByRo
11db0 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72  wid(iCur, pOrder
11dc0 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  By, pWC->pMaskSe
11dd0 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20  t, &rev)) ){.   
11de0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
11df0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
11e00 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b  _ReverseOrder ){
11e10 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 70  .      /* For ap
11e20 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e  plication testin
11e30 67 2c 20 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65  g, randomly reve
11e40 72 73 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rse the output o
11e50 72 64 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a  rder for.      *
11e60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
11e70 6e 74 73 20 74 68 61 74 20 6f 6d 69 74 20 74 68  nts that omit th
11e80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11e90 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  e.  This will he
11ea0 6c 70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 66  lp.      ** to f
11eb0 69 6e 64 20 63 61 73 65 73 20 77 68 65 72 65 0a  ind cases where.
11ec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
11ed0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
11ee0 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
11ef0 52 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  RSE;.    }.    r
11f00 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 43 6f  eturn;.  }.  pCo
11f10 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49  st->rCost = SQLI
11f20 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
11f30 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f  * Check for a ro
11f40 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
11f50 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74  d IN (...) const
11f60 72 61 69 6e 74 73 2e 20 49 66 20 74 68 65 72 65  raints. If there
11f70 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20 49 4e 44   was.  ** an IND
11f80 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61  EXED BY clause a
11f90 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
11fa0 74 61 62 6c 65 2c 20 73 6b 69 70 20 74 68 69 73  table, skip this
11fb0 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 69 66   step..  */.  if
11fc0 28 20 21 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  ( !pSrc->pIndex 
11fd0 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ){.    pTerm = f
11fe0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
11ff0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
12000 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
12010 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20  ;.    if( pTerm 
12020 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
12030 45 78 70 72 3b 0a 20 20 20 20 20 20 70 43 6f 73  Expr;.      pCos
12040 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
12050 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  = WHERE_ROWID_EQ
12060 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
12070 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
12080 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
12090 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c  /* Rowid== is al
120a0 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69  ways the best pi
120b0 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72  ck.  Look no fur
120c0 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f  ther.  Because o
120d0 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nly.        ** a
120e0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
120f0 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
12100 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
12110 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
12120 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
12130 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
12140 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45  E_ROWID_EQ | WHE
12150 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
12160 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
12170 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
12180 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
12190 20 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e   best is rowid\n
121a0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  "));.        pCo
121b0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 30 3b 0a 20  st->rCost = 0;. 
121c0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52         pCost->nR
121d0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ow = 1;.        
121e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 65  return;.      }e
121f0 6c 73 65 20 69 66 28 20 21 45 78 70 72 48 61 73  lse if( !ExprHas
12200 50 72 6f 70 65 72 74 79 28 28 70 45 78 70 72 20  Property((pExpr 
12210 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2c  = pTerm->pExpr),
12220 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 0a   EP_xIsSelect) .
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12240 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 0a  pExpr->x.pList .
12250 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12260 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49   /* Rowid IN (LI
12270 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f  ST): cost is Nlo
12280 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  gN where N is th
12290 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74  e number of list
122a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  .        ** elem
122b0 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
122c0 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
122d0 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 70   pCost->nRow = p
122e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
122f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 43  Expr;.        pC
12300 6f 73 74 2d 3e 72 43 6f 73 74 20 2a 3d 20 65 73  ost->rCost *= es
12310 74 4c 6f 67 28 70 43 6f 73 74 2d 3e 72 43 6f 73  tLog(pCost->rCos
12320 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
12330 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  .        /* Rowi
12340 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63  d IN (SELECT): c
12350 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
12360 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
12370 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
12380 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
12390 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
123a0 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
123b0 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
123c0 6d 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  mate.        ** 
123d0 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61  that value so ma
123e0 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e  ke a wild guess.
123f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73   */.        pCos
12400 74 2d 3e 6e 52 6f 77 20 3d 20 31 30 30 3b 0a 20  t->nRow = 100;. 
12410 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
12420 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 20  ost = 200;.     
12430 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
12440 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
12450 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  IN cost: %.9g\n"
12460 2c 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29 29  , pCost->rCost))
12470 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
12480 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 63  * Estimate the c
12490 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73  ost of a table s
124a0 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  can.  If we do n
124b0 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79  ot know how many
124c0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
124d0 61 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  are in the table
124e0 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20  , use 1 million 
124f0 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20 20 20  as a guess..    
12500 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50  */.    cost = pP
12510 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61  robe ? pProbe->a
12520 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30  iRowEst[0] : 100
12530 30 30 30 30 3b 0a 20 20 20 20 57 48 45 52 45 54  0000;.    WHERET
12540 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
12550 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
12560 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
12570 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  ;.    wsFlags = 
12580 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
12590 45 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 68 65  E;.  .    /* Che
125a0 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ck for constrain
125b0 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66  ts on a range of
125c0 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62   rowids in a tab
125d0 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  le scan..    */.
125e0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
125f0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
12600 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
12610 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
12620 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  WO_GE, 0);.    i
12630 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
12640 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
12650 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
12660 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
12670 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
12680 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
12690 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
126a0 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
126b0 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
126c0 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d   rowid<EXPR elim
126d0 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
126e0 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s of rows */.   
126f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
12700 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
12710 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
12720 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
12730 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
12740 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
12750 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
12760 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
12770 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e  uess that rowid>
12780 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
12790 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
127a0 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ws */.      }.  
127b0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
127c0 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65  "... rowid range
127d0 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
127e0 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
127f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12800 20 20 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a     wsFlags = 0;.
12810 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 20 3d      }.    nRow =
12820 20 63 6f 73 74 3b 0a 20 20 0a 20 20 20 20 2f 2a   cost;.  .    /*
12830 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73 63   If the table sc
12840 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  an does not sati
12850 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
12860 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73   clause, increas
12870 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73  e.    ** the cos
12880 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
12890 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
128a0 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
128b0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
128c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72  ){.      if( sor
128d0 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
128e0 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43  r, pOrderBy, pWC
128f0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76  ->pMaskSet, &rev
12900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  ) ){.        wsF
12910 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
12920 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
12930 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  D_RANGE;.       
12940 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20   if( rev ){.    
12950 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
12960 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
12970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
12990 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
129a0 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
129b0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
129c0 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
129d0 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
129e0 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
129f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
12a00 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
12a10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
12a20 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20  everseOrder ){. 
12a30 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c       /* For appl
12a40 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c  ication testing,
12a50 20 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73   randomly revers
12a60 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
12a70 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  er for.      ** 
12a80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12a90 73 20 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20  s that omit the 
12aa0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
12ab0 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70    This will help
12ac0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e  .      ** to fin
12ad0 64 20 63 61 73 65 73 20 77 68 65 72 65 0a 20 20  d cases where.  
12ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 73 46      */.      wsF
12af0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
12b00 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
12b10 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
12b20 69 73 20 63 61 73 65 20 69 66 20 69 74 20 69 73  is case if it is
12b30 20 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72   the best so far
12b40 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74   */.    if( cost
12b50 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  <pCost->rCost ){
12b60 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
12b70 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
12b80 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20    pCost->nRow = 
12b90 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73  nRow;.      pCos
12ba0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
12bb0 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 7d  = wsFlags;.    }
12bc0 0a 20 20 7d 0a 0a 20 20 62 65 73 74 4f 72 43 6c  .  }..  bestOrCl
12bd0 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
12be0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
12bf0 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c  Ready, pOrderBy,
12c00 20 70 43 6f 73 74 29 3b 0a 0a 20 20 2f 2a 20 49   pCost);..  /* I
12c10 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65  f the pSrc table
12c20 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
12c30 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
12c40 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e  IN then we may n
12c50 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69  ot.  ** use an i
12c60 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20  ndex to satisfy 
12c70 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
12c80 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c  nts on that tabl
12c90 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a  e.  This is.  **
12ca0 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
12cb0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
12cc0 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  ing NULL if the 
12cd0 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d  table does not m
12ce0 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69  atch -.  ** a ci
12cf0 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68  rcumstance which
12d00 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
12d10 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76  t help us discov
12d20 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37  er.  Ticket #217
12d30 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  7..  */.  if( (p
12d40 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
12d50 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
12d60 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
12d70 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
12d80 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65 72 6d  else{.    eqTerm
12d90 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
12da0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20  IN|WO_ISNULL;.  
12db0 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20  }..  /* Look at 
12dc0 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  each index..  */
12dd0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
12de0 64 65 78 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  dex ){.    pProb
12df0 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
12e00 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 70 50  ;.  }.  for(; pP
12e10 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 28 70 53  robe; pProbe=(pS
12e20 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20 30 20 3a  rc->pIndex ? 0 :
12e30 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 29   pProbe->pNext))
12e40 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d  {.    double inM
12e50 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 20 20  ultiplier = 1;  
12e60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75  /* Number of equ
12e70 61 6c 69 74 79 20 6c 6f 6f 6b 2d 75 70 73 20 6e  ality look-ups n
12e80 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
12e90 20 69 6e 4d 75 6c 74 49 73 45 73 74 20 3d 20 30   inMultIsEst = 0
12ea0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
12eb0 66 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 69  f inMultiplier i
12ec0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 2a 2f  s an estimate */
12ed0 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ..    WHERETRACE
12ee0 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a  (("... index %s:
12ef0 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  \n", pProbe->zNa
12f00 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  me));..    /* Co
12f10 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
12f20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
12f30 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
12f40 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a  satisfied.    **
12f50 20 62 79 20 78 3d 45 58 50 52 20 6f 72 20 78 20   by x=EXPR or x 
12f60 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
12f70 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  nts or x IN (...
12f80 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  ) constraints.. 
12f90 20 20 20 2a 2a 20 46 6f 72 20 61 20 74 65 72 6d     ** For a term
12fa0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 45   of the form x=E
12fb0 58 50 52 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  XPR or x IS NULL
12fc0 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
12fd0 20 64 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69   do .    ** a si
12fe0 6e 67 6c 65 20 62 69 6e 61 72 79 20 73 65 61 72  ngle binary sear
12ff0 63 68 2e 20 20 42 75 74 20 66 6f 72 20 78 20 49  ch.  But for x I
13000 4e 20 28 2e 2e 2e 29 20 77 65 20 68 61 76 65 20  N (...) we have 
13010 74 6f 20 64 6f 20 61 0a 20 20 20 20 2a 2a 20 6e  to do a.    ** n
13020 75 6d 62 65 72 20 6f 66 20 62 69 6e 61 72 79 20  umber of binary 
13030 73 65 61 72 63 68 65 64 0a 20 20 20 20 2a 2a 20  searched.    ** 
13040 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d  equal to the num
13050 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
13060 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
13070 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
13080 20 20 2a 2a 20 54 68 65 20 69 6e 4d 75 6c 74 69    ** The inMulti
13090 70 6c 65 72 20 76 61 72 69 61 62 6c 65 20 77 69  pler variable wi
130a0 74 68 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  th try to estima
130b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
130c0 0a 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73  .    ** binary s
130d0 65 61 72 63 68 65 73 20 6e 65 65 64 65 64 2e 0a  earches needed..
130e0 20 20 20 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61      */.    wsFla
130f0 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  gs = 0;.    for(
13100 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e  i=0; i<pProbe->n
13110 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
13120 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
13130 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  be->aiColumn[i];
13140 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
13150 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
13160 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
13170 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50 72 6f  eqTermMask, pPro
13180 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  be);.      if( p
13190 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
131a0 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
131b0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
131c0 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
131d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
131e0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
131f0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13200 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
13210 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
13220 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
13230 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
13240 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13250 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
13260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
13270 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32  nMultiplier *= 2
13280 35 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  5;.          inM
13290 75 6c 74 49 73 45 73 74 20 3d 20 31 3b 0a 20 20  ultIsEst = 1;.  
132a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
132b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
132c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
132d0 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70  ltiplier *= pExp
132e0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
132f0 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
13300 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13310 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13320 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
13330 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
13340 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
13350 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _NULL;.      }. 
13360 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 20 3d 20     }.    nRow = 
13370 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
13380 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69  [i] * inMultipli
13390 65 72 3b 0a 20 20 20 20 2f 2a 20 49 66 20 69 6e  er;.    /* If in
133a0 4d 75 6c 74 69 70 6c 69 65 72 20 69 73 20 61 6e  Multiplier is an
133b0 20 65 73 74 69 6d 61 74 65 20 61 6e 64 20 74 68   estimate and th
133c0 61 74 20 65 73 74 69 6d 61 74 65 20 72 65 73 75  at estimate resu
133d0 6c 74 73 20 69 6e 20 61 6e 0a 20 20 20 20 2a 2a  lts in an.    **
133e0 20 6e 52 6f 77 20 69 74 20 74 68 61 74 20 69 73   nRow it that is
133f0 20 6d 6f 72 65 20 74 68 61 6e 20 68 61 6c 66 20   more than half 
13400 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
13410 6e 20 74 68 65 20 74 61 62 6c 65 2c 0a 20 20 20  n the table,.   
13420 20 2a 2a 20 74 68 65 6e 20 72 65 64 75 63 65 20   ** then reduce 
13430 69 6e 4d 75 6c 74 69 70 6c 65 72 20 2a 2f 0a 20  inMultipler */. 
13440 20 20 20 69 66 28 20 69 6e 4d 75 6c 74 49 73 45     if( inMultIsE
13450 73 74 20 26 26 20 6e 52 6f 77 2a 32 20 3e 20 70  st && nRow*2 > p
13460 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
13470 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  0] ){.      nRow
13480 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
13490 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20  Est[0]/2;.      
134a0 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 6e  inMultiplier = n
134b0 52 6f 77 2f 70 50 72 6f 62 65 2d 3e 61 69 52 6f  Row/pProbe->aiRo
134c0 77 45 73 74 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  wEst[i];.    }. 
134d0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2b     cost = nRow +
134e0 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2a 65 73   inMultiplier*es
134f0 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e 61 69 52  tLog(pProbe->aiR
13500 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 6e  owEst[0]);.    n
13510 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20  Eq = i;.    if( 
13520 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
13530 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 45 71 3d  =OE_None && nEq=
13540 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
13550 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
13560 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
13570 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
13580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13590 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
135a0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a  _COLUMN_NULL );.
135b0 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
135c0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
135d0 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
135e0 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a  MN_NULL))==0 ){.
135f0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
13600 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
13610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13620 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
13630 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e  ...... nEq=%d in
13640 4d 75 6c 74 3d 25 2e 39 67 20 6e 52 6f 77 3d 25  Mult=%.9g nRow=%
13650 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22  .9g cost=%.9g\n"
13660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13670 20 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c    nEq, inMultipl
13680 69 65 72 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 29  ier, nRow, cost)
13690 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  );..    /* Look 
136a0 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  for range constr
136b0 61 69 6e 74 73 2e 20 20 41 73 73 75 6d 65 20 74  aints.  Assume t
136c0 68 61 74 20 65 61 63 68 20 72 61 6e 67 65 20 63  hat each range c
136d0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a  onstraint.    **
136e0 20 6d 61 6b 65 73 20 74 68 65 20 73 65 61 72 63   makes the searc
136f0 68 20 73 70 61 63 65 20 31 2f 33 72 64 20 73 6d  h space 1/3rd sm
13700 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  aller..    */.  
13710 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65    if( nEq<pProbe
13720 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
13730 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
13740 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
13750 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
13760 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
13770 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
13780 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
13790 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
137a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
137b0 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  rm ){.        ws
137c0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
137d0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
137e0 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
137f0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
13800 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
13810 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_LE, pProbe) )
13820 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
13830 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
13840 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
13850 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20    cost /= 3;.   
13860 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33         nRow /= 3
13870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13880 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
13890 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
138a0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
138b0 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
138c0 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
138d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
138e0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
138f0 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20   cost /= 3;.    
13900 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b        nRow /= 3;
13910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13920 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
13930 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64  ...... range red
13940 75 63 65 73 20 6e 52 6f 77 20 74 6f 20 25 2e 39  uces nRow to %.9
13950 67 20 61 6e 64 20 63 6f 73 74 20 74 6f 20 25 2e  g and cost to %.
13960 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  9g\n",.         
13970 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 2c             nRow,
13980 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
13990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
139a0 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61  dd the additiona
139b0 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  l cost of sortin
139c0 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66  g if that is a f
139d0 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  actor..    */.  
139e0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
139f0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46  {.      if( (wsF
13a00 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
13a10 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
13a20 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 0a 20  LUMN_NULL))==0. 
13a30 20 20 20 20 20 20 26 26 20 69 73 53 6f 72 74 69        && isSorti
13a40 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70  ngIndex(pParse,p
13a50 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72  WC->pMaskSet,pPr
13a60 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  obe,iCur,pOrderB
13a70 79 2c 6e 45 71 2c 26 72 65 76 29 0a 20 20 20 20  y,nEq,&rev).    
13a80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
13a90 20 77 73 46 6c 61 67 73 3d 3d 30 20 29 7b 0a 20   wsFlags==0 ){. 
13aa0 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
13ab0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
13ac0 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d  RANGE;.        }
13ad0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
13ae0 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
13af0 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  Y;.        if( r
13b00 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
13b10 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13b20 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13b30 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13b40 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  .        cost +=
13b50 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
13b60 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  t);.        WHER
13b70 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
13b80 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61 73 65  orderby increase
13b90 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
13ba0 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
13bb0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13bc0 20 77 73 46 6c 61 67 73 21 3d 30 20 26 26 20 28   wsFlags!=0 && (
13bd0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
13be0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
13bf0 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
13c00 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c       /* For appl
13c10 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c  ication testing,
13c20 20 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73   randomly revers
13c30 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
13c40 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  er for.      ** 
13c50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13c60 73 20 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20  s that omit the 
13c70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
13c80 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70    This will help
13c90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e  .      ** to fin
13ca0 64 20 63 61 73 65 73 20 77 68 65 72 65 0a 20 20  d cases where.  
13cb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 73 46      */.      wsF
13cc0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
13cd0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
13ce0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13cf0 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20  e if we can get 
13d00 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20  away with using 
13d10 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77  just the index w
13d20 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76  ithout.    ** ev
13d30 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74  er reading the t
13d40 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69  able.  If that i
13d50 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
13d60 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a   halve the.    *
13d70 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69  * cost of this i
13d80 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
13d90 20 69 66 28 20 77 73 46 6c 61 67 73 20 26 26 20   if( wsFlags && 
13da0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20  pSrc->colUsed < 
13db0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
13dc0 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20  BMS-1)) ){.     
13dd0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
13de0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
13df0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
13e00 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65  or(j=0; j<pProbe
13e10 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
13e20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
13e30 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
13e40 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
13e50 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
13e60 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
13e70 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
13e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e90 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
13ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
13eb0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
13ec0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63  _ONLY;.        c
13ed0 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  ost /= 2;.      
13ee0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
13ef0 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72  ..... idx-only r
13f00 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
13f10 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
13f20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
13f30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
13f40 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64  dex has achieved
13f50 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
13f60 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73   so far, then us
13f70 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
13f80 20 69 66 28 20 77 73 46 6c 61 67 73 21 3d 30 20   if( wsFlags!=0 
13f90 26 26 20 63 6f 73 74 20 3c 20 70 43 6f 73 74 2d  && cost < pCost-
13fa0 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  >rCost ){.      
13fb0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63  pCost->rCost = c
13fc0 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  ost;.      pCost
13fd0 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ->nRow = nRow;. 
13fe0 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
13ff0 2e 77 73 46 6c 61 67 73 20 3d 20 77 73 46 6c 61  .wsFlags = wsFla
14000 67 73 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  gs;.      pCost-
14010 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b  >plan.nEq = nEq;
14020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14030 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
14040 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
14050 45 44 20 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  ED );.      pCos
14060 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d  t->plan.u.pIdx =
14070 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 7d 0a 20   pProbe;.    }. 
14080 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
14090 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a  the best result.
140a0 20 20 2a 2f 0a 20 20 70 43 6f 73 74 2d 3e 70 6c    */.  pCost->pl
140b0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71  an.wsFlags |= eq
140c0 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 57 48 45 52  TermMask;.  WHER
140d0 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e  ETRACE(("best in
140e0 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
140f0 25 2e 39 67 2c 20 6e 72 6f 77 3d 25 2e 39 67 2c  %.9g, nrow=%.9g,
14100 20 77 73 46 6c 61 67 73 3d 25 78 2c 20 6e 45 71   wsFlags=%x, nEq
14110 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
14120 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46  (pCost->plan.wsF
14130 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
14140 45 58 45 44 29 21 3d 30 20 3f 0a 20 20 20 20 20  EXED)!=0 ?.     
14150 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
14160 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
14170 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 70 43  e : "(none)", pC
14180 6f 73 74 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  ost->nRow,.     
14190 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c     pCost->rCost,
141a0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
141b0 6c 61 67 73 2c 20 70 43 6f 73 74 2d 3e 70 6c 61  lags, pCost->pla
141c0 6e 2e 6e 45 71 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  n.nEq));.}../*.*
141d0 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
141e0 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
141f0 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e  ing table pSrc->
14200 70 54 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a  pTab. Write the.
14210 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c  ** best query pl
14220 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20  an and its cost 
14230 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f  into the WhereCo
14240 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69  st object suppli
14250 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61  ed .** as the la
14260 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  st parameter. Th
14270 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
14280 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f  calculate the co
14290 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65  st of.** both re
142a0 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74  al and virtual t
142b0 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73  able scans..*/.s
142c0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
142d0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
142e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
142f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
14300 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14310 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
14320 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
14330 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14340 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
14350 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
14360 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
14370 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
14380 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
14390 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
143a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
143b0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
143c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
143d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
143e0 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
143f0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
14400 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
14410 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
14420 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
14430 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
14440 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 49 73 56   */.){.  if( IsV
14450 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
14460 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14470 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20  3_index_info *p 
14480 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72  = 0;.    bestVir
14490 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
144a0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
144b0 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c  Ready, pOrderBy,
144c0 20 70 43 6f 73 74 2c 20 26 70 29 3b 0a 20 20 20   pCost, &p);.   
144d0 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72   if( p->needToFr
144e0 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
144f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14500 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  ->idxStr);.    }
14510 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
14520 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
14530 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14540 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
14550 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
14560 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
14570 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20  erBy, pCost);.  
14580 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  }.}../*.** Disab
14590 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
145a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
145b0 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
145c0 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
145d0 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
145e0 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
145f0 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
14600 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
14610 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
14620 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
14630 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
14640 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
14650 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
14660 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
14670 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
14680 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14690 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
146a0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
146b0 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
146c0 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
146d0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
146e0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
146f0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
14700 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
14710 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
14720 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
14730 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
14740 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
14750 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
14760 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
14770 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
14780 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
14790 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
147a0 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
147b0 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
147c0 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
147d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
147e0 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
147f0 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
14800 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
14810 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
14820 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
14830 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
14840 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
14850 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
14860 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
14870 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
14880 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
14890 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
148a0 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
148b0 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
148c0 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
148d0 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
148e0 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
148f0 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
14900 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
14910 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
14920 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
14930 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
14940 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
14950 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
14960 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
14970 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
14980 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
14990 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
149a0 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
149b0 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
149c0 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
149d0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
149e0 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
149f0 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
14a00 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
14a10 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
14a20 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
14a30 6d 0a 20 20 20 20 20 20 26 26 20 41 4c 57 41 59  m.      && ALWAY
14a40 53 28 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  S((pTerm->wtFlag
14a50 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
14a60 3d 30 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c  =0).      && (pL
14a70 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
14a80 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
14a90 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
14aa0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
14ab0 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
14ac0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
14ad0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
14ae0 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
14af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
14b00 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
14b10 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
14b20 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
14b30 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
14b40 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
14b50 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
14b60 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
14b70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
14b80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14b90 2a 2a 20 41 70 70 6c 79 20 74 68 65 20 61 66 66  ** Apply the aff
14ba0 69 6e 69 74 69 65 73 20 61 73 73 6f 63 69 61 74  inities associat
14bb0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
14bc0 74 20 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 69  t n columns of i
14bd0 6e 64 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f 20  ndex.** pIdx to 
14be0 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68  the values in th
14bf0 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
14c00 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 0a  arting at base..
14c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
14c20 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
14c30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14c40 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
14c50 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
14c60 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
14c70 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14c80 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 61 73 73  ->pVdbe;.    ass
14c90 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
14ca0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14cb0 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
14cc0 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
14cd0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
14ce0 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
14cf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14d00 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
14d10 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
14d20 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
14d30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14d40 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
14d50 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
14d60 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14d70 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
14d80 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
14d90 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
14da0 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
14db0 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
14dc0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
14dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
14de0 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
14df0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
14e00 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
14e10 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
14e20 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
14e30 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
14e40 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
14e50 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
14e60 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
14e70 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
14e80 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
14e90 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
14ea0 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
14eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
14ec0 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
14ed0 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
14ee0 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
14ef0 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
14f00 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
14f10 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
14f20 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
14f30 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14f40 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
14f50 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
14f60 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
14f70 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
14f80 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
14f90 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
14fa0 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
14fb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14fc0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
14fd0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  on */.  int iTar
14fe0 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
14ff0 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
15000 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
15010 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
15020 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
15030 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
15040 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15050 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
15080 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
15090 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
150a0 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
150b0 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
150c0 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
150d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
150e0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
150f0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
15100 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
15110 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
15120 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
15130 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
15140 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15150 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
15160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15170 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
15180 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
15190 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
151a0 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
151b0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20  Loop *pIn;..    
151c0 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
151d0 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65  TK_IN );.    iRe
151e0 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
151f0 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
15200 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
15210 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20  se, pX, 0);.    
15220 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
15230 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
15240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15250 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
15260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
15270 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
15280 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
15290 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
152a0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
152b0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
152c0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
152d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152e0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
152f0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
15300 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
15310 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
15320 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
15330 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
15340 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
15350 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
15380 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
15390 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
153a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
153b0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
153c0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
153d0 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
153e0 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
153f0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
15400 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15410 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15420 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15430 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15440 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15450 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15460 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15470 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
15480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15490 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
154a0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
154b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
154c0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
154d0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
154e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
15500 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  ull, iReg);.    
15510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
15520 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20  vel->u.in.nIn = 
15530 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
15540 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
15550 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
15560 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  ;.  return iReg;
15570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15580 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
15590 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
155a0 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
155b0 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
155c0 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65  ndex.  The value
155d0 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
155e0 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f  aints are left o
155f0 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  n the stack..**.
15600 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
15610 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
15620 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
15630 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
15640 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
15650 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15660 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
15670 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
15680 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
15690 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
156a0 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
156b0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
156c0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
156d0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
156e0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
156f0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
15700 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
15710 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
15720 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
15730 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15740 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
15750 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
15760 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
15770 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
15780 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
15790 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
157a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
157b0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
157c0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
157d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
157e0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
157f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
15800 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
15810 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
15820 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
15830 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
15840 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
15850 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
15860 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15870 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
15880 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
15890 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
158a0 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
158b0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
158c0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
158d0 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
158e0 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
158f0 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
15900 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
15910 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
15920 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
15930 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
15940 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
15950 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
15960 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
15970 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
15980 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
15990 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
159a0 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
159b0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
159c0 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
159d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
159e0 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
159f0 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
15a00 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
15a10 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l.** use..*/.sta
15a20 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
15a30 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
15a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15a50 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15a60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15a70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
15a80 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
15a90 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
15aa0 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
15ab0 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
15ac0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
15ad0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
15ae0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
15af0 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
15b00 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
15b10 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
15b20 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
15b30 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20   int nExtraReg  
15b40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15b50 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
15b60 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
15b70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20  */.){.  int nEq 
15b80 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
15b90 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d  Eq;   /* The num
15ba0 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
15bb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
15bc0 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ode */.  Vdbe *v
15bd0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15be0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d  ;      /* The vm
15bf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15c00 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
15c10 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
15c20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
15c30 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
15c40 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
15c50 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65    int iCur = pLe
15c60 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20  vel->iTabCur;   
15c70 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
15c80 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
15c90 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15cb0 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
15cc0 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  aint term */.  i
15cd0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15cf0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15d00 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
15d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15d60 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
15d70 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  locate */..  /* 
15d80 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
15d90 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
15da0 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
15db0 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
15dc0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
15dd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
15de0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
15df0 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65  ;.  pIdx = pLeve
15e00 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
15e10 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
15e20 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
15e30 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
15e40 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
15e50 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72  e them..  */.  r
15e60 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
15e70 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65  >nMem + 1;.  nRe
15e80 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  g = pLevel->plan
15e90 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67  .nEq + nExtraReg
15ea0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
15eb0 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 2f 2a 20   += nReg;..  /* 
15ec0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
15ed0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15ee0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
15ef0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
15f00 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
15f10 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
15f20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69     int r1;.    i
15f30 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
15f40 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
15f50 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
15f60 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
15f70 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70  Ready, pLevel->p
15f80 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64  lan.wsFlags, pId
15f90 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  x);.    if( NEVE
15fa0 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72  R(pTerm==0) ) br
15fb0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
15fc0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
15fd0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
15fe0 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f  0 );.    r1 = co
15ff0 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
16000 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
16010 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29  evel, regBase+j)
16020 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
16030 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
16040 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
16050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16060 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16070 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
16080 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
16090 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
160a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
160b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
160c0 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
160d0 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
160e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
160f0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
16100 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
16110 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
16120 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
16130 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
16140 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
16150 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
16160 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
16170 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
16180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16190 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
161a0 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
161b0 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
161c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  }.  return regBa
161d0 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  se;.}../*.** Gen
161e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
161f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16200 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
16210 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
16220 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
16230 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
16240 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
16250 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
16260 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
16270 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
16280 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
16290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
162a0 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
162b0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
162c0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
162d0 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
162e0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
162f0 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
16300 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
16310 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
16320 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
16330 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
16340 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69  iteInt.h */.  Bi
16350 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
16360 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
16370 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
16380 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
16390 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
163a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
163b0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
163c0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
163d0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
163e0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
163f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
16400 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
16410 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
16420 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
16430 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
16440 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
16450 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
16460 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
16470 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
16480 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
16490 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
164a0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
164b0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
164c0 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
164d0 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
164e0 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
164f0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16500 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
16510 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
16520 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
16530 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
16540 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
16550 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
16560 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
16570 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
16580 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
165b0 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  text */.  Vdbe *
165c0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
165d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
165e0 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
165f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
16600 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
16610 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
16620 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
16630 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
16640 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
16650 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16670 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
16680 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
16690 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
166a0 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
166b0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
166c0 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
166d0 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
166e0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
166f0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
16700 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
16710 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
16720 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
16730 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
16740 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
16750 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
16760 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
16770 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20  returning */..  
16780 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
16790 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70  >pParse;.  v = p
167a0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
167b0 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57  pWC = pWInfo->pW
167c0 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  C;.  pLevel = &p
167d0 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
167e0 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
167f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
16800 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
16810 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
16820 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
16830 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
16840 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
16850 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
16860 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  =0;.  omitTable 
16870 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
16880 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16890 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
168a0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
168b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
168c0 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
168d0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
168e0 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
168f0 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
16900 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
16910 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
16920 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
16930 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
16940 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
16950 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
16960 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
16970 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
16980 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
16990 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
169a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
169b0 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
169c0 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
169d0 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
169e0 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
169f0 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
16a00 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
16a10 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
16a20 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
16a30 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
16a40 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
16a50 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
16a60 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
16a70 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
16a80 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
16a90 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
16aa0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
16ab0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
16ac0 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
16ad0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16ae0 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
16af0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
16b00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16b10 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
16b20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16b30 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
16b40 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16b50 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
16b60 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
16b70 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
16b80 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
16b90 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
16ba0 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
16bb0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
16bc0 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
16bd0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
16be0 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
16bf0 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
16c00 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
16c10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
16c20 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
16c30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
16c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
16c60 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
16c70 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
16c80 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
16c90 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
16ca0 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
16cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16cc0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16cd0 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d  .  if(  (pLevel-
16ce0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
16cf0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
16d00 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
16d10 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
16d20 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
16d30 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
16d40 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
16d50 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
16d60 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
16d70 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
16d80 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
16d90 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
16da0 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
16db0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
16dc0 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70  fo *pVtabIdx = p
16dd0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56  Level->plan.u.pV
16de0 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20  tabIdx;.    int 
16df0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56  nConstraint = pV
16e00 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  tabIdx->nConstra
16e10 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  int;.    struct 
16e20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
16e30 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
16e40 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  aUsage =.       
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
16e80 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
16e90 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  age;.    const s
16ea0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
16eb0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
16ec0 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20  aConstraint =.  
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
16f00 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
16f10 69 6e 74 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d  int;..    iReg =
16f20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16f30 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
16f40 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
16f50 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
16f60 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
16f70 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
16f80 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
16f90 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16fa0 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
16fb0 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
16fc0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
16fd0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69  aConstraint[k].i
16fe0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
16ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17000 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57  rCode(pParse, pW
17010 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
17020 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b  r->pRight, iReg+
17030 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j+1);.          
17040 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
17050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17060 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( k==nConstrain
17070 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
17080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
170a0 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e  eger, pVtabIdx->
170b0 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
170c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
170e0 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
170f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
17110 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
17120 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61  rBrk, iReg, pVta
17130 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  bIdx->idxStr,.  
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
17160 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
17170 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
17180 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56  _STATIC);.    pV
17190 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
171a0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
171b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
171c0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
171d0 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
171e0 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
171f0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
17200 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
17210 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
17220 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
17230 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b  pLevel, &pWC->a[
17240 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d  iTerm]);.      }
17250 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
17260 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
17270 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
17280 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
17290 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
172a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
172b0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
172c0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
172d0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
172e0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
172f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
17300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17310 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
17320 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
17330 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
17340 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
17350 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20   /* Case 1:  We 
17360 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66  can directly ref
17370 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20  erence a single 
17380 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  row using an.   
17390 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
173a0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
173b0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
173c0 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
173d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
173e0 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
173f0 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
17400 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
17410 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ".    **        
17420 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
17430 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65   */.    iRelease
17440 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
17450 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17460 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
17470 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
17480 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
17490 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
174a0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
174b0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
174c0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
174d0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
174e0 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
174f0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
17500 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
17510 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 52  ble==0 );.    iR
17520 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
17530 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
17540 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
17550 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
17560 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
17570 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
17580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17590 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
175a0 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
175b0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73   addrNxt);.    s
175c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
175d0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
175e0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
175f0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
17600 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17610 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
17620 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
17630 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
17640 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
17650 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
17660 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
17670 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
17680 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
17690 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
176a0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
176b0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
176c0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
176d0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
176e0 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
176f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
17700 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
17710 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
17720 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
17730 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
17740 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
17750 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
17760 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
17770 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69  .    pStart = fi
17780 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
17790 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
177a0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
177b0 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64  .    pEnd = find
177c0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
177d0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
177e0 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
177f0 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
17800 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
17810 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
17820 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
17830 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
17840 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
17850 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
17860 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
17870 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
17880 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
17890 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
178a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
178b0 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
178c0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
178d0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
178e0 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
178f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
17900 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
17910 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
17920 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
17930 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
17940 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
17950 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
17960 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
17970 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
17980 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
17990 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
179a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
179b0 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
179c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
179d0 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
179e0 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
179f0 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
17a00 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
17a10 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
17a20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
17a30 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
17a40 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
17a50 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
17a60 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
17a70 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
17a80 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
17a90 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
17aa0 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
17ab0 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
17ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17ad0 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
17ae0 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
17af0 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
17b00 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
17b10 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
17b20 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
17b30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
17b40 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
17b50 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31  iCur );.      r1
17b60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17b70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17b80 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
17b90 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
17ba0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
17bb0 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
17bc0 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
17bd0 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
17be0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17bf0 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
17c00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17c10 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17c20 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
17c30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17c40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17c50 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
17c60 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
17c70 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
17c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
17c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ca0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
17cb0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
17cc0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
17cd0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
17ce0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
17cf0 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
17d00 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
17d10 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
17d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17d30 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
17d40 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
17d50 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
17d60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17d80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
17d90 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
17da0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
17db0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
17dc0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
17dd0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
17de0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
17df0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
17e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
17e10 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
17e20 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
17e30 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
17e40 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
17e50 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
17e60 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
17e70 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17e80 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
17e90 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
17ea0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
17eb0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
17ec0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
17ed0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
17ee0 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 28    pLevel->p5 = (
17ef0 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e  pStart==0 && pEn
17f00 64 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20  d==0) ?1:0;.    
17f10 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
17f20 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  oop ){.      iRo
17f30 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
17f40 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
17f50 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17f70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17f80 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f  Rowid, iCur, iRo
17f90 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
17fa0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
17fb0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
17fc0 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
17fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17fe0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65  VdbeAddOp3(v, te
17ff0 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  stOp, memEndValu
18000 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77  e, addrBrk, iRow
18010 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
18020 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18030 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  5(v, SQLITE_AFF_
18040 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45  NUMERIC | SQLITE
18050 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18060 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
18070 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
18080 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
18090 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
180a0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20  _COLUMN_EQ) ){. 
180b0 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20     /* Case 3: A 
180c0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
180d0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
180e0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
180f0 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
18100 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
18110 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
18120 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
18130 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
18140 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
18150 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
18160 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
18170 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
18180 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
18190 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
181a0 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
181b0 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
181c0 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
181d0 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
181e0 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
181f0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
18200 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
18210 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
18220 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
18230 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
18240 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
18250 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
18260 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
18270 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
18280 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
18290 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
182a0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
182b0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
182c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
182d0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
182e0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
182f0 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
18300 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
18310 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
18320 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
18330 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
18340 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
18350 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
18360 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
18370 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
18380 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
18390 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
183a0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
183b0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
183c0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
183d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
183e0 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
183f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
18400 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
18410 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
18420 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
18430 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
18440 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
18450 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
18460 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
18470 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
18480 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
18490 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
184a0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
184b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
184c0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
184d0 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
184e0 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
184f0 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
18500 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18510 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
18520 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
18530 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
18540 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
18550 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
18560 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
18570 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
18580 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
18590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
185a0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
185b0 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
185c0 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
185d0 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
185e0 20 20 69 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d    int aStartOp[]
185f0 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
18600 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
18610 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
18620 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
18630 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
18640 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
18650 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
18660 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
18670 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
18680 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
18690 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
186a0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
186b0 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
186c0 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
186d0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
186e0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
186f0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
18700 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
18710 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
18720 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
18730 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
18740 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
18750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
18760 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
18770 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
18780 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
18790 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
187a0 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
187b0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
187c0 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
187d0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
187e0 3b 0a 20 20 20 20 69 6e 74 20 61 45 6e 64 4f 70  ;.    int aEndOp
187f0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f  [] = {.      OP_
18800 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Noop,           
18810 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f    /* 0: (!end_co
18820 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20  nstraints) */.  
18830 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
18840 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
18850 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
18860 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
18870 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20     OP_IdxLT     
18880 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
18890 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
188a0 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d  & bRev) */.    }
188b0 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20  ;.    int nEq = 
188c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
188d0 3b 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  ;.    int isMinQ
188e0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
188f0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
18900 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
18910 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
18920 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
18930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18940 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
18950 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
18960 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
18970 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
189a0 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
189b0 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
189c0 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
189d0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
189e0 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
189f0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
18a00 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
18a10 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
18a20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
18a30 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
18a40 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
18a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18a60 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
18a70 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
18a80 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
18a90 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
18aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18ab0 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
18ac0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
18ad0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
18ae0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
18af0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
18b00 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
18b10 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
18b20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
18b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18b40 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
18b50 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
18b60 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
18b70 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18b80 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
18b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
18ba0 43 75 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Cur;         /* 
18bb0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
18bc0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
18bd0 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
18be0 65 67 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  eg = 0;   /* Num
18bf0 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
18c00 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
18c10 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
18c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
18c30 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
18c40 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
18c50 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
18c60 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
18c70 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
18c80 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d  r;.    k = pIdx-
18c90 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20  >aiColumn[nEq]; 
18ca0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
18cb0 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
18cc0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
18cd0 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
18ce0 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
18cf0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
18d00 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
18d10 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
18d20 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
18d30 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
18d40 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
18d50 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
18d60 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
18d70 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
18d80 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
18d90 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
18da0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
18db0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
18dc0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
18dd0 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
18de0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
18df0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
18e00 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
18e10 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
18e20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
18e30 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
18e40 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
18e50 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
18e60 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
18e70 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
18e80 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
18e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18ea0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
18eb0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
18ec0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76  =0.     && (pLev
18ed0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
18ee0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a  &WHERE_ORDERBY).
18ef0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
18f00 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
18f10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
18f20 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
18f30 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
18f40 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
18f50 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
18f60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
18f70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
18f80 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
18f90 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
18fa0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
18fb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18fc0 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
18fd0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
18fe0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
18ff0 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
19000 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
19010 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
19020 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
19030 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
19040 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
19050 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e   pRangeEnd = fin
19060 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
19070 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
19080 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64  O_LT|WO_LE), pId
19090 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
190a0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
190b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
190c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
190d0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
190e0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
190f0 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rt = findTerm(pW
19100 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
19110 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f  eady, (WO_GT|WO_
19120 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  GE), pIdx);.    
19130 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
19140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
19150 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19160 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
19170 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
19180 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
19190 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
191a0 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
191b0 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
191c0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
191d0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
191e0 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
191f0 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
19200 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
19210 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
19220 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52  Level, pWC, notR
19230 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67 29  eady, nExtraReg)
19240 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
19250 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
19260 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ...    /* If we 
19270 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65  are doing a reve
19280 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  rse order scan o
19290 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
192a0 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ndex, or.    ** 
192b0 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  a forward order 
192c0 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e  scan on a descen
192d0 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65  ding index, inte
192e0 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20  rchange the .   
192f0 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e   ** start and en
19300 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53  d terms (pRangeS
19310 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45  tart and pRangeE
19320 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nd)..    */.    
19330 69 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d  if( bRev==(pIdx-
19340 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
19350 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
19360 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57   ){.      SWAP(W
19370 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e  hereTerm *, pRan
19380 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61  geEnd, pRangeSta
19390 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rt);.    }..    
193a0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
193b0 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53  Start && pRangeS
193c0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
193d0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74  & WO_LE );.    t
193e0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
193f0 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
19400 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
19410 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65   WO_GE );.    te
19420 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
19430 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
19440 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
19450 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
19460 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
19470 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
19480 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
19490 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
194a0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
194b0 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
194c0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
194d0 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
194e0 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
194f0 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
19500 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
19510 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
19520 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
19530 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
19540 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
19550 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
19560 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
19570 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
19580 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
19590 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
195a0 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
195b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
195c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
195d0 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
195e0 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
195f0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71  e+nEq);.      sq
19600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19610 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
19620 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
19630 78 74 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  xt);.      nCons
19640 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  traint++;.    }e
19650 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
19660 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
19670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19680 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
19690 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
196a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
196b0 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
196c0 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
196d0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
196e0 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
196f0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
19700 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
19710 6e 73 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b  nstraint, pIdx);
19720 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74  .    op = aStart
19730 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
19740 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
19750 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
19760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
19770 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
19780 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
19790 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nd );.    testca
197a0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
197b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
197c0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   op==OP_SeekGt )
197d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
197e0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b  op==OP_SeekGe );
197f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
19800 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  p==OP_SeekLe );.
19810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
19820 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20  ==OP_SeekLt );. 
19830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19840 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
19850 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
19860 67 42 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20  gBase, .        
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19880 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
19890 6e 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34  nConstraint), P4
198a0 5f 49 4e 54 33 32 29 3b 0a 0a 20 20 20 20 2f 2a  _INT32);..    /*
198b0 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
198c0 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
198d0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
198e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
198f0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
19900 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
19910 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
19920 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
19930 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
19940 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19950 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
19960 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
19970 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19980 64 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67  de(pParse, pRang
19990 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
199a0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
199b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
199c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
199d0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
199e0 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
199f0 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
19a00 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
19a10 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
19a20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 43 6f  pIdx);.      nCo
19a30 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
19a40 7d 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  }..    /* Top of
19a50 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
19a60 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
19a70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19a80 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
19a90 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
19aa0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
19ab0 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
19ac0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
19ad0 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
19ae0 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
19af0 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
19b00 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
19b10 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
19b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
19b30 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
19b40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
19b50 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
19b60 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
19b70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19b80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70  VdbeAddOp4(v, op
19b90 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
19ba0 78 74 2c 20 72 65 67 42 61 73 65 2c 0a 20 20 20  xt, regBase,.   
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
19bd0 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69  TO_PTR(nConstrai
19be0 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  nt), P4_INT32);.
19bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19c00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
19c10 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
19c20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
19c30 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
19c40 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
19c50 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
19c60 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
19c70 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
19c80 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
19c90 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
19ca0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
19cb0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
19cc0 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
19cd0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
19ce0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
19cf0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
19d00 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19d20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
19d30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
19d40 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65  _LIMIT );.    te
19d50 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
19d60 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19d70 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
19d80 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
19d90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
19da0 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
19db0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
19dc0 54 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  T) ){.      sqli
19dd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19de0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
19df0 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
19e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19e20 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e  ull, r1, addrCon
19e30 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
19e40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19e50 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
19e60 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
19e70 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
19e80 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
19e90 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
19ea0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
19eb0 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
19ec0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
19ed0 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  ngeEnd);.    if(
19ee0 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
19ef0 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
19f00 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
19f10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19f20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f40 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
19f50 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69  , iIdxCur, iRowi
19f60 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
19f70 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19f80 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
19f90 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
19fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19fb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19fc0 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  eek, iCur, iRowi
19fd0 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72  dReg);  /* Defer
19fe0 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
19ff0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
1a000 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1a010 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
1a020 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
1a030 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
1a040 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1a050 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
1a060 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
1a070 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
1a080 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1a090 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1a0a0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1a0b0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
1a0c0 75 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  ur;.  }else..#if
1a0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a0e0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
1a0f0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  .  if( pLevel->p
1a100 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1a110 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
1a120 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20      /* Case 4:  
1a130 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
1a140 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
1a150 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
1a160 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
1a170 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1a180 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
1a190 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
1a1a0 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
1a1b0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1a1c0 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
1a1d0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1a1e0 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
1a1f0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1a200 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
1a210 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
1a220 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1a230 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
1a240 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
1a250 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
1a260 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
1a270 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
1a280 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
1a290 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
1a2a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
1a2b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
1a2c0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
1a2d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1a2e0 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
1a310 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
1a320 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
1a330 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
1a340 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
1a350 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
1a360 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
1a370 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
1a380 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1a390 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1a3a0 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
1a3b0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
1a3c0 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
1a3d0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
1a3e0 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
1a3f0 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
1a400 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
1a410 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
1a420 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1a430 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
1a440 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a450 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1a460 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
1a470 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
1a480 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
1a490 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
1a4a0 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
1a4b0 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
1a4c0 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
1a4d0 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
1a4e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1a4f0 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
1a500 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
1a510 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
1a520 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
1a530 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
1a540 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
1a550 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
1a560 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
1a570 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
1a580 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
1a590 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a5a0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
1a5b0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
1a5c0 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
1a5d0 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
1a5e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
1a5f0 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
1a600 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
1a610 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
1a620 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1a630 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
1a640 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
1a650 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
1a660 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
1a670 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1a680 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
1a690 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
1a6a0 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
1a6b0 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
1a6c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
1a6d0 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
1a6e0 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
1a6f0 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
1a700 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
1a710 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
1a720 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
1a730 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65  terms */.    Whe
1a740 72 65 54 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20  reTerm *pFinal; 
1a750 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62      /* Final sub
1a760 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
1a770 4f 52 2d 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  OR-clause. */.  
1a780 20 20 53 72 63 4c 69 73 74 20 6f 6e 65 54 61 62    SrcList oneTab
1a790 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  ;        /* Shor
1a7a0 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
1a7b0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
1a7c0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
1a7d0 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
1a7e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
1a7f0 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
1a800 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
1a810 52 6f 77 73 65 74 3b 20 20 20 20 20 20 20 20 20  Rowset;         
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
1a840 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
1a850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
1a860 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1a890 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
1a8a0 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
1a8b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a8c0 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
1a8d0 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
1a8e0 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
1a8f0 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1a920 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
1a930 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
1a940 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
1a950 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1a960 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
1a970 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1a980 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1a990 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
1a9a0 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
1a9b0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
1a9c0 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
1a9d0 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
1a9e0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
1a9f0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69  nfo->wc;.    pFi
1aa00 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  nal = &pOrWc->a[
1aa10 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b  pOrWc->nTerm-1];
1aa20 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
1aa30 61 20 53 72 63 4c 69 73 74 20 63 6f 6e 74 61 69  a SrcList contai
1aa40 6e 69 6e 67 20 6a 75 73 74 20 74 68 65 20 74 61  ning just the ta
1aa50 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
1aa60 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20  d by this loop. 
1aa70 2a 2f 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53  */.    oneTab.nS
1aa80 72 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54  rc = 1;.    oneT
1aa90 61 62 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  ab.nAlloc = 1;. 
1aaa0 20 20 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d     oneTab.a[0] =
1aab0 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
1aac0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1aad0 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
1aae0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
1aaf0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
1ab00 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
1ab10 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
1ab20 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a  y rowset..    **
1ab30 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69  .    ** Also ini
1ab40 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72  tialize regRetur
1ab50 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  n to contain the
1ab60 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
1ab70 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20  instruction .   
1ab80 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
1ab90 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50  following the OP
1aba0 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62  _Return at the b
1abb0 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
1abc0 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  p. This.    ** i
1abd0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20  s required in a 
1abe0 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54  few obscure LEFT
1abf0 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72   JOIN cases wher
1ac00 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a  e control jumps.
1ac10 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20      ** over the 
1ac20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
1ac30 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
1ac40 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
1ac50 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  e the .    ** co
1ac60 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66  rrect response f
1ac70 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f  or the end-of-lo
1ac80 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f  op code (the OP_
1ac90 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20  Return) is to . 
1aca0 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75     ** fall throu
1acb0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
1acc0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74  nstruction, just
1acd0 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64   as an OP_Next d
1ace0 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61  oes if.    ** ca
1acf0 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  lled on an unini
1ad00 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e  tialized cursor.
1ad10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
1ad30 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
1ad40 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  K)==0 ){.      r
1ad50 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
1ad60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1ad70 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
1ad80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ad90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ada0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1adb0 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
1adc0 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
1add0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1ade0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1adf0 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
1ae00 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  n);..    for(ii=
1ae10 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
1ae20 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
1ae30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1ae40 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
1ae50 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
1ae60 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1ae70 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54  or==iCur || pOrT
1ae80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
1ae90 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  WO_AND ){.      
1aea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
1aeb0 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
1aec0 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
1aed0 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
1aee0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
1aef0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
1af00 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1af10 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1af20 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
1af30 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
1af40 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1af50 72 73 65 2c 20 26 6f 6e 65 54 61 62 2c 20 70 4f  rse, &oneTab, pO
1af60 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c  rTerm->pExpr, 0,
1af70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af80 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
1af90 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45  MIT_OPEN | WHERE
1afa0 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 20 57 48  _OMIT_CLOSE | WH
1afb0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
1afc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1afd0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
1afe0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1aff0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
1b000 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
1b010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1b020 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
1b030 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
1b040 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
1b050 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
1b060 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
1b070 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1b080 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  mn(pParse, pTabI
1b090 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69  tem->pTab, -1, i
1b0a0 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1b0d0 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
1b0e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b0f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1b100 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
1b110 52 6f 77 73 65 74 2c 20 0a 20 20 20 20 20 20 20  Rowset, .       
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b140 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1b150 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +2,.            
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f    r, SQLITE_INT_
1b180 54 4f 5f 50 54 52 28 69 53 65 74 29 2c 20 50 34  TO_PTR(iSet), P4
1b190 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
1b1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1b1b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b1c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b1d0 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
1b1e0 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
1b1f0 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
1b200 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
1b210 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
1b220 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
1b230 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
1b240 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1b250 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
1b260 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b270 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1b280 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
1b290 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
1b2a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1b2b0 29 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  ));.    /* sqlit
1b2c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b2d0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
1b2e0 6f 77 73 65 74 29 3b 20 2a 2f 0a 20 20 20 20 73  owset); */.    s
1b2f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b300 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b310 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1b320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b330 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b340 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
1b350 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1b360 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  P_Return;.    pL
1b370 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65  evel->p1 = regRe
1b380 74 75 72 6e 3b 0a 20 20 20 20 64 69 73 61 62 6c  turn;.    disabl
1b390 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
1b3a0 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
1b3b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b3c0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
1b3d0 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
1b3e0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
1b3f0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
1b400 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
1b410 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
1b420 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
1b430 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
1b440 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
1b450 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b460 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
1b470 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
1b480 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1b490 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
1b4a0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
1b4b0 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
1b4c0 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
1b4d0 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
1b4e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1b4f0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
1b500 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
1b510 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
1b520 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
1b530 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
1b540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b550 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
1b560 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
1b570 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
1b580 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
1b590 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
1b5a0 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
1b5b0 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
1b5c0 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
1b5d0 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
1b5e0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
1b5f0 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
1b600 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
1b610 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
1b620 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
1b630 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
1b640 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
1b650 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    k = 0;.  for(p
1b660 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
1b670 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
1b680 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
1b690 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
1b6a0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1b6b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1b6c0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1b6d0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b6e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b6f0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
1b700 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1b710 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
1b720 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
1b730 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1b740 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
1b750 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
1b760 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b770 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
1b780 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1b790 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
1b7a0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1b7b0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
1b7c0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
1b7d0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1b7e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1b7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b800 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1b810 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
1b820 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1b830 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20  ;.    k = 1;.   
1b840 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1b850 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
1b860 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
1b870 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1b880 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
1b890 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
1b8a0 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
1b8b0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
1b8c0 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
1b8d0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
1b8e0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
1b8f0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
1b900 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1b910 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1b920 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
1b930 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1b940 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
1b950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b960 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
1b970 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1b980 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1b990 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
1b9a0 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
1b9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b9c0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
1b9d0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
1b9e0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
1b9f0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
1ba00 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1ba10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1ba20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1ba30 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1ba40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1ba50 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1ba60 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
1ba70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1ba80 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1ba90 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1baa0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bab0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
1bac0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
1bad0 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ady)!=0 ) contin
1bae0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1baf0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
1bb00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bb10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1bb20 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
1bb30 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
1bb40 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1bb50 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
1bb60 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
1bb70 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
1bb80 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bb90 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
1bba0 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
1bbb0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d  turn notReady;.}
1bbc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1bbd0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1bbe0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1bbf0 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20  ariable holds a 
1bc00 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
1bc10 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67   of query plan g
1bc20 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74  enerated.** by t
1bc30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
1bc40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
1bc50 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63  ereBegin().  Eac
1bc60 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42  h call to WhereB
1bc70 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74  egin.** overwrit
1bc80 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  es the previous.
1bc90 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
1bca0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  on is used for t
1bcb0 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e  esting and.** an
1bcc0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1bcd0 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65  char sqlite3_que
1bce0 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30  ry_plan[BMS*2*40
1bcf0 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74  ];  /* Text of t
1bd00 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69  he join */.stati
1bd10 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30  c int nQPlan = 0
1bd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bd30 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77  * Next free slow
1bd40 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b   in _query_plan[
1bd50 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ] */..#endif /* 
1bd60 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
1bd70 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
1bd80 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
1bd90 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
1bda0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
1bdb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
1bdc0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
1bdd0 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
1bde0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1bdf0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
1be00 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
1be10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
1be20 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20  dex_info *pInfo 
1be30 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
1be40 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  IdxInfo;.      i
1be50 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
1be60 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1be70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1be80 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d  IdxStr==0 || db-
1be90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1bea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1beb0 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
1bec0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
1bed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1bee0 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  e(pInfo->idxStr)
1bef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bf00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1bf10 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  e(db, pInfo);.  
1bf20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bf30 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1bf40 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
1bf50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1bf60 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
1bf70 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
1bf80 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
1bf90 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
1bfa0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
1bfb0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
1bfc0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
1bfd0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
1bfe0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
1bff0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
1c000 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
1c010 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
1c020 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
1c030 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
1c040 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
1c050 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
1c060 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1c070 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
1c080 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
1c090 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1c0a0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
1c0b0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
1c0c0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
1c0d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1c0e0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
1c0f0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
1c100 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
1c110 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
1c120 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
1c130 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
1c140 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
1c150 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1c160 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
1c170 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
1c180 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
1c190 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
1c1a0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
1c1b0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
1c1c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1c1d0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
1c1e0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
1c1f0 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
1c200 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1c210 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
1c220 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
1c230 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
1c240 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
1c250 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
1c260 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1c270 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
1c280 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
1c290 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
1c2a0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
1c2b0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
1c2c0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
1c2d0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
1c2e0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
1c2f0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
1c300 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
1c310 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
1c320 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c340 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
1c350 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
1c360 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
1c370 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
1c380 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
1c390 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
1c3c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
1c3d0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
1c3e0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
1c3f0 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
1c400 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
1c410 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1c420 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
1c430 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
1c440 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
1c450 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
1c460 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
1c470 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
1c480 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
1c490 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
1c4a0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
1c4b0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
1c4c0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
1c4d0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
1c4e0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
1c4f0 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
1c500 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1c510 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
1c520 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
1c530 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
1c540 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
1c550 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
1c560 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
1c570 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
1c580 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
1c590 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
1c5a0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
1c5b0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
1c5c0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1c5d0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
1c5e0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
1c5f0 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
1c600 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
1c610 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
1c620 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
1c630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1c640 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
1c650 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
1c660 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
1c670 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
1c680 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
1c690 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
1c6a0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
1c6b0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
1c6c0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
1c6d0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
1c6e0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
1c6f0 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
1c700 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
1c710 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
1c720 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
1c730 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
1c740 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
1c750 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
1c760 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
1c770 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
1c780 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
1c790 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
1c7a0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
1c7b0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
1c7c0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
1c7d0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
1c7e0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
1c7f0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
1c800 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
1c810 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
1c820 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
1c830 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
1c840 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
1c850 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
1c860 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
1c870 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
1c880 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
1c890 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
1c8a0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
1c8b0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
1c8c0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
1c8d0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
1c8e0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
1c8f0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
1c900 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
1c910 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
1c920 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
1c930 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
1c940 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
1c950 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
1c960 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
1c970 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
1c980 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
1c990 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
1c9a0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
1c9b0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
1c9c0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
1c9d0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
1c9e0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
1c9f0 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
1ca00 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
1ca10 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
1ca20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
1ca30 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
1ca40 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1ca50 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
1ca60 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
1ca70 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
1ca80 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
1ca90 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
1caa0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
1cab0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
1cac0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
1cad0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
1cae0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
1caf0 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
1cb00 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
1cb10 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
1cb20 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
1cb30 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
1cb40 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
1cb50 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
1cb60 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
1cb70 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
1cb80 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
1cb90 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
1cba0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
1cbb0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
1cbc0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
1cbd0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
1cbe0 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
1cbf0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
1cc00 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
1cc10 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1cc20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
1cc30 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1cc40 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
1cc50 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
1cc60 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
1cc70 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1cc80 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
1cc90 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
1cca0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
1ccb0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
1ccc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
1ccd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
1cce0 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
1ccf0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
1cd00 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
1cd10 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
1cd20 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
1cd30 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
1cd40 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
1cd50 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
1cd60 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1cd70 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
1cd80 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
1cd90 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
1cda0 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
1cdb0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1cdc0 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
1cdd0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1cde0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
1cdf0 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
1ce00 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1ce10 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
1ce20 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
1ce30 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
1ce40 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
1ce50 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
1ce60 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
1ce70 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
1ce80 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
1ce90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1cea0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1ceb0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
1cec0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1ced0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1cee0 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
1cef0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
1cf00 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
1cf10 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1cf20 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
1cf30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1cf40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
1cf50 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
1cf60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cf70 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  , or NULL */.  u
1cf80 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1cf90 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1cfa0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
1cfb0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
1cfc0 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20  teInt.h */.){.  
1cfd0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1cfe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1cff0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d000 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
1d010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d020 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
1d030 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
1d040 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 57 68 65   struct */.  Whe
1d050 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1d060 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
1d070 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
1d080 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
1d090 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
1d0a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d0b0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
1d0c0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1d0d0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
1d0e0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
1d0f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1d100 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
1d110 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
1d120 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
1d130 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
1d140 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1d150 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
1d160 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d180 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
1d190 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d1a0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1d1b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
1d1c0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
1d1d0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
1d1e0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
1d1f0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1d200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d210 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
1d220 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
1d230 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
1d240 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d250 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1d260 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
1d270 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
1d280 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
1d290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d2a0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
1d2b0 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
1d2c0 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
1d2d0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1d2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d2f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d300 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
1d310 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
1d320 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1d330 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
1d340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
1d350 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
1d360 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28  mask .  */.  if(
1d370 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
1d380 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
1d390 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d3a0 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
1d3b0 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
1d3c0 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
1d3d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1d3e0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1d3f0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
1d400 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
1d410 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
1d420 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
1d430 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
1d440 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
1d450 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1d460 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
1d470 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
1d480 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
1d490 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
1d4a0 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1d4b0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
1d4c0 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
1d4d0 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
1d4e0 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
1d4f0 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
1d500 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
1d510 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
1d520 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
1d530 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
1d540 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
1d550 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
1d560 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
1d570 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20  ow..  */.  db = 
1d580 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42  pParse->db;.  nB
1d590 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
1d5a0 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
1d5b0 66 6f 29 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e  fo)+(pTabList->n
1d5c0 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  Src-1)*sizeof(Wh
1d5d0 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
1d5e0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
1d5f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
1d600 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f        nByteWInfo
1d610 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   + .      sizeof
1d620 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a  (WhereClause) +.
1d630 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
1d640 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a  reMaskSet).  );.
1d650 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1d660 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1d670 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
1d680 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
1d690 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c  ->nLevel = pTabL
1d6a0 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49  ist->nSrc;.  pWI
1d6b0 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
1d6c0 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
1d6d0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
1d6e0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
1d6f0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
1d700 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d710 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d  .  pWInfo->pWC =
1d720 20 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61   pWC = (WhereCla
1d730 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57  use *)&((u8 *)pW
1d740 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f  Info)[nByteWInfo
1d750 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ];.  pWInfo->wct
1d760 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
1d770 6c 61 67 73 3b 0a 20 20 70 4d 61 73 6b 53 65 74  lags;.  pMaskSet
1d780 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74   = (WhereMaskSet
1d790 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a  *)&pWC[1];..  /*
1d7a0 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
1d7b0 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
1d7c0 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
1d7d0 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
1d7e0 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
1d7f0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
1d800 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
1d810 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
1d820 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
1d830 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
1d840 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c  nit(pWC, pParse,
1d850 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71   pMaskSet);.  sq
1d860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
1d870 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
1d880 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53  Where);.  whereS
1d890 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65  plit(pWC, pWhere
1d8a0 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
1d8b0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1d8c0 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
1d8d0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
1d8e0 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
1d8f0 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
1d900 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
1d910 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
1d920 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
1d930 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
1d940 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c  pWhere && (pTabL
1d950 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20  ist->nSrc==0 || 
1d960 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1d970 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68  stantNotJoin(pWh
1d980 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
1d990 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1d9a0 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
1d9b0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
1d9c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1d9d0 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  L);.    pWhere =
1d9e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73   0;.  }..  /* As
1d9f0 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
1da00 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
1da10 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
1da20 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
1da30 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73  **.  ** When ass
1da40 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76  igning bitmask v
1da50 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c  alues to FROM cl
1da60 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74  ause cursors, it
1da70 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68   must be.  ** th
1da80 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58  e case that if X
1da90 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
1daa0 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f  for the N-th FRO
1dab0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  M clause term th
1dac0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d  en.  ** the bitm
1dad0 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ask for all FROM
1dae0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f   clause terms to
1daf0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
1db00 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20   N-th term.  ** 
1db10 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65  is (X-1).   An e
1db20 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
1db30 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1db40 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  a LEFT JOIN can 
1db50 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70  use.  ** its Exp
1db60 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1db70 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20  e value to find 
1db80 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74  the bitmask of t
1db90 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
1dba0 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e   ** of the join.
1dbb0 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e    Subtracting on
1dbc0 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74  e from the right
1dbd0 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67   table bitmask g
1dbe0 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d  ives a.  ** bitm
1dbf0 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  ask for all tabl
1dc00 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
1dc10 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f  f the join.  Kno
1dc20 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b  wing the bitmask
1dc30 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61  .  ** for all ta
1dc40 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
1dc50 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
1dc60 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  is important.  T
1dc70 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a  icket #3015..  *
1dc80 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
1dc90 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
1dca0 2e 76 6d 61 73 6b 20 76 61 72 69 61 62 6c 65 20  .vmask variable 
1dcb0 73 6f 20 74 68 61 74 20 62 69 74 73 20 74 68 61  so that bits tha
1dcc0 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a 20 20 2a  t correspond.  *
1dcd0 2a 20 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62  * to virtual tab
1dce0 6c 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 73  le cursors are s
1dcf0 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  et. This is used
1dd00 20 74 6f 20 73 65 6c 65 63 74 69 76 65 6c 79 20   to selectively 
1dd10 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68  disable .  ** th
1dd20 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72 61 6e 73  e OR-to-IN trans
1dd30 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 65 78 70  formation in exp
1dd40 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 29  rAnalyzeOrTerm()
1dd50 2e 20 49 74 20 69 73 20 6e 6f 74 20 68 65 6c 70  . It is not help
1dd60 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74 68 20 76  ful .  ** with v
1dd70 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 20  irtual tables.. 
1dd80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
1dd90 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70  C->vmask==0 && p
1dda0 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b  MaskSet->n==0 );
1ddb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1ddc0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1ddd0 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
1dde0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
1ddf0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
1de00 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 54  sor);.    if( pT
1de10 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
1de20 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
1de30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
1de40 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ab) ){.      pWC
1de50 2d 3e 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74  ->vmask |= ((Bit
1de60 6d 61 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20  mask)1 << i);.  
1de70 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20    }.  }.#ifndef 
1de80 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
1de90 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
1dea0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
1deb0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
1dec0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1ded0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
1dee0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
1def0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
1df00 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
1df10 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
1df20 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
1df30 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
1df40 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1df50 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
1df60 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
1df70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
1df80 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
1df90 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
1dfa0 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
1dfb0 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
1dfc0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1dfd0 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
1dfe0 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
1dff0 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
1e000 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
1e010 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
1e020 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
1e030 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
1e040 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
1e050 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
1e060 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
1e070 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
1e080 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
1e090 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20  st, pWC);.  if( 
1e0a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e0b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
1e0c0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
1e0d0 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68  }..  /* Chose th
1e0e0 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20  e best index to 
1e0f0 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  use for each tab
1e100 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
1e110 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
1e120 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73   This loop fills
1e130 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
1e140 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20  g fields:.  **. 
1e150 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
1e160 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20  ].pIdx      The 
1e170 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
1e180 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74   this level of t
1e190 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20  he loop..  **   
1e1a0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c  pWInfo->a[].wsFl
1e1b0 61 67 73 20 20 20 57 48 45 52 45 5f 78 78 78 20  ags   WHERE_xxx 
1e1c0 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  flags associated
1e1d0 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20   with pIdx.  ** 
1e1e0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45    pWInfo->a[].nE
1e1f0 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62  q       The numb
1e200 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20  er of == and IN 
1e210 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
1e220 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
1e230 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74  From     Which t
1e240 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
1e250 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
1e260 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
1e270 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
1e280 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
1e290 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
1e2a0 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
1e2b0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
1e2c0 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
1e2d0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
1e2e0 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ndex.  **   pWIn
1e2f0 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20  fo->a[].pTerm   
1e300 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d    When wsFlags==
1e310 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c  WO_OR, the OR-cl
1e320 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20  ause term.  **. 
1e330 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
1e340 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
1e350 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
1e360 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
1e370 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
1e380 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
1e390 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
1e3a0 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
1e3b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
1e3c0 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
1e3d0 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
1e3e0 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
1e3f0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
1e400 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
1e410 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
1e420 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
1e430 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1e440 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
1e450 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43  l++){.    WhereC
1e460 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20  ost bestPlan;   
1e470 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66        /* Most ef
1e480 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65  ficient plan see
1e490 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
1e4a0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e4c0 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
1e4d0 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
1e4e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1e510 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
1e520 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  es */.    int be
1e530 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  stJ = 0;        
1e540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
1e550 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
1e560 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
1e570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
1e580 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
1e590 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
1e5a0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20    int once = 0; 
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e5c0 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73 74   True when first
1e5d0 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20 2a   table is seen *
1e5e0 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  /..    memset(&b
1e5f0 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65  estPlan, 0, size
1e600 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20  of(bestPlan));. 
1e610 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73     bestPlan.rCos
1e620 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
1e630 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46  BL;.    for(j=iF
1e640 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
1e650 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
1e660 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1e670 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
1e680 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  ){.      int doN
1e690 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a  otReorder;    /*
1e6a0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61   True if this ta
1e6b0 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ble should not b
1e6c0 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  e reordered */. 
1e6d0 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
1e6e0 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73  Cost;     /* Cos
1e6f0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  t information fr
1e700 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d  om best[Virtual]
1e710 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20  Index() */.     
1e720 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1e730 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42  rBy;  /* ORDER B
1e740 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  Y clause for ind
1e750 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
1e760 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  /..      doNotRe
1e770 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
1e780 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
1e790 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1e7a0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  ))!=0;.      if(
1e7b0 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65   once && doNotRe
1e7c0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
1e7d0 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
1e7e0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (pMaskSet, pTabI
1e7f0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1e800 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
1e810 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
1e820 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
1e830 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
1e840 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
1e860 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20  rderBy = ((i==0 
1e870 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a  && ppOrderBy )?*
1e880 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 0a 20  ppOrderBy:0);.. 
1e890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
1e8a0 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
1e8b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e8c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1e8d0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1e8e0 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
1e8f0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
1e900 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1e910 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f  o **pp = &pWInfo
1e920 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
1e930 0a 20 20 20 20 20 20 20 20 62 65 73 74 56 69 72  .        bestVir
1e940 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
1e950 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
1e960 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65   notReady, pOrde
1e970 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70 29  rBy, &sCost, pp)
1e980 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23  ;.      }else .#
1e990 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1e9a0 20 20 20 20 20 20 62 65 73 74 42 74 72 65 65 49        bestBtreeI
1e9b0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1e9c0 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
1e9d0 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20  eady, pOrderBy, 
1e9e0 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d  &sCost);.      }
1e9f0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 3d  .      if( once=
1ea00 3d 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73  =0 || sCost.rCos
1ea10 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  t<bestPlan.rCost
1ea20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   ){.        once
1ea30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 65   = 1;.        be
1ea40 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a  stPlan = sCost;.
1ea50 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
1ea60 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
1ea70 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65   if( doNotReorde
1ea80 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
1ea90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 63  .    assert( onc
1eaa0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
1eab0 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d   notReady & getM
1eac0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
1ead0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
1eae0 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  .iCursor) );.   
1eaf0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
1eb00 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65  * Optimizer sele
1eb10 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72  cts table %d for
1eb20 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73   loop %d\n", bes
1eb30 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  tJ,.           p
1eb40 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29  Level-pWInfo->a)
1eb50 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74  );.    if( (best
1eb60 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
1eb70 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1eb80 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  Y)!=0 ){.      *
1eb90 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
1eba0 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
1ebb0 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  s &= bestPlan.pl
1ebc0 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
1ebd0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62  pLevel->plan = b
1ebe0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20  estPlan.plan;.  
1ebf0 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70    if( bestPlan.p
1ec00 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1ec10 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1ec20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
1ec30 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
1ec40 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Tab++;.    }else
1ec50 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1ec60 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20  iIdxCur = -1;.  
1ec70 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
1ec80 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61   &= ~getMask(pMa
1ec90 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
1eca0 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
1ecb0 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  r);.    pLevel->
1ecc0 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74  iFrom = (u8)best
1ecd0 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  J;..    /* Check
1ece0 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62   that if the tab
1ecf0 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  le scanned by th
1ed00 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  is loop iteratio
1ed10 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20  n had an.    ** 
1ed20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1ed30 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  e attached to it
1ed40 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64  , that the named
1ed50 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a   index is being.
1ed60 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20      ** used for 
1ed70 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74  the scan. If not
1ed80 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d  , then query com
1ed90 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69  pilation has fai
1eda0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75  led..    ** Retu
1edb0 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
1edc0 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70   */.    pIdx = p
1edd0 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
1ede0 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ].pIndex;.    if
1edf0 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
1ee00 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
1ee10 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1ee20 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
1ee30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ee40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ee50 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e  , "cannot use in
1ee60 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e  dex: %s", pIdx->
1ee70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1ee80 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
1ee90 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
1eea0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
1eeb0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1eec0 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74  lause is used, t
1eed0 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66  he bestIndex() f
1eee0 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  unction is.     
1eef0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
1ef00 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64   to find the ind
1ef10 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ex specified in 
1ef20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
1ef30 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
1ef40 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69   if it find an i
1ef50 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a  ndex at all. */.
1ef60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ef70 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e  bestPlan.plan.u.
1ef80 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20  pIdx==pIdx );.  
1ef90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1efa0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
1efb0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
1efc0 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
1efd0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1efe0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1eff0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1f000 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
1f010 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
1f020 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
1f030 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
1f040 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
1f050 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
1f060 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
1f070 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
1f080 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
1f090 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
1f0a0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
1f0b0 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
1f0c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1f0d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
1f0e0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
1f0f0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
1f100 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
1f110 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
1f120 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
1f130 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
1f140 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
1f150 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
1f160 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
1f170 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
1f180 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f190 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
1f1a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1f1b0 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
1f1c0 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
1f1d0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
1f1e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1f1f0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
1f200 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
1f210 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
1f220 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1f230 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
1f240 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73  !=0 && (andFlags
1f250 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
1f260 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
1f270 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
1f280 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
1f290 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  0].plan.wsFlags 
1f2a0 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
1f2b0 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  LY;.  }..  /* Op
1f2c0 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
1f2d0 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
1f2e0 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
1f2f0 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
1f300 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
1f310 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73  tables..  */.  s
1f320 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f330 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
1f340 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
1f350 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
1f360 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28  r Goto */.  for(
1f370 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
1f380 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
1f390 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
1f3a0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
1f3b0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
1f3c0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
1f3d0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
1f3e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1f3f0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
1f400 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
1f410 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ex */..#ifndef S
1f420 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1f430 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  IN.    if( pPars
1f440 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
1f450 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
1f460 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  g;.      struct 
1f470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f480 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1f490 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1f4a0 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ];.      zMsg = 
1f4b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1f4c0 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70  b, "TABLE %s", p
1f4d0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1f4e0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1f4f0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
1f500 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1f510 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1f520 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
1f530 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
1f540 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
1f550 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
1f560 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1f570 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
1f580 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1f590 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1f5a0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1f5b0 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 0a  WITH INDEX %s",.
1f5c0 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c             zMsg,
1f5d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1f5e0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
1f5f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
1f600 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1f610 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1f620 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OR ){.        z
1f630 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1f640 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1f650 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49 4e  "%s VIA MULTI-IN
1f660 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73 67  DEX UNION", zMsg
1f670 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1f680 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
1f690 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1f6a0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1f6b0 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
1f6c0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1f6d0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1f6e0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
1f6f0 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  NG PRIMARY KEY",
1f700 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
1f710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f720 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1f730 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
1f740 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1f750 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1f760 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1f770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f780 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
1f790 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
1f7a0 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
1f7b0 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  ;.        zMsg =
1f7c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1f7d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
1f7e0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
1f7f0 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
1f800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f810 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69       pVtabIdx->i
1f820 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d  dxNum, pVtabIdx-
1f830 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  >idxStr);.      
1f840 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1f850 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
1f860 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f870 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20  ORDERBY ){.     
1f880 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1f890 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1f8a0 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59  sg, "%s ORDER BY
1f8b0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1f8c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1f8d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f8e0 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76  Explain, i, pLev
1f8f0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d  el->iFrom, 0, zM
1f900 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
1f910 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1f920 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1f930 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62  LAIN */.    pTab
1f940 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1f950 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1f960 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
1f970 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
1f980 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
1f990 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
1f9a0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
1f9b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66  pSchema);.    if
1f9c0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
1f9d0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
1f9e0 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
1f9f0 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
1fa00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fa10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1fa20 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  LE.    if( (pLev
1fa30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1fa40 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1fa50 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1fa60 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
1fa70 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1fa80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fa90 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1faa0 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
1fab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fac0 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
1fad0 20 63 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74   char*)pTab->pVt
1fae0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1faf0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1fb00 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
1fb10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1fb20 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
1fb30 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
1fb40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1fb50 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20  E_OMIT_OPEN)==0 
1fb60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
1fb70 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
1fb80 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
1fb90 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
1fba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
1fbb0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
1fbc0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1fbd0 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
1fbe0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  p);.      if( !p
1fbf0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
1fc00 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
1fc10 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
1fc20 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
1fc30 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
1fc40 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
1fc50 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
1fc60 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
1fc70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1fc80 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
1fc90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1fca0 74 41 64 64 72 28 76 29 2d 31 2c 20 53 51 4c 49  tAddr(v)-1, SQLI
1fcb0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
1fcc0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
1fcd0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
1fce0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
1fcf0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1fd00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
1fd10 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
1fd20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
1fd30 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
1fd40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
1fd50 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
1fd60 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1fd70 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
1fd80 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1fd90 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
1fda0 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  =0 ){.      Inde
1fdb0 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  x *pIx = pLevel-
1fdc0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
1fdd0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1fde0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
1fdf0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
1fe00 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIx);.      int 
1fe10 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1fe20 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
1fe30 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
1fe40 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
1fe50 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
1fe60 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30  sert( iIdxCur>=0
1fe70 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1fe80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1fe90 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
1fea0 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
1feb0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1fed0 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
1fee0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1fef0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1ff00 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
1ff10 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
1ff20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1ff30 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1ff40 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
1ff50 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
1ff60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ff70 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47  Addr(v);..  /* G
1ff80 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
1ff90 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
1ffa0 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
1ffb0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
1ffc0 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
1ffd0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
1ffe0 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
1fff0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
20000 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
20010 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
20020 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
20030 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
20040 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
20050 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
20060 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
20070 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
20080 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
20090 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
200a0 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e 66 6f  ontinue = pWInfo
200b0 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e 74 3b  ->a[i].addrCont;
200c0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
200d0 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72  ITE_TEST  /* For
200e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
200f0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
20100 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69  */.  /* Record i
20110 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  n the query plan
20120 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
20130 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ut the current t
20140 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  able.  ** and th
20150 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  e index used to 
20160 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e  access it (if an
20170 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  y).  If the tabl
20180 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73  e itself.  ** is
20190 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e   not used, its n
201a0 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27  ame is just '{}'
201b0 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69  .  If no index i
201c0 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20  s used.  ** the 
201d0 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20  index is listed 
201e0 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65  as "{}".  If the
201f0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
20200 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e  used the.  ** in
20210 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e  dex name is '*'.
20220 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
20230 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
20240 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  c; i++){.    cha
20250 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
20260 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
20270 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
20280 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
20290 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
202a0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d  >iFrom];.    z =
202b0 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61   pTabItem->zAlia
202c0 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  s;.    if( z==0 
202d0 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  ) z = pTabItem->
202e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
202f0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
20300 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
20310 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
20320 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
20330 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
20340 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
20350 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
20360 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
20370 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
20380 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
20390 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22  an[nQPlan], "{}"
203a0 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , 2);.        nQ
203b0 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Plan += 2;.     
203c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
203d0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
203e0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
203f0 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  n], z, n);.     
20400 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
20410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
20420 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
20430 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
20440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
20450 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
20460 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
20470 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
20480 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
20490 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
204a0 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
204b0 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28  RANGE );.    if(
204c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
204d0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  Flags & (WHERE_R
204e0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
204f0 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
20500 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
20510 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
20520 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29  QPlan], "* ", 2)
20530 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
20540 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
20550 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
20560 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20570 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
20580 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
20590 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c  3Strlen30(pLevel
205a0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
205b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
205c0 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
205d0 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
205e0 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20  _plan)-2 ){.    
205f0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
20600 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
20610 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e  QPlan], pLevel->
20620 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
20630 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  me, n);.        
20640 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
20650 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
20660 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
20670 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
20680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20690 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
206a0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
206b0 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b  lan], "{} ", 3);
206c0 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
206d0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   3;.    }.  }.  
206e0 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
206f0 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
20700 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
20710 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
20720 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
20730 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
20740 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
20750 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
20760 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
20770 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
20780 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
20790 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
207a0 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
207b0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
207c0 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
207d0 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
207e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
207f0 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
20800 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
20810 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49   */.  return pWI
20820 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
20830 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
20840 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
20850 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72 65  inError:.  where
20860 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
20870 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nfo);.  return 0
20880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
20890 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
208a0 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
208b0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
208c0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
208d0 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
208e0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
208f0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
20900 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
20910 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
20920 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
20930 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
20940 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
20950 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
20960 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
20970 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72  el *pLevel;.  Sr
20980 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
20990 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
209a0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
209b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
209c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
209d0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
209e0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
209f0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
20a00 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
20a10 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  r(i=pTabList->nS
20a20 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rc-1; i>=0; i--)
20a30 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
20a40 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
20a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20a60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
20a70 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
20a80 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
20a90 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
20aa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20ab0 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c  AddOp2(v, pLevel
20ac0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
20ad0 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
20ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20af0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
20b00 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20  el->p5);.    }. 
20b10 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
20b20 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
20b30 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
20b40 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
20b50 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
20b60 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
20b70 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
20b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20b90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
20ba0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
20bb0 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
20bc0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
20bd0 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
20be0 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
20bf0 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
20c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20c10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
20c20 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
20c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20c50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72  _Next, pIn->iCur
20c60 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
20c70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20c80 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
20c90 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
20ca0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
20cb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20cc0 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
20cd0 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
20ce0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
20cf0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20d00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
20d10 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
20d20 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
20d30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
20d40 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
20d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20d60 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
20d70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
20d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20d90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
20da0 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
20db0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
20dc0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
20dd0 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a  ->iIdxCur>=0 ){.
20de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20df0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
20e00 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
20e10 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
20e20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
20e30 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
20e40 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
20e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20e60 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
20e70 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
20e80 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
20e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20eb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
20ec0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
20ed0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
20ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20ef0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
20f00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
20f10 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
20f20 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
20f30 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
20f40 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
20f50 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
20f60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
20f70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20f80 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
20f90 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
20fa0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
20fb0 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
20fc0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
20fd0 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
20fe0 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
20ff0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
21000 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
21010 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
21020 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21030 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
21040 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
21050 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
21060 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21070 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
21080 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
21090 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
210a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
210b0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
210c0 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
210d0 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ct ) continue;. 
210e0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
210f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21100 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d  RE_OMIT_CLOSE)==
21110 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
21120 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
21130 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  s && (pLevel->pl
21140 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
21150 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
21160 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21170 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21180 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
21190 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
211a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
211b0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
211c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
211d0 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
211e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
211f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
21200 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
21210 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
21220 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
21230 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
21240 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64   index, make cod
21250 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
21260 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
21270 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
21280 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65  ex in preference
21290 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53   to the table. S
212a0 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d  ometimes, this m
212b0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  eans.    ** the 
212c0 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72  table need never
212d0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54   be read from. T
212e0 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d  his is a perform
212f0 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20  ance boost,.    
21300 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c  ** as the vdbe l
21310 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c  evel waits until
21320 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65   the table is re
21330 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ad before actual
21340 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e  ly.    ** seekin
21350 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  g the table curs
21360 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  or to the record
21370 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
21380 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
21390 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e    ** position in
213a0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
213b0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
213c0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
213d0 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
213e0 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
213f0 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
21400 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
21410 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
21420 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
21430 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
21440 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
21450 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
21460 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
21470 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
21480 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
21490 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
214a0 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
214b0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
214c0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
214d0 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
214e0 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
214f0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
21500 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
21510 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
21520 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21530 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c  d){.      int k,
21540 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
21550 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
21560 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
21570 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
21580 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIdx;.      int 
21590 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70  useIndexOnly = p
215a0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
215b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
215c0 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73 73  ONLY;..      ass
215d0 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
215e0 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
215f0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
21600 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20  pWInfo->iTop);. 
21610 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
21620 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
21630 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
21640 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b  (k=pWInfo->iTop;
21650 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
21660 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
21670 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
21680 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
21690 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
216a0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
216b0 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
216c0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
216d0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
216e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
216f0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
21700 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
21710 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
21720 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a     pOp->p2 = j;.
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
21740 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
21750 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
21760 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21790 20 20 61 73 73 65 72 74 28 21 75 73 65 49 6e 64    assert(!useInd
217a0 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78  exOnly || j<pIdx
217b0 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->nColumn);.    
217c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
217d0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
217e0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
217f0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
21800 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
21810 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
21820 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
21830 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
21840 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
21850 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73  OP_NullRow && us
21860 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20  eIndexOnly ){.  
21870 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
21880 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
21890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
218a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
218b0 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
218c0 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46   */.  whereInfoF
218d0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
218e0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.