/ Hex Artifact Content
Login

Artifact 8c8b360d898fe1fa7994ad6171d999aad6318cfd:


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 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 30 34   where.c,v 1.304
0340: 20 32 30 30 38 2f 30 35 2f 32 36 20 31 38 3a 33   2008/05/26 18:3
0350: 33 3a 34 31 20 64 72 68 20 45 78 70 20 24 0a 2a  3:41 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  )../*.** Trace o
03f0: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0410: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0420: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0430: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
0440: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 20 64  reTrace = 0;.# d
0450: 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43 45  efine WHERETRACE
0460: 28 58 29 20 20 69 66 28 73 71 6c 69 74 65 33 57  (X)  if(sqlite3W
0470: 68 65 72 65 54 72 61 63 65 29 20 73 71 6c 69 74  hereTrace) sqlit
0480: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a  e3DebugPrintf X.
0490: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
04a0: 48 45 52 45 54 52 41 43 45 28 58 29 0a 23 65 6e  HERETRACE(X).#en
04b0: 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  dif../* Forward 
04c0: 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79 70  reference.*/.typ
04d0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04e0: 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c 61  eClause WhereCla
04f0: 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  use;.typedef str
0500: 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74 20  uct ExprMaskSet 
0510: 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 0a 2f 2a  ExprMaskSet;../*
0520: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0530: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0540: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0550: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0560: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0570: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0580: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
0590: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05a0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05b0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05c0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05e0: 65 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ers by an AND op
05f0: 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  erator..**.** Al
0600: 6c 20 57 68 65 72 65 54 65 72 6d 73 20 61 72 65  l WhereTerms are
0610: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
0620: 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c  a single WhereCl
0630: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
0640: 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69   .** The followi
0650: 6e 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64  ng identity hold
0660: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
0670: 57 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61  WhereTerm.pWC->a
0680: 5b 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20  [WhereTerm.idx] 
0690: 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a  == WhereTerm.**.
06a0: 2a 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69  ** When a term i
06b0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
06c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
06d0: 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a    X <op> <expr>.
06e0: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  **.** where X is
06f0: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61   a column name a
0700: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
0710: 66 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74  f certain operat
0720: 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65  ors,.** then Whe
0730: 72 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f  reTerm.leftCurso
0740: 72 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e  r and WhereTerm.
0750: 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72  leftColumn recor
0760: 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  d the.** cursor 
0770: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
0780: 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20  n number for X. 
0790: 20 57 68 65 72 65 54 65 72 6d 2e 6f 70 65 72 61   WhereTerm.opera
07a0: 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  tor records.** t
07b0: 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20  he <op> using a 
07c0: 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67  bitmask encoding
07d0: 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78   defined by WO_x
07e0: 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a  xx below.  The.*
07f0: 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61  * use of a bitma
0800: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  sk encoding for 
0810: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c  the operator all
0820: 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63 68  ows us to search
0830: 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20  .** quickly for 
0840: 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68  terms that match
0850: 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20   any of several 
0860: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
0870: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65  ors..**.** prere
0880: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0890: 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73  qAll record sets
08a0: 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65   of cursor numbe
08b0: 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20  rs,.** but they 
08c0: 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79  do so indirectly
08d0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 45 78 70 72  .  A single Expr
08e0: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
08f0: 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20  e translates.** 
0900: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
0910: 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20  to bits and the 
0920: 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69  translated bit i
0930: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
0940: 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73  prereq.** fields
0950: 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  .  The translati
0960: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72  on is used in or
0970: 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20  der to maximize 
0980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
0990: 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20   bits that will 
09a0: 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  fit in a Bitmask
09b0: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
09c0: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
09d0: 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75   be.** spread ou
09e0: 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e  t over the non-n
09f0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
0a00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
0a10: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  the cursor.** nu
0a20: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33  mbers might be 3
0a30: 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20  , 8, 9, 10, 20, 
0a40: 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20  23, 41, and 45. 
0a50: 20 54 68 65 20 45 78 70 72 4d 61 73 6b 53 65 74   The ExprMaskSet
0a60: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74  .** translates t
0a70: 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72 73  hese sparse curs
0a80: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
0a90: 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65  consecutive inte
0aa0: 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e  gers.** beginnin
0ab0: 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65  g with 0 in orde
0ac0: 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65  r to make the be
0ad0: 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20  st possible use 
0ae0: 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  of the available
0af0: 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20  .** bits in the 
0b00: 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e  Bitmask.  So, in
0b10: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
0b20: 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ve, the cursor n
0b30: 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20  umbers.** would 
0b40: 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69  be mapped into i
0b50: 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75 67  ntegers 0 throug
0b60: 68 20 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  h 7..*/.typedef 
0b70: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0b80: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0b90: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0ba0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0bc0: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0bd0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 31  pression */.  i1
0be0: 36 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  6 iParent;      
0bf0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
0c00: 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d   pWC->a[iParent]
0c10: 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20   when this term 
0c20: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 31  disabled */.  i1
0c30: 36 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20  6 leftCursor;   
0c40: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
0c50: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
0c60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
0c70: 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 6f 6c 75  /.  i16 leftColu
0c80: 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  mn;         /* C
0c90: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
0ca0: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
0cb0: 70 72 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65 4f  pr>" */.  u16 eO
0cc0: 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20 20  perator;        
0cd0: 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c    /* A WO_xx val
0ce0: 75 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c 6f  ue describing <o
0cf0: 70 3e 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73  p> */.  u8 flags
0d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0d10: 2f 2a 20 42 69 74 20 66 6c 61 67 73 2e 20 20 53  /* Bit flags.  S
0d20: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
0d30: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
0d40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d50: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
0d60: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
0d70: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
0d80: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
0d90: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
0da0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
0db0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
0dc0: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
0dd0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
0de0: 65 73 20 75 73 65 64 20 62 79 20 70 52 69 67 68  es used by pRigh
0df0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
0e00: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f  rereqAll;      /
0e10: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
0e20: 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62  les referenced b
0e30: 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  y p */.};../*.**
0e40: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
0e50: 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 66 6c 61  of WhereTerm.fla
0e60: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
0e70: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
0e80: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
0e90: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
0ea0: 44 65 6c 65 74 65 28 70 45 78 70 72 29 20 2a 2f  Delete(pExpr) */
0eb0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
0ec0: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
0ed0: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
0ee0: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
0ef0: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
0f00: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
0f10: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
0f20: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
0f30: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
0f40: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
0f50: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
0f60: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
0f70: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
0f80: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 55 73      0x10   /* Us
0f90: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
0fa0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
0fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
0fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
0fe0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
0ff0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
1000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1010: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1020: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1030: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1040: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1050: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1060: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1080: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1090: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
10a0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 2f 2a   *pMaskSet;   /*
10b0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
10c0: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62 69 74  e indices to bit
10d0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  masks */.  int n
10e0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
10f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1100: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
1110: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
1120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1130: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
1140: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1150: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
1160: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
1170: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
1180: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
1190: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  */.  WhereTerm a
11a0: 53 74 61 74 69 63 5b 31 30 5d 3b 20 20 20 2f 2a  Static[10];   /*
11b0: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
11c0: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
11d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
11e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
11f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1200: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
1210: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65   a mapping.** be
1220: 74 77 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f  tween VDBE curso
1230: 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69  r numbers and bi
1240: 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73  ts of the bitmas
1250: 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e  ks in WhereTerm.
1260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
1270: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  cursor numbers a
1280: 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72  re small integer
1290: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a  s contained in .
12a0: 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  ** SrcList_item.
12b0: 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72  iCursor and Expr
12c0: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20  .iTable fields. 
12d0: 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57   For any given W
12e0: 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  HERE .** clause,
12f0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
1300: 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ers might not be
1310: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74  gin with 0 and t
1320: 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e  hey might.** con
1330: 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65  tain gaps in the
1340: 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65   numbering seque
1350: 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e  nce.  But we wan
1360: 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75  t to make maximu
1370: 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20  m.** use of the 
1380: 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d  bits in our bitm
1390: 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75  asks.  This stru
13a0: 63 74 75 72 65 20 70 72 6f 76 69 64 65 73 20 61  cture provides a
13b0: 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d   mapping.** from
13c0: 20 74 68 65 20 73 70 61 72 73 65 20 63 75 72 73   the sparse curs
13d0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
13e0: 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65  consecutive inte
13f0: 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  gers beginning.*
1400: 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20  * with 0..**.** 
1410: 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74 2e 69  If ExprMaskSet.i
1420: 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73  x[A]==B it means
1430: 20 74 68 61 74 20 54 68 65 20 41 2d 74 68 20 62   that The A-th b
1440: 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a  it of a Bitmask.
1450: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56  ** corresponds V
1460: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1470: 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62  r B.  The A-th b
1480: 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20  it of a bitmask 
1490: 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46  is 1<<A..**.** F
14a0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
14b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14c0: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
14d0: 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75  these VDBE.** cu
14e0: 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c  rsors:  4, 5, 8,
14f0: 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68   29, 57, 73.  Th
1500: 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61 73 6b  en the  ExprMask
1510: 53 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  Set structure.**
1520: 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65   would map those
1530: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1540: 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f  into bits 0 thro
1550: 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ugh 5..**.** Not
1560: 65 20 74 68 61 74 20 74 68 65 20 6d 61 70 70 69  e that the mappi
1570: 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ng is not necess
1580: 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20  arily ordered.  
1590: 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a  In the example.*
15a0: 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70  * above, the map
15b0: 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69  ping might go li
15c0: 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20  ke this:  4->3, 
15d0: 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e  5->1, 8->2, 29->
15e0: 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d  0,.** 57->5, 73-
15f0: 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37  >4.  Or one of 7
1600: 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61  19 other combina
1610: 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75  tions might be u
1620: 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20  sed. It.** does 
1630: 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65  not really matte
1640: 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f  r.  What is impo
1650: 72 74 61 6e 74 20 69 73 20 74 68 61 74 20 73 70  rtant is that sp
1660: 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  arse cursor.** n
1670: 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d  umbers all get m
1680: 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e  apped into bit n
1690: 75 6d 62 65 72 73 20 74 68 61 74 20 62 65 67 69  umbers that begi
16a0: 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e  n with 0 and con
16b0: 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e  tain.** no gaps.
16c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 78 70 72 4d  .*/.struct ExprM
16d0: 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e  askSet {.  int n
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1700: 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63  er of assigned c
1710: 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a  ursor values */.
1720: 20 20 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66 28    int ix[sizeof(
1730: 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20 20  Bitmask)*8];    
1740: 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e  /* Cursor assign
1750: 65 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a  ed to each bit *
1760: 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74  /.};.../*.** Bit
1770: 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70  masks for the op
1780: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64  erators that ind
1790: 69 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  ices are able to
17a0: 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a   exploit.  An.**
17b0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
17c0: 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75  on of these valu
17d0: 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  es can be used w
17e0: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  hen searching fo
17f0: 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68  r.** terms in th
1800: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a  e where clause..
1810: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e  */.#define WO_IN
1820: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57       1.#define W
1830: 4f 5f 45 51 20 20 20 20 20 32 0a 23 64 65 66 69  O_EQ     2.#defi
1840: 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f  ne WO_LT     (WO
1850: 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45  _EQ<<(TK_LT-TK_E
1860: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c  Q)).#define WO_L
1870: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
1880: 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_LE-TK_EQ)).#de
1890: 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28  fine WO_GT     (
18a0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b  WO_EQ<<(TK_GT-TK
18b0: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
18c0: 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _GE     (WO_EQ<<
18d0: 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23  (TK_GE-TK_EQ)).#
18e0: 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20  define WO_MATCH 
18f0: 20 36 34 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49   64.#define WO_I
1900: 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f 2a 0a 2a 2a  SNULL 128../*.**
1910: 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73   Value for flags
1920: 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73   returned by bes
1930: 74 49 6e 64 65 78 28 29 2e 20 20 0a 2a 2a 0a 2a  tIndex().  .**.*
1940: 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e  * The least sign
1950: 69 66 69 63 61 6e 74 20 62 79 74 65 20 69 73 20  ificant byte is 
1960: 72 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61  reserved as a ma
1970: 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65  sk for WO_ value
1980: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20  s above..** The 
1990: 57 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61 67 73  WhereLevel.flags
19a0: 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c   field is usuall
19b0: 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57  y set to WO_IN|W
19c0: 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a  O_EQ|WO_ISNULL..
19d0: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 61  ** But if the ta
19e0: 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
19f0: 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74   table of a left
1a00: 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65   join, WhereLeve
1a10: 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  l.flags.** is se
1a20: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
1a30: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
1a40: 6c 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 63 61  l.flags field ca
1a50: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
1a60: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
1a70: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
1a80: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
1a90: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
1aa0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
1ab0: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
1ac0: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
1ad0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
1ae0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1af0: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
1b00: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
1b10: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
1b20: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
1b30: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 31  ID_EQ     0x0001
1b40: 30 30 20 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  00   /* rowid=EX
1b50: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
1b60: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
1b70: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1b80: 45 20 20 30 78 30 30 30 32 30 30 20 20 20 2f 2a  E  0x000200   /*
1b90: 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64 2f   rowid<EXPR and/
1ba0: 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f  or rowid>EXPR */
1bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
1bc0: 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30  OLUMN_EQ    0x00
1bd0: 31 30 30 30 20 20 20 2f 2a 20 78 3d 45 58 50 52  1000   /* x=EXPR
1be0: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   or x IN (...) *
1bf0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1c00: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
1c10: 30 32 30 30 30 20 20 20 2f 2a 20 78 3c 45 58 50  02000   /* x<EXP
1c20: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
1c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1c40: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
1c50: 30 30 34 30 30 30 20 20 20 2f 2a 20 78 20 49 4e  004000   /* x IN
1c60: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1c70: 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  e WHERE_TOP_LIMI
1c80: 54 20 20 20 20 30 78 30 31 30 30 30 30 20 20 20  T    0x010000   
1c90: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d  /* x<EXPR or x<=
1ca0: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
1cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1cc0: 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78  _BTM_LIMIT    0x
1cd0: 30 32 30 30 30 30 20 20 20 2f 2a 20 78 3e 45 58  020000   /* x>EX
1ce0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
1cf0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
1d00: 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ine WHERE_IDX_ON
1d10: 4c 59 20 20 20 20 20 30 78 30 38 30 30 30 30 20  LY     0x080000 
1d20: 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f    /* Use index o
1d30: 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65  nly - omit table
1d40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1d50: 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 30  E_ORDERBY      0
1d60: 78 31 30 30 30 30 30 20 20 20 2f 2a 20 4f 75 74  x100000   /* Out
1d70: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
1d80: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
1d90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1da0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 30  E_REVERSE      0
1db0: 78 32 30 30 30 30 30 20 20 20 2f 2a 20 53 63 61  x200000   /* Sca
1dc0: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1dd0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1de0: 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20  ERE_UNIQUE      
1df0: 20 30 78 34 30 30 30 30 30 20 20 20 2f 2a 20 53   0x400000   /* S
1e00: 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74  elects no more t
1e10: 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23  han one row */.#
1e20: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52  define WHERE_VIR
1e30: 54 55 41 4c 54 41 42 4c 45 20 30 78 38 30 30 30  TUALTABLE 0x8000
1e40: 30 30 20 20 20 2f 2a 20 55 73 65 20 76 69 72 74  00   /* Use virt
1e50: 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73  ual-table proces
1e60: 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  sing */../*.** I
1e70: 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61  nitialize a prea
1e80: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c  llocated WhereCl
1e90: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ause structure..
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1eb0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a  hereClauseInit(.
1ec0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1ed0: 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  WC,        /* Th
1ee0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f  e WhereClause to
1ef0: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1f00: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
1f20: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1f30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61  text */.  ExprMa
1f40: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20  skSet *pMaskSet 
1f50: 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
1f60: 6f 6d 20 74 61 62 6c 65 20 69 6e 64 69 63 65 73  om table indices
1f70: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
1f80: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
1f90: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
1fa0: 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61  ->pMaskSet = pMa
1fb0: 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 6e 54  skSet;.  pWC->nT
1fc0: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e  erm = 0;.  pWC->
1fd0: 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  nSlot = ArraySiz
1fe0: 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b  e(pWC->aStatic);
1ff0: 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d  .  pWC->a = pWC-
2000: 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a  >aStatic;.}../*.
2010: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2030: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
2040: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2050: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
2060: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
2070: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
2080: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
2090: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
20a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
20b0: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
20c0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
20d0: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
20e0: 54 65 72 6d 20 2a 61 3b 0a 20 20 66 6f 72 28 69  Term *a;.  for(i
20f0: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61  =pWC->nTerm-1, a
2100: 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  =pWC->a; i>=0; i
2110: 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66  --, a++){.    if
2120: 28 20 61 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  ( a->flags & TER
2130: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
2140: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2150: 6c 65 74 65 28 61 2d 3e 70 45 78 70 72 29 3b 0a  lete(a->pExpr);.
2160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2170: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
2180: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
2190: 74 65 33 5f 66 72 65 65 28 70 57 43 2d 3e 61 29  te3_free(pWC->a)
21a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
21b0: 64 64 20 61 20 6e 65 77 20 65 6e 74 72 69 65 73  dd a new entries
21c0: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
21d0: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  use structure.  
21e0: 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
21f0: 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61 63 65 20  ocated.** space 
2200: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
2210: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6c 61 67 73  .** If the flags
2220: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
2230: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
2240: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
2250: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
2260: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
2270: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
2280: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
2290: 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
22a0: 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20   WARNING:  This 
22b0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
22c0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61  allocate the spa
22d0: 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ce used to store
22e0: 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20  .** WhereTerms. 
22f0: 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f   All pointers to
2300: 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75   WhereTerms shou
2310: 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 65 64 20  ld be invalided 
2320: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
2330: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
2340: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
2350: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
2360: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
2370: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
2380: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
2390: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
23a0: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
23b0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
23c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
23d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
23e0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
23f0: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
2400: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
2410: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2420: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
2430: 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65   pWC->a = sqlite
2440: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
2450: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
2460: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
2470: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
2480: 0a 20 20 20 20 20 20 70 57 43 2d 3e 70 50 61 72  .      pWC->pPar
2490: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
24a0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
24b0: 69 66 28 20 66 6c 61 67 73 20 26 20 54 45 52 4d  if( flags & TERM
24c0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
24d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
24e0: 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 20 20  elete(p);.      
24f0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
2500: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
2510: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
2520: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
2530: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
2540: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
2550: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
2560: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
2570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2580: 5f 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20  _free(pOld);.   
2590: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
25a0: 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54  t *= 2;.  }.  pT
25b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
25c0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  x = pWC->nTerm];
25d0: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b  .  pWC->nTerm++;
25e0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
25f0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c  = p;.  pTerm->fl
2600: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
2610: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
2620: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
2630: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2640: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
2650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
2660: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
2670: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
2680: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
2690: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
26a0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
26b0: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
26c0: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
26d0: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
26e0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
26f0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
2700: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
2710: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
2720: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
2730: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
2740: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
2750: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2760: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
2770: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
2780: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
2790: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
27a0: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
27b0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
27c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
27d0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
27e0: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
27f0: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
2800: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
2810: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2820: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
2830: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
2840: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
2850: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
2860: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
2870: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
2880: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
2890: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
28a0: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
28b0: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
28c0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
28d0: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
28e0: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
28f0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
2900: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
2910: 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67  y.  This array g
2920: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
2930: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2940: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2950: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2960: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2970: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
2980: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
2990: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
29a0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
29b0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
29c0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
29d0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
29e0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
29f0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
2a00: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2a10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
2a20: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
2a30: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2a40: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
2a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2a60: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
2a70: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
2a80: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
2a90: 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20  t(P)  memset(P, 
2aa0: 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a  0, sizeof(*P))..
2ab0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2ac0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
2ad0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
2ae0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
2af0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
2b00: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
2b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2b20: 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d  sk getMask(ExprM
2b30: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2b40: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
2b50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2b60: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
2b70: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
2b80: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
2b90: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
2ba0: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
2bb0: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
2bc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2be0: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
2bf0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
2c00: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
2c10: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
2c20: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2c30: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
2c40: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
2c50: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c60: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2c70: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
2c80: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2c90: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
2ca0: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
2cb0: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
2cc0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
2cd0: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
2ce0: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
2cf0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
2d00: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
2d10: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2d20: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
2d30: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
2d40: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
2d50: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
2d60: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
2d70: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
2d80: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2d90: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
2da0: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
2db0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2dc0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
2dd0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
2de0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
2df0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
2e00: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
2e10: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
2e20: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
2e30: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
2e40: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2e50: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
2e60: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
2e70: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70  voked sqlite3Exp
2e80: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2e90: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2ea0: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
2eb0: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
2ec0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
2ed0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ee0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
2ef0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2f00: 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  lveNames() routi
2f10: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
2f20: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
2f30: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
2f40: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
2f50: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
2f60: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
2f70: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
2f80: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
2f90: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
2fa0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
2fb0: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
2fc0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2fd0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
2fe0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
2ff0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
3000: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
3010: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
3020: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
3030: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
3040: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
3050: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
3060: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
3070: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65  ExprMaskSet*, Se
3080: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
3090: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
30a0: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
30b0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
30c0: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
30d0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
30e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
30f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
3100: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
3110: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
3120: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
3130: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
3140: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
3150: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
3160: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
3170: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
3180: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3190: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
31a0: 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  eft);.  mask |= 
31b0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
31c0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
31d0: 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pList);.  mask |
31e0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
31f0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3200: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
3210: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
3220: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3230: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3240: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
3250: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
3260: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
3270: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
3280: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
3290: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
32a0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
32b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
32c0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
32d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
32e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
32f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
3300: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
3310: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3320: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
3330: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
3340: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
3350: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
3360: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69   mask = 0;.  whi
3370: 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61  le( pS ){.    ma
3380: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
3390: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
33a0: 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a  t, pS->pEList);.
33b0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
33c0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
33d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72  MaskSet, pS->pGr
33e0: 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  oupBy);.    mask
33f0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3400: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3410: 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a   pS->pOrderBy);.
3420: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3430: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3440: 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29  Set, pS->pWhere)
3450: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3460: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3470: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69  skSet, pS->pHavi
3480: 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53  ng);.    pS = pS
3490: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
34a0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
34b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
34c0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
34d0: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
34e0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
34f0: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
3500: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
3510: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
3520: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
3530: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
3540: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
3550: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
3560: 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61  and "IN"..*/.sta
3570: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f  tic int allowedO
3580: 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73  p(int op){.  ass
3590: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
35a0: 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20   && TK_GT<TK_GE 
35b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
35c0: 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LT>TK_EQ && TK_L
35d0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
35e0: 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51  ert( TK_LE>TK_EQ
35f0: 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20   && TK_LE<TK_GE 
3600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
3610: 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20  GE==TK_EQ+4 );. 
3620: 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49   return op==TK_I
3630: 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20  N || (op>=TK_EQ 
3640: 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c  && op<=TK_GE) ||
3650: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a   op==TK_ISNULL;.
3660: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77  }../*.** Swap tw
3670: 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70  o objects of typ
3680: 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e T..*/.#define 
3690: 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b  SWAP(TYPE,A,B) {
36a0: 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42  TYPE t=A; A=B; B
36b0: 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  =t;}../*.** Comm
36c0: 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 69 6f  ute a comparisio
36d0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
36e0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
36f0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
3700: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3710: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
3720: 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69  .** If a collati
3730: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  on sequence is a
3740: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
3750: 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f  ither the left o
3760: 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20  r right.** side 
3770: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
3780: 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73  n, it remains as
3790: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
37a0: 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65  e same side afte
37b0: 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61  r.** the commuta
37c0: 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c  tion. So "Y coll
37d0: 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22  ate NOCASE op X"
37e0: 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20   becomes .** "X 
37f0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
3800: 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65  p Y". This is be
3810: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
3820: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
3830: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
3840: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
3850: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
3860: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
3870: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
3880: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
3890: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
38a0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70  eason the EP_Exp
38b0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20  Collate flag.** 
38c0: 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e  is not commuted.
38d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38e0: 65 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72  exprCommute(Expr
38f0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
3900: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
3910: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
3920: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3930: 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74  );.  u16 expLeft
3940: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
3950: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
3960: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65  Collate);.  asse
3970: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45  rt( allowedOp(pE
3980: 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70  xpr->op) && pExp
3990: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op!=TK_IN );.
39a0: 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c    SWAP(CollSeq*,
39b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
39c0: 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66  Coll,pExpr->pLef
39d0: 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78  t->pColl);.  pEx
39e0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
39f0: 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67  s = (pExpr->pRig
3a00: 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f  ht->flags & ~EP_
3a10: 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78  ExpCollate) | ex
3a20: 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e  pLeft;.  pExpr->
3a30: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28  pLeft->flags = (
3a40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
3a50: 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c  ags & ~EP_ExpCol
3a60: 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67 68 74  late) | expRight
3a70: 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  ;.  SWAP(Expr*,p
3a80: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
3a90: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
3aa0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3ab0: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
3ac0: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
3ad0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3ae0: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
3af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3b00: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
3b10: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
3b20: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
3b30: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
3b40: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
3b50: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
3b60: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
3b70: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
3b80: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
3b90: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
3ba0: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
3bb0: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
3bc0: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
3bd0: 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  int operatorMask
3be0: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20  (int op){.  int 
3bf0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
3c00: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
3c10: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
3c20: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
3c30: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3c40: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
3c50: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
3c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d    }else{.    c =
3c70: 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45   WO_EQ<<(op-TK_E
3c80: 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  Q);.  }.  assert
3c90: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
3ca0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
3cb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3cc0: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
3cd0: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
3ce0: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
3cf0: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
3d00: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
3d10: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
3d20: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
3d30: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
3d40: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3d50: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
3d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3d70: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
3d80: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
3d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
3da0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
3db0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3dc0: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
3dd0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
3de0: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
3df0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
3e00: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
3e10: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
3e20: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
3e30: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
3e40: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
3e50: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
3e60: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
3e70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3e80: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
3e90: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
3ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
3eb0: 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28  eTerm *findTerm(
3ec0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3ed0: 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
3ee0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
3ef0: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
3f00: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
3f10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3f20: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
3f30: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
3f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
3f50: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  umn number of LH
3f60: 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  S */.  Bitmask n
3f70: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
3f80: 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65  RHS must not ove
3f90: 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d  rlap with this m
3fa0: 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c  ask */.  u16 op,
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fc0: 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20  * Mask of WO_xx 
3fd0: 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e  values describin
3fe0: 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  g operator */.  
3ff0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
4000: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
4010: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4020: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
4030: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
4040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
4050: 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f  m;.  int k;.  fo
4060: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
4070: 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b  k=pWC->nTerm; k;
4080: 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
4090: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
40a0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
40b0: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
40c0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
40d0: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20  notReady)==0.   
40e0: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65      && pTerm->le
40f0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
4100: 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  n.       && (pTe
4110: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
4120: 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  op)!=0.    ){.  
4130: 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d 30 20      if( iCur>=0 
4140: 26 26 20 70 49 64 78 20 26 26 20 70 54 65 72 6d  && pIdx && pTerm
4150: 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
4160: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
4170: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
4180: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
4190: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
41a0: 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  l;.        char 
41b0: 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20  idxaff;.        
41c0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50  int j;.        P
41d0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
41e0: 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20  WC->pParse;..   
41f0: 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49       idxaff = pI
4200: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4210: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
4220: 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ty;.        if( 
4230: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
4240: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61  inityOk(pX, idxa
4250: 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ff) ) continue;.
4260: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75  .        /* Figu
4270: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
4280: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
4290: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
42a0: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
42b0: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65   ** it to be use
42c0: 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69  ful for optimisi
42d0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  ng expression pX
42e0: 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20  . Store this.   
42f0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e       ** value in
4300: 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e   variable pColl.
4310: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
4320: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
4330: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
4340: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
4350: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
4360: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
4370: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
4380: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
4390: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
43a0: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
43b0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
43c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
43d0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
43e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  pIdx->nColumn &&
43f0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
4400: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
4410: 29 7b 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65  ){}.        asse
4420: 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  rt( j<pIdx->nCol
4430: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 69  umn );.        i
4440: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
4450: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
4460: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
4470: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4480: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
4490: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  n pTerm;.    }. 
44a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
44b0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
44c0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
44d0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
44e0: 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72  e(SrcList*, Wher
44f0: 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a  eClause*, int);.
4500: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72  ./*.** Call expr
4510: 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74  Analyze on all t
4520: 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20  erms in a WHERE 
4530: 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a  clause.  .**.**.
4540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4550: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20  xprAnalyzeAll(. 
4560: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
4570: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65  st,       /* the
4580: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
4590: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
45a0: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
45b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
45c0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
45d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
45e0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
45f0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4600: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
4610: 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29  TabList, pWC, i)
4620: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
4640: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
4650: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
4660: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
4670: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
4680: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
4690: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
46a0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
46b0: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
46c0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
46d0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
46e0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
46f0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
4700: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
4710: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
4720: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
4730: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
4740: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
4750: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
4760: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
4770: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
4780: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
4790: 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ob(.  sqlite3 *d
47a0: 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b,      /* The d
47b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78 70  atabase */.  Exp
47c0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
47d0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
47e0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
47f0: 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a  *pnPattern,   /*
4800: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
4810: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
4820: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69  haracters */.  i
4830: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
4840: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4850: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
4860: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
4870: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
4880: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
4890: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
48a0: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
48b0: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
48c0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
48d0: 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70  ar *z;.  Expr *p
48e0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
48f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
4900: 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a  ;.  int c, cnt;.
4910: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20    char wc[3];.  
4920: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
4930: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
4940: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
4950: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
4960: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
4970: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
4980: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
4990: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
49a0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
49b0: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
49c0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67  r->pList;.  pRig
49d0: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
49e0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52  .pExpr;.  if( pR
49f0: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ight->op!=TK_STR
4a00: 49 4e 47 0a 20 20 20 26 26 20 28 70 52 69 67 68  ING.   && (pRigh
4a10: 74 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  t->op!=TK_REGIST
4a20: 45 52 20 7c 7c 20 70 52 69 67 68 74 2d 3e 69 43  ER || pRight->iC
4a30: 6f 6c 75 6d 6e 21 3d 54 4b 5f 53 54 52 49 4e 47  olumn!=TK_STRING
4a40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4a50: 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d  0;.  }.  pLeft =
4a60: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
4a70: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
4a80: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
4a90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4aa0: 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 70 4c    }.  pColl = pL
4ab0: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 61 73  eft->pColl;.  as
4ac0: 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d 30 20 7c  sert( pColl!=0 |
4ad0: 7c 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  | pLeft->iColumn
4ae0: 3d 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 43  ==-1 );.  if( pC
4af0: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  oll==0 ){.    /*
4b00: 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 73   No collation is
4b10: 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68 65   defined for the
4b20: 20 52 4f 57 49 44 2e 20 20 55 73 65 20 74 68 65   ROWID.  Use the
4b30: 20 64 65 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20   default. */.   
4b40: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
4b50: 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66  ltColl;.  }.  if
4b60: 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d  ( (pColl->type!=
4b70: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41  SQLITE_COLL_BINA
4b80: 52 59 20 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20  RY || *pnoCase) 
4b90: 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d  &&.      (pColl-
4ba0: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
4bb0: 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70  LL_NOCASE || !*p
4bc0: 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 72  noCase) ){.    r
4bd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
4be0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
4bf0: 72 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  r(db, pRight);. 
4c00: 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52 69   z = (char *)pRi
4c10: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  ght->token.z;.  
4c20: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  cnt = 0;.  if( z
4c30: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   ){.    while( (
4c40: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
4c50: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
4c60: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
4c70: 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 7d   ){ cnt++; }.  }
4c80: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c  .  if( cnt==0 ||
4c90: 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d   255==(u8)z[cnt]
4ca0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4cb0: 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70  ;.  }.  *pisComp
4cc0: 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77  lete = z[cnt]==w
4cd0: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
4ce0: 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72  ==0;.  *pnPatter
4cf0: 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75 72  n = cnt;.  retur
4d00: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
4d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
4d20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
4d30: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
4d40: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4d50: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
4d60: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
4d70: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
4d80: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
4d90: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c  *.**         col
4da0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a  umn MATCH expr.*
4db0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68  *.** If it is th
4dc0: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
4dd0: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
4de0: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
4df0: 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f   int isMatchOfCo
4e00: 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45  lumn(.  Expr *pE
4e10: 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74  xpr      /* Test
4e20: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
4e30: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
4e40: 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28  t *pList;..  if(
4e50: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
4e60: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72  UNCTION ){.    r
4e70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
4e80: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
4e90: 6e 21 3d 35 20 7c 7c 0a 20 20 20 20 20 20 20 73  n!=5 ||.       s
4ea0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
4eb0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 45 78 70  const char*)pExp
4ec0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74 63  r->token.z,"matc
4ed0: 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20 20  h",5)!=0 ){.    
4ee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4ef0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
4f00: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
4f10: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
4f20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4f30: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
4f40: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
4f50: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
4f60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4f70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
4f80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4f90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
4fa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
4fb0: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
4fc0: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
4fd0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
4fe0: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
4ff0: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
5000: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
5010: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
5020: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
5030: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
5040: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
5050: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
5060: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
5070: 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73   pDerived->flags
5080: 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73   |= pBase->flags
5090: 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a   & EP_FromJoin;.
50a0: 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67    pDerived->iRig
50b0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42  htJoinTable = pB
50c0: 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ase->iRightJoinT
50d0: 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  able;.}..#if !de
50e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
50f0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
5100: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
5110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5120: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ERY)./*.** Retur
5130: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
5140: 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  ven term of an O
5150: 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  R clause can be 
5160: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 69 6e 74  converted.** int
5170: 6f 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 2e 20  o an IN clause. 
5180: 20 54 68 65 20 69 43 75 72 73 6f 72 20 61 6e 64   The iCursor and
5190: 20 69 43 6f 6c 75 6d 6e 20 64 65 66 69 6e 65 20   iColumn define 
51a0: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 0a 2a 2a  the left-hand.**
51b0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
51c0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
51d0: 65 20 63 6f 6e 74 65 78 74 20 69 73 20 74 68 61  e context is tha
51e0: 74 20 77 65 20 68 61 76 65 20 6d 75 6c 74 69 70  t we have multip
51f0: 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  le OR-connected 
5200: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 0a 2a  equality terms.*
5210: 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
5220: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d 3c  **           a=<
5230: 65 78 70 72 31 3e 20 4f 52 20 20 61 3d 3c 65 78  expr1> OR  a=<ex
5240: 70 72 32 3e 20 4f 52 20 62 3d 3c 65 78 70 72 33  pr2> OR b=<expr3
5250: 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  >  OR ....**.** 
5260: 54 68 65 20 70 4f 72 54 65 72 6d 20 69 6e 70 75  The pOrTerm inpu
5270: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
5280: 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
5290: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   a single term o
52a0: 66 0a 2a 2a 20 74 68 69 73 20 4f 52 20 63 6c 61  f.** this OR cla
52b0: 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66  use.  In order f
52c0: 6f 72 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  or the term to b
52d0: 65 20 61 20 63 6f 6e 64 69 64 61 74 65 20 66 6f  e a condidate fo
52e0: 72 0a 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20  r.** conversion 
52f0: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
5300: 72 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r, the following
5310: 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 2a   must be true:.*
5320: 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20  *.**     *  The 
5330: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
5340: 66 20 74 68 65 20 74 65 72 6d 20 6d 75 73 74 20  f the term must 
5350: 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 68  be the column wh
5360: 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 69 73  ich.**        is
5370: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69   identified by i
5380: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
5390: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  mn..**.**     * 
53a0: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
53b0: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
53c0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
53d0: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 2a 2a  he affinities.**
53e0: 20 20 20 20 20 20 20 20 6f 66 20 62 6f 74 68 20          of both 
53f0: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
5400: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
5410: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 2a  h that no type.*
5420: 2a 20 20 20 20 20 20 20 20 63 6f 6e 76 65 72 73  *        convers
5430: 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
5440: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  d on the right. 
5450: 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a   (Ticket #2249).
5460: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 6f 66  **.** If both of
5470: 20 74 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   these condition
5480: 73 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  s are true, then
5490: 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f   return true.  O
54a0: 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
54b0: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
54c0: 74 69 63 20 69 6e 74 20 6f 72 54 65 72 6d 49 73  tic int orTermIs
54d0: 4f 70 74 43 61 6e 64 69 64 61 74 65 28 57 68 65  OptCandidate(Whe
54e0: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 2c  reTerm *pOrTerm,
54f0: 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 69 6e   int iCursor, in
5500: 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e  t iColumn){.  in
5510: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
5520: 67 68 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ght;.  assert( p
5530: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
5540: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 69 66  r==WO_EQ );.  if
5550: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
5560: 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29  ursor!=iCursor )
5570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5580: 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 54 65 72    }.  if( pOrTer
5590: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  m->leftColumn!=i
55a0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65  Column ){.    re
55b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 66  turn 0;.  }.  af
55c0: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
55d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
55e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
55f0: 67 68 74 29 3b 0a 20 20 69 66 28 20 61 66 66 52  ght);.  if( affR
5600: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
5610: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
5620: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
5630: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
5640: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
5650: 66 74 29 3b 0a 20 20 69 66 28 20 61 66 66 52 69  ft);.  if( affRi
5660: 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a  ght!=affLeft ){.
5670: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5680: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
5690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
56a0: 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
56b0: 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63 6c  term of an OR cl
56c0: 61 75 73 65 20 63 61 6e 20 62 65 20 69 67 6e 6f  ause can be igno
56d0: 72 65 64 20 64 75 72 69 6e 67 0a 2a 2a 20 61 20  red during.** a 
56e0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
56f0: 72 65 20 61 6c 6c 20 4f 52 20 74 65 72 6d 73 20  re all OR terms 
5700: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
5710: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  or optimization.
5720: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
5730: 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20  ds, return true 
5740: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  if a call to the
5750: 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e 64   orTermIsOptCand
5760: 69 64 61 74 65 28 29 0a 2a 2a 20 61 62 6f 76 65  idate().** above
5770: 20 72 65 74 75 72 6e 65 64 20 66 61 6c 73 65 20   returned false 
5780: 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  but it is not ne
5790: 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 71 75  cessary to disqu
57a0: 61 6c 69 66 79 20 74 68 65 0a 2a 2a 20 6f 70 74  alify the.** opt
57b0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  imization..**.**
57c0: 20 53 75 70 70 6f 73 65 20 74 68 65 20 6f 72 69   Suppose the ori
57d0: 67 69 6e 61 6c 20 4f 52 20 70 68 72 61 73 65 20  ginal OR phrase 
57e0: 77 61 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  was this:.**.** 
57f0: 20 20 20 20 20 20 20 20 20 20 61 3d 34 20 20 4f            a=4  O
5800: 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61 3d 62  R  a=11  OR  a=b
5810: 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 6e  .**.** During an
5820: 61 6c 79 73 69 73 2c 20 74 68 65 20 74 68 69 72  alysis, the thir
5830: 64 20 74 65 72 6d 20 67 65 74 73 20 66 6c 69 70  d term gets flip
5840: 70 65 64 20 61 72 6f 75 6e 64 20 61 6e 64 20 64  ped around and d
5850: 75 70 6c 69 63 61 74 65 0a 2a 2a 20 73 6f 20 74  uplicate.** so t
5860: 68 61 74 20 77 65 20 61 72 65 20 6c 65 66 74 20  hat we are left 
5870: 77 69 74 68 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  with this:.**.**
5880: 20 20 20 20 20 20 20 20 20 20 20 61 3d 34 20 20             a=4  
5890: 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61 3d  OR  a=11  OR  a=
58a0: 62 20 20 4f 52 20 20 62 3d 61 0a 2a 2a 0a 2a 2a  b  OR  b=a.**.**
58b0: 20 53 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20   Since the last 
58c0: 74 77 6f 20 74 65 72 6d 73 20 61 72 65 20 64 75  two terms are du
58d0: 70 6c 69 63 61 74 65 73 2c 20 6f 6e 6c 79 20 6f  plicates, only o
58e0: 6e 65 20 6f 66 20 74 68 65 6d 0a 2a 2a 20 68 61  ne of them.** ha
58f0: 73 20 74 6f 20 71 75 61 6c 69 66 79 20 69 6e 20  s to qualify in 
5900: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 77 68  order for the wh
5910: 6f 6c 65 20 70 68 72 61 73 65 20 74 6f 20 71 75  ole phrase to qu
5920: 61 6c 69 66 79 2e 20 20 57 68 65 6e 0a 2a 2a 20  alify.  When.** 
5930: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5940: 63 61 6c 6c 65 64 2c 20 77 65 20 6b 6e 6f 77 20  called, we know 
5950: 74 68 61 74 20 70 4f 72 54 65 72 6d 20 64 69 64  that pOrTerm did
5960: 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e 0a 2a 2a   not qualify..**
5970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
5980: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5990: 65 65 20 69 66 20 70 4f 72 54 65 72 6d 20 68 61  ee if pOrTerm ha
59a0: 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 74 68  s a duplicate th
59b0: 61 74 0a 2a 2a 20 6d 69 67 68 74 20 71 75 61 6c  at.** might qual
59c0: 69 66 79 2e 20 20 49 66 20 74 68 65 72 65 20 69  ify.  If there i
59d0: 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 74 68  s a duplicate th
59e0: 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  at has not yet b
59f0: 65 65 6e 0a 2a 2a 20 64 69 73 71 75 61 6c 69 66  een.** disqualif
5a00: 69 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ied, then return
5a10: 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 72 65   true.  If there
5a20: 20 61 72 65 20 6e 6f 20 64 75 70 6c 69 63 61 74   are no duplicat
5a30: 65 73 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 64 75  es, or.** the du
5a40: 70 6c 69 63 61 74 65 20 68 61 73 20 61 6c 73 6f  plicate has also
5a50: 20 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66 65   been disqualife
5a60: 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  d, return false.
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
5a80: 72 54 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69 63  rTermHasOkDuplic
5a90: 61 74 65 28 57 68 65 72 65 43 6c 61 75 73 65 20  ate(WhereClause 
5aa0: 2a 70 4f 72 2c 20 57 68 65 72 65 54 65 72 6d 20  *pOr, WhereTerm 
5ab0: 2a 70 4f 72 54 65 72 6d 29 7b 0a 20 20 69 66 28  *pOrTerm){.  if(
5ac0: 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20   pOrTerm->flags 
5ad0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
5ae0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
5af0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
5b00: 6d 2e 20 20 54 68 65 20 64 75 70 6c 69 63 61 74  m.  The duplicat
5b10: 65 20 69 73 20 74 6f 20 74 68 65 20 6c 65 66 74  e is to the left
5b20: 20 68 61 64 0a 20 20 20 20 2a 2a 20 68 61 73 20   had.    ** has 
5b30: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61 6e 61  not yet been ana
5b40: 6c 79 7a 65 64 20 61 6e 64 20 74 68 75 73 20 68  lyzed and thus h
5b50: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
5b60: 64 69 73 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f  disqualified. */
5b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5b80: 20 7d 0a 20 20 69 66 28 20 28 70 4f 72 54 65 72   }.  if( (pOrTer
5b90: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
5ba0: 56 49 52 54 55 41 4c 29 21 3d 30 0a 20 20 20 20  VIRTUAL)!=0.    
5bb0: 20 26 26 20 28 70 4f 72 2d 3e 61 5b 70 4f 72 54   && (pOr->a[pOrT
5bc0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c  erm->iParent].fl
5bd0: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b  ags & TERM_OR_OK
5be0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  )!=0 ){.    /* T
5bf0: 68 69 73 20 69 73 20 61 20 64 75 70 6c 69 63 61  his is a duplica
5c00: 74 65 20 74 65 72 6d 2e 20 20 54 68 65 20 6f 72  te term.  The or
5c10: 69 67 69 6e 61 6c 20 71 75 61 6c 69 66 69 65 64  iginal qualified
5c20: 20 73 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20   so this one.   
5c30: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
5c40: 65 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 72 65 74  e to. */.    ret
5c50: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 1;.  }.  /* 
5c60: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  This is either a
5c70: 20 73 69 6e 67 6c 65 74 6f 6e 20 74 65 72 6d 20   singleton term 
5c80: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 61 20  or else it is a 
5c90: 64 75 70 6c 69 63 61 74 65 20 66 6f 72 0a 20 20  duplicate for.  
5ca0: 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6f 72 69  ** which the ori
5cb0: 67 69 6e 61 6c 20 64 69 64 20 6e 6f 74 20 71 75  ginal did not qu
5cc0: 61 6c 69 66 79 2e 20 20 45 69 74 68 65 72 20 77  alify.  Either w
5cd0: 61 79 20 77 65 20 61 72 65 20 64 6f 6e 65 20 66  ay we are done f
5ce0: 6f 72 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  or. */.  return 
5cf0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  0;.}.#endif /* !
5d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
5d10: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
5d20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5d30: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
5d40: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
5d50: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
5d60: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
5d70: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
5d80: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
5d90: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
5da0: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
5db0: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
5dc0: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
5dd0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
5de0: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
5df0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
5e00: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
5e10: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
5e20: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
5e30: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
5e40: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
5e50: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
5e60: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
5e70: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
5e80: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49  <op> <expr>".  I
5e90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5ea0: 20 69 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f   is of.** the fo
5eb0: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
5ec0: 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59  ere both X and Y
5ed0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
5ee0: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  en the original.
5ef0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
5f00: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
5f10: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 65 78 70   new virtual exp
5f20: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  ression of the f
5f30: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58  orm.** "Y <op> X
5f40: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
5f50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
5f60: 6e 64 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61  nd analyzed sepa
5f70: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
5f80: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
5f90: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
5fa0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
5fb0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5fc0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5fd0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5fe0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
5ff0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
6000: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
6010: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
6020: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
6030: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
6040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
6050: 6d 3b 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  m;.  ExprMaskSet
6060: 20 2a 70 4d 61 73 6b 53 65 74 3b 0a 20 20 45 78   *pMaskSet;.  Ex
6070: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 42 69 74  pr *pExpr;.  Bit
6080: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
6090: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
60a0: 71 41 6c 6c 3b 0a 20 20 42 69 74 6d 61 73 6b 20  qAll;.  Bitmask 
60b0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a  extraRight = 0;.
60c0: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a    int nPattern;.
60d0: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
60e0: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
60f0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 50 61 72 73    int op;.  Pars
6100: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
6110: 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
6120: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6130: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  >db;..  if( db->
6140: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
6150: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6160: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
6170: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
6180: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
6190: 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20  askSet;.  pExpr 
61a0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
61b0: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
61c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
61d0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
61e0: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
61f0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
6200: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
6210: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
6220: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
6230: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
6240: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
6250: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6260: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 0a  , pExpr->pList).
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70 72            | expr
6290: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
62a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
62b0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  ->pSelect);.  }e
62c0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
62d0: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
62e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
62f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
6300: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
6310: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
6320: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6330: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
6340: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
6350: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
6360: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
6370: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
6380: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6390: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
63a0: 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20      Bitmask x = 
63b0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
63c0: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
63d0: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  oinTable);.    p
63e0: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20  rereqAll |= x;. 
63f0: 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20     extraRight = 
6400: 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75  x-1;  /* ON clau
6410: 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74  se terms may not
6420: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
6430: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6450: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f   on left table o
6460: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
6470: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a  Ticket #3015 */.
6480: 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65    }.  pTerm->pre
6490: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
64a0: 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66  ll;.  pTerm->lef
64b0: 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  tCursor = -1;.  
64c0: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
64d0: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f   -1;.  pTerm->eO
64e0: 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69  perator = 0;.  i
64f0: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  f( allowedOp(op)
6500: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
6510: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
6520: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
6530: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
6540: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
6550: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
6560: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
6570: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
6580: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
6590: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
65a0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
65b0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
65c0: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
65d0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
65e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
65f0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
6600: 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20  orMask(op);.    
6610: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
6620: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
6630: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
6640: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
6650: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
6660: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
6670: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6680: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
6690: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
66a0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
66b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
66c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
66d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
66e0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
66f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6700: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  e(pDup);.       
6710: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
6720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
6730: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
6740: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
6750: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
6760: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
6770: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
6780: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
6790: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
67a0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
67b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
67c0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
67d0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
67e0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
67f0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
6800: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
6810: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
6820: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
6830: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6840: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
6850: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
6860: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
6870: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
6880: 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20  mute(pDup);.    
6890: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
68a0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
68b0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
68c0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
68d0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
68e0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
68f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
6900: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
6910: 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  = prereqLeft;.  
6920: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
6930: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
6940: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
6950: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
6960: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b  rMask(pDup->op);
6970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
6980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6990: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
69a0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
69b0: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
69c0: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
69d0: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
69e0: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
69f0: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
6a00: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
6a10: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
6a20: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
6a30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6a40: 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45  BETWEEN ){.    E
6a50: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6a60: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
6a70: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
6a80: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
6a90: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
6aa0: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
6ab0: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
6ac0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
6ad0: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
6ae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
6af0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
6b00: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
6b10: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
6b20: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
6b30: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70  lite3Expr(db, op
6b40: 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70  s[i], sqlite3Exp
6b50: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
6b60: 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20  pLeft),.        
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6b90: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
6ba0: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
6bb0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
6bc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
6bd0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
6be0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
6bf0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
6c00: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
6c10: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
6c20: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
6c30: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
6c40: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
6c50: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
6c60: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
6c70: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
6c80: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
6c90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6ca0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
6cb0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
6cc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6cd0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
6ce0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
6cf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6d00: 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d  UERY).  /* Attem
6d10: 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52  pt to convert OR
6d20: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
6d30: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
6d40: 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20 2a  ator so that.  *
6d50: 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65 20  * they can make 
6d60: 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
6d70: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
6d80: 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70   **      x = exp
6d90: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
6da0: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
6db0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
6dc0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a  nverted into.  *
6dd0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49 4e  *.  **      x IN
6de0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
6df0: 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  pr3).  **.  ** T
6e00: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
6e10: 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65 64   must be omitted
6e20: 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45 52   if OMIT_SUBQUER
6e30: 59 20 69 73 20 64 65 66 69 6e 65 64 20 62 65 63  Y is defined bec
6e40: 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ause.  ** the co
6e50: 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20 74  mpiler for the t
6e60: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
6e70: 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71 75  s part of sub-qu
6e80: 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c  eries..  */.  el
6e90: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
6ea0: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69  ==TK_OR ){.    i
6eb0: 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69  nt ok;.    int i
6ec0: 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  , j;.    int iCo
6ed0: 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20  lumn, iCursor;. 
6ee0: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73     WhereClause s
6ef0: 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  Or;.    WhereTer
6f00: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20  m *pOrTerm;..   
6f10: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
6f20: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
6f30: 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20  NAMIC)==0 );.   
6f40: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
6f50: 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72  (&sOr, pWC->pPar
6f60: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
6f70: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 73     whereSplit(&s
6f80: 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Or, pExpr, TK_OR
6f90: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
6fa0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73 4f 72  zeAll(pSrc, &sOr
6fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
6fc0: 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 20  Or.nTerm>=2 );. 
6fd0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 69 66     j = 0;.    if
6fe0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
6ff0: 65 64 20 29 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74  ed ) goto or_not
7000: 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 64  _possible;.    d
7010: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
7020: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
7030: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
7040: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c  sOr.a[j].leftCol
7050: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73  umn;.      iCurs
7060: 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65  or = sOr.a[j].le
7070: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
7080: 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b  ok = iCursor>=0;
7090: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
70a0: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
70b0: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
70c0: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
70d0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
70e0: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
70f0: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
7100: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
7110: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
7120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7130: 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f 70 74   if( orTermIsOpt
7140: 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54 65 72  Candidate(pOrTer
7150: 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  m, iCursor, iCol
7160: 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
7170: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
7180: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
7190: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
71a0: 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70  ( orTermHasOkDup
71b0: 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70 4f 72  licate(&sOr, pOr
71c0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  Term) ){.       
71d0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
71e0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
71f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7200: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
7210: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7220: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
7230: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
7240: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
7250: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
7260: 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b  <2 );.    if( ok
7270: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   ){.      ExprLi
7280: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
7290: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c       Expr *pNew,
72a0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78   *pDup;.      Ex
72b0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr *pLeft = 0;. 
72c0: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
72d0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
72e0: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
72f0: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
7300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7310: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
7320: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
7330: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7340: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
7350: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7360: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
7370: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
7380: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
7390: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
73a0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  C->pParse, pList
73b0: 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20  , pDup, 0);.    
73c0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
73d0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
73e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
73f0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
7400: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
7410: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7420: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
7430: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
7440: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 2c  3Expr(db, TK_IN,
7450: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
7460: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
7470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
7480: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
7490: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
74a0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
74b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69         pNew->pLi
74c0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
74d0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
74e0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
74f0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
7500: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
7510: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MIC);.        ex
7520: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
7530: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
7540: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
7550: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
7560: 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69          pWC->a[i
7570: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
7580: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
7590: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
75a0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
75b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
75c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
75d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
75e0: 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73      }.or_not_pos
75f0: 73 69 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65  sible:.    where
7600: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72  ClauseClear(&sOr
7610: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
7620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
7630: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
7640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7650: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
7660: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
7670: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
7680: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
7690: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
76a0: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
76b0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
76c0: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
76d0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
76e0: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
76f0: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
7700: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
7710: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
7720: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
7730: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
7740: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
7750: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
7760: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
7770: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
7780: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
7790: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
77a0: 63 6f 6e 64 69 64 74 69 6f 6e 20 22 61 62 64 22  condidtion "abd"
77b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c  ..  */.  if( isL
77c0: 69 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45  ikeOrGlob(db, pE
77d0: 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20  xpr, &nPattern, 
77e0: 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f  &isComplete, &no
77f0: 43 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78 70  Case) ){.    Exp
7800: 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68  r *pLeft, *pRigh
7810: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  t;.    Expr *pSt
7820: 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20  r1, *pStr2;.    
7830: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c  Expr *pNewExpr1,
7840: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
7850: 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64   int idxNew1, id
7860: 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66  xNew2;..    pLef
7870: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
7880: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
7890: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
78a0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
78b0: 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d  xpr;.    pStr1 =
78c0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
78d0: 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c  arse, TK_STRING,
78e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
78f0: 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20  f( pStr1 ){.    
7900: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
7910: 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74  py(db, &pStr1->t
7920: 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74  oken, &pRight->t
7930: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74  oken);.      pSt
7940: 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50  r1->token.n = nP
7950: 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70 53  attern;.      pS
7960: 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f  tr1->flags = EP_
7970: 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a  Dequoted;.    }.
7980: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
7990: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
79a0: 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 21  Str1);.    if( !
79b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79c0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
79d0: 2a 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65 72  *pC;.      asser
79e0: 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e  t( pStr2->token.
79f0: 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43 20  dyn );.      pC 
7a00: 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74  = (u8*)&pStr2->t
7a10: 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d  oken.z[nPattern-
7a20: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
7a30: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
7a40: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ase ){.        i
7a50: 66 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43 6f  f( c=='@' ) isCo
7a60: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
7a70: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
7a80: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
7a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
7aa0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
7ab0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
7ac0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7ad0: 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c  arse, TK_GE, sql
7ae0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
7af0: 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29  Left), pStr1, 0)
7b00: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
7b10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
7b20: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
7b30: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
7b40: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
7b50: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
7b60: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
7b70: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
7b80: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7b90: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20 73  pParse, TK_LT, s
7ba0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7bb0: 2c 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c 20  ,pLeft), pStr2, 
7bc0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20  0);.    idxNew2 
7bd0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
7be0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
7bf0: 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r2, TERM_VIRTUAL
7c00: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
7c10: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
7c20: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
7c30: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
7c40: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7c50: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
7c60: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
7c70: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
7c80: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
7c90: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
7ca0: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
7cb0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
7cc0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
7cd0: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
7ce0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7cf0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
7d00: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
7d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7d20: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
7d30: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
7d40: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
7d50: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
7d60: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
7d70: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
7d80: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
7d90: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
7da0: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
7db0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
7dc0: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
7dd0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
7de0: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
7df0: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
7e00: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
7e10: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
7e20: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
7e30: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
7e40: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
7e50: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
7e60: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
7e70: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
7e80: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
7e90: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
7ea0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
7eb0: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
7ec0: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
7ed0: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
7ee0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
7ef0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
7f00: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
7f10: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
7f20: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72  1].pExpr;.    pr
7f30: 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54  ereqExpr = exprT
7f40: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7f50: 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  et, pRight);.   
7f60: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20   prereqColumn = 
7f70: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
7f80: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b  MaskSet, pLeft);
7f90: 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71  .    if( (prereq
7fa0: 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c  Expr & prereqCol
7fb0: 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  umn)==0 ){.     
7fc0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
7fd0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
7fe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
7ff0: 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20 73  , TK_MATCH, 0, s
8000: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8010: 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a 20  , pRight), 0);. 
8020: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
8030: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
8040: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
8050: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
8060: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8070: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
8080: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
8090: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
80a0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
80b0: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
80c0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
80d0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
80e0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
80f0: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  m->leftColumn = 
8100: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
8110: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
8120: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
8130: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
8140: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
8150: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
8160: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
8170: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
8180: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
8190: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66  ;.      pTerm->f
81a0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
81b0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
81c0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
81d0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
81e0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
81f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8200: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
8210: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
8220: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
8230: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
8240: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
8250: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
8260: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
8270: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
8280: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
8290: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
82a0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
82b0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ht;.}../*.** Ret
82c0: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20  urn TRUE if any 
82d0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
82e0: 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69  ns in pList->a[i
82f0: 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69  First...] contai
8300: 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  n.** a reference
8310: 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74   to any table ot
8320: 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61  her than the iBa
8330: 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  se table..*/.sta
8340: 74 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63  tic int referenc
8350: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20  esOtherTables(. 
8360: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8370: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ,          /* Se
8380: 61 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73  arch expressions
8390: 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a   in ths list */.
83a0: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70    ExprMaskSet *p
83b0: 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20 4d  MaskSet,    /* M
83c0: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c  apping from tabl
83d0: 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  es to bitmaps */
83e0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20  .  int iFirst,  
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8400: 42 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74  Be searching wit
8410: 68 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20  h the iFirst-th 
8420: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
8430: 69 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20  int iBase       
8440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
8450: 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
8460: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
8470: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c  ){.  Bitmask all
8480: 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28  owed = ~getMask(
8490: 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29  pMaskSet, iBase)
84a0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73  ;.  while( iFirs
84b0: 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  t<pList->nExpr )
84c0: 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54  {.    if( (exprT
84d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
84e0: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  et, pList->a[iFi
84f0: 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c  rst++].pExpr)&al
8500: 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  lowed)!=0 ){.   
8510: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8520: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8530: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
8540: 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65  s routine decide
8550: 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65  s if pIdx can be
8560: 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79   used to satisfy
8570: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
8580: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20   clause.  If it 
8590: 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20  can, it returns 
85a0: 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e  1.  If pIdx cann
85b0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  ot satisfy the.*
85c0: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
85d0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
85e0: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a  returns 0..**.**
85f0: 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20   pOrderBy is an 
8600: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8610: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
8620: 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69  atement.  pTab i
8630: 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  s the.** left-mo
8640: 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  st table in the 
8650: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
8660: 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20  hat same SELECT 
8670: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a  statement and.**
8680: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
8690: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
86a0: 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20  f "base".  pIdx 
86b0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70  is an index on p
86c0: 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f  Tab..**.** nEqCo
86d0: 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  l is the number 
86e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49  of columns of pI
86f0: 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64  dx that are used
8700: 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   as equality.** 
8710: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e  constraints.  An
8720: 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d  y of these colum
8730: 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  ns may be missin
8740: 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  g from the ORDER
8750: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e   BY.** clause an
8760: 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20  d the match can 
8770: 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65  still be a succe
8780: 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65  ss..**.** All te
8790: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
87a0: 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61   BY that match a
87b0: 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
87c0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a   must be either.
87d0: 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20  ** ASC or DESC. 
87e0: 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f   (Terms of the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70  RDER BY clause p
8800: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
8810: 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78   UNIQUE.** index
8820: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
8830: 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e  satisfy this con
8840: 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a  straint.)  The *
8850: 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a  pbRev value is.*
8860: 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  * set to 1 if th
8870: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8880: 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e  e is all DESC an
8890: 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30  d it is set to 0
88a0: 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52   if.** the ORDER
88b0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
88c0: 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63  l ASC..*/.static
88d0: 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e   int isSortingIn
88e0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
88f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8900: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8910: 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  t */.  ExprMaskS
8920: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f  et *pMaskSet,  /
8930: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
8940: 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20  able indices to 
8950: 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64  bitmaps */.  Ind
8960: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
8970: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
8980: 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  x we are testing
8990: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89b0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
89c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  or the table to 
89d0: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
89e0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
89f0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
8a00: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
8a10: 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20  .  int nEqCol,  
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a30: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f  mber of index co
8a40: 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f  lumns with == co
8a50: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
8a60: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
8a70: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
8a80: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
8a90: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69  s DESC */.){.  i
8aa0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ac0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
8ad0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
8ae0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
8af0: 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69       /* XOR of i
8b00: 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42  ndex and ORDER B
8b10: 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e  Y sort direction
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8b50: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
8b60: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  s */.  struct Ex
8b70: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
8b80: 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d  rm;    /* A term
8b90: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8ba0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c   clause */.  sql
8bb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8bc0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
8bd0: 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
8be0: 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65  .  nTerm = pOrde
8bf0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  rBy->nExpr;.  as
8c00: 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
8c10: 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
8c20: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
8c30: 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
8c40: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
8c50: 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
8c60: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
8c70: 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49   indices have pI
8c80: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75  dx->nColumn regu
8c90: 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  lar columns plus
8ca0: 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69  .  ** one additi
8cb0: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  onal column cont
8cc0: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  aining the rowid
8cd0: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  .  The rowid col
8ce0: 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  umn.  ** of the 
8cf0: 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c  index is also al
8d00: 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61  lowed to match a
8d10: 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52  gainst the ORDER
8d20: 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e   BY.  ** clause.
8d30: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
8d40: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
8d50: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
8d60: 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i<=pIdx->nColum
8d70: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
8d80: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
8d90: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
8da0: 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  n of the ORDER B
8db0: 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43  Y pTerm */.    C
8dc0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
8dd0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
8de0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70  ng sequence of p
8df0: 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
8e00: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f  termSortOrder; /
8e10: 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  * Sort order for
8e20: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
8e30: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
8e40: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
8e50: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
8e60: 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f  ndex.  -1 for ro
8e70: 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
8e80: 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a  SortOrder;    /*
8e90: 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66   1 for DESC, 0 f
8ea0: 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d  or ASC on the i-
8eb0: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
8ec0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8ed0: 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20  *zColl; /* Name 
8ee0: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  of the collating
8ef0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
8f00: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
8f10: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
8f20: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
8f30: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
8f40: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
8f50: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
8f60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
8f70: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
8f80: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
8f90: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
8fa0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
8fb0: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
8fc0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
8fd0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
8fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ff0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9000: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9010: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
9020: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
9030: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64  .      pColl = d
9040: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
9050: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
9060: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
9070: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
9080: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
9090: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
90a0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
90b0: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
90c0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
90d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
90e0: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64  iSortOrder = pId
90f0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
9100: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
9110: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
9120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9130: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
9140: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
9150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c   = 0;.      zCol
9160: 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l = pColl->zName
9170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9180: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
9190: 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74  iColumn || sqlit
91a0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
91b0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
91c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
91d0: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
91e0: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
91f0: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
9200: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
9210: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
9220: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
9230: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
9240: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
9250: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
9260: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
9270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
9280: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
9290: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
92a0: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
92b0: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
92c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
92d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
92e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
92f0: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
9300: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
9310: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
9320: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
9330: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
9340: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
9350: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
9360: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
9370: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
9380: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
93a0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
93b0: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
93c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
93d0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
93e0: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
93f0: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
9400: 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65  ssert( iSortOrde
9410: 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64  r==0 || iSortOrd
9420: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  er==1 );.    ter
9430: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f  mSortOrder = iSo
9440: 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d  rtOrder ^ pTerm-
9450: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
9460: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
9470: 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f        if( termSo
9480: 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64  rtOrder!=sortOrd
9490: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
94a0: 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c   Indices can onl
94b0: 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  y be used if all
94c0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
94d0: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20  past the.       
94e0: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   ** equality con
94f0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
9500: 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20   either DESC or 
9510: 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ASC. */.        
9520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
9530: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9540: 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74     sortOrder = t
9550: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ermSortOrder;.  
9560: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
9570: 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66   pTerm++;.    if
9580: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ( iColumn<0 && !
9590: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
95a0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
95b0: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
95c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
95d0: 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
95e0: 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d  lumn is the prim
95f0: 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72  ary key and ever
9600: 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20  ything matches. 
9610: 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61       ** so far a
9620: 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f  nd none of the O
9630: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
9640: 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72   the right refer
9650: 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20  ence other.     
9660: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
9670: 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20  e join, then we 
9680: 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74  are assured that
9690: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62   the index can b
96a0: 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a  e used .      **
96b0: 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65   to sort because
96c0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
96d0: 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73   is unique and s
96e0: 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  o none of the ot
96f0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  her.      ** col
9700: 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61  umns will make a
9710: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20  ny difference.  
9720: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d      */.      j =
9730: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   nTerm;.    }.  
9740: 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  }..  *pbRev = so
9750: 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66  rtOrder!=0;.  if
9760: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
9770: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
9780: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
9790: 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65  lause are covere
97a0: 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20  d by this index 
97b0: 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  so.    ** this i
97c0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
97d0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f   for sorting. */
97e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
97f0: 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
9800: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
9810: 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i==pIdx->nCol
9820: 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65  umn.      && !re
9830: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
9840: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
9850: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
9860: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
9870: 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64  erms of this ind
9880: 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72  ex match some pr
9890: 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45  efix of the ORDE
98a0: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
98b0: 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
98c0: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e   is UNIQUE and n
98d0: 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74  o terms on the t
98e0: 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ail of the ORDER
98f0: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
9900: 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  e reference othe
9910: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
9920: 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  in.  If this is 
9930: 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20  all true then.  
9940: 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62    ** the order b
9950: 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65  y clause is supe
9960: 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20  rfluous. */.    
9970: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9980: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9990: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
99a0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
99b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
99c0: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
99d0: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
99e0: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
99f0: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
9a00: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
9a10: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
9a20: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
9a30: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
9a40: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
9a50: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
9a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
9a70: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
9a80: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
9aa0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
9ab0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
9ac0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9ad0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
9ae0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
9af0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
9b00: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
9b10: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
9b20: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
9b30: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  aps */.  int *pb
9b40: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
9b50: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
9b60: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
9b70: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
9b80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ;..  assert( pOr
9b90: 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
9ba0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
9bb0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d  nExpr>0 );.  p =
9bc0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
9bd0: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e  pExpr;.  if( p->
9be0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
9bf0: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65   p->iTable==base
9c00: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
9c10: 2d 31 0a 20 20 20 20 26 26 20 21 72 65 66 65 72  -1.    && !refer
9c20: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
9c30: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
9c40: 53 65 74 2c 20 31 2c 20 62 61 73 65 29 20 29 7b  Set, 1, base) ){
9c50: 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f  .    *pbRev = pO
9c60: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
9c70: 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75  tOrder;.    retu
9c80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
9c90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
9ca0: 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65  repare a crude e
9cb0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c  stimate of the l
9cc0: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
9cd0: 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  input value..** 
9ce0: 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64  The results need
9cf0: 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20   not be exact.  
9d00: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  This is only use
9d10: 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  d for estimating
9d20: 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  .** the total co
9d30: 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67  st of performing
9d40: 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69 74 68   operatings with
9d50: 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c   O(logN) or O(Nl
9d60: 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69  ogN).** complexi
9d70: 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69  ty.  Because N i
9d80: 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20  s just a guess, 
9d90: 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74  it is no great t
9da0: 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67  ragedy if.** log
9db0: 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66  N is a little of
9dc0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  f..*/.static dou
9dd0: 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c  ble estLog(doubl
9de0: 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c  e N){.  double l
9df0: 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c  ogN = 1;.  doubl
9e00: 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c  e x = 10;.  whil
9e10: 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f  e( N>x ){.    lo
9e20: 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a  gN += 1;.    x *
9e30: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = 10;.  }.  retu
9e40: 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn logN;.}../*.*
9e50: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
9e60: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
9e70: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
9e80: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
9e90: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
9ea0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
9eb0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
9ec0: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
9ed0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
9ee0: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
9ef0: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
9f00: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
9f10: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
9f20: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
9f30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9f40: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
9f50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
9f60: 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  G).static void T
9f70: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
9f80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
9f90: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
9fa0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
9fb0: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
9fc0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
9fd0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
9fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9ff0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
a000: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
a010: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
a020: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
a030: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
a040: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
a050: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
a060: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
a070: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
a080: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
a090: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
a0a0: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
a0b0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
a0c0: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
a0d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
a0e0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
a0f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
a100: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
a110: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
a120: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
a130: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
a140: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
a150: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
a160: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
a170: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
a180: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
a190: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a1a0: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
a1b0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
a1c0: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
a1d0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
a1e0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
a1f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a200: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
a210: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
a220: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
a230: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
a240: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
a250: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
a260: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
a270: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
a280: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
a290: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
a2a0: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
a2b0: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
a2c0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
a2d0: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
a2e0: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
a2f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
a300: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
a310: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
a320: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
a330: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
a340: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
a350: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
a360: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
a370: 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cost);.}.#else.#
a380: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
a390: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
a3a0: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
a3b0: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
a3c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a3e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
a3f0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
a400: 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
a410: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
a420: 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
a430: 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
a440: 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
a450: 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
a460: 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
a470: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
a480: 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
a490: 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
a4a0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
a4b0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a4c0: 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
a4d0: 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
a4e0: 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
a4f0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
a500: 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
a510: 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
a520: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
a530: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
a540: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
a550: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
a560: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a570: 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
a580: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
a590: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
a5a0: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
a5b0: 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
a5c0: 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
a5d0: 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
a5e0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
a5f0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
a600: 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
a610: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
a620: 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
a630: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
a640: 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
a650: 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
a660: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
a670: 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
a680: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
a690: 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
a6a0: 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
a6b0: 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
a6c0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
a6d0: 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
a6e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a6f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a700: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
a710: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
a720: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a740: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
a750: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
a760: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
a770: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  ,     /* The FRO
a780: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
a790: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
a7a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
a7c0: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
a7d0: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
a7e0: 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
a7f0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
a800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a810: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
a820: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42   */.  int orderB
a830: 79 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  yUsable,        
a840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a850: 77 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c  we can potential
a860: 20 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74   sort */.  sqlit
a870: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
a880: 70 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64  ppIdxInfo /* Ind
a890: 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ex information p
a8a0: 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e  assed to xBestIn
a8b0: 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  dex */.){.  Tabl
a8c0: 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  e *pTab = pSrc->
a8d0: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pTab;.  sqlite3_
a8e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
a8f0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
a900: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
a910: 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
a920: 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
a930: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
a940: 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
a950: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
a960: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
a970: 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
a980: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a990: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
a9a0: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
a9b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
a9c0: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   If the sqlite3_
a9d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a9e0: 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  ture has not bee
a9f0: 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a  n previously.  *
aa00: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
aa10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20  initialized for 
aa20: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
aa30: 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  le, then allocat
aa40: 65 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69  e.  ** and initi
aa50: 61 6c 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a  alize it now.  *
aa60: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a  /.  pIdxInfo = *
aa70: 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28  ppIdxInfo;.  if(
aa80: 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
aa90: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
aaa0: 54 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54  Term;.    int nT
aab0: 65 72 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52  erm;.    WHERETR
aac0: 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e  ACE(("Recomputin
aad0: 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72  g index info for
aae0: 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d   %s...\n", pTab-
aaf0: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
ab00: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
ab10: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
ab20: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
ab30: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
ab40: 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  g.    ** to this
ab50: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
ab60: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72  /.    for(i=nTer
ab70: 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
ab80: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
ab90: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
aba0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
abb0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
abc0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
abd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
abe0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
abf0: 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
ac00: 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
ac10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ac20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ac30: 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
ac40: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
ac50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
ac60: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
ac70: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
ac80: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
ac90: 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
aca0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
acb0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
acc0: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
acd0: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
ace0: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
acf0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
ad00: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
ad10: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
ad20: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
ad30: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
ad40: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
ad50: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
ad60: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
ad70: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
ad80: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
ad90: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
ada0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
adb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
adc0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
add0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
ade0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
adf0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
ae00: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
ae10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
ae20: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
ae30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ae40: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
ae50: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
ae60: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
ae70: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
ae80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae90: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
aea0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
aeb0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
aec0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
aed0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
aee0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
aef0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
af00: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
af30: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
af40: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
af50: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
af80: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
af90: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  y );.    if( pId
afa0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
afb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
afc0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
afd0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
afe0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
aff0: 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e    }.    *ppIdxIn
b000: 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a  fo = pIdxInfo;..
b010: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
b020: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
b030: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
b040: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
b050: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  re contains.    
b060: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
b070: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
b080: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
b090: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
b0a0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67  rom.    ** chang
b0b0: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
b0c0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
b0d0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
b0e0: 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69  rder to.    ** i
b0f0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
b100: 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  fields..    */. 
b110: 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73     pIdxCons = (s
b120: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b130: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
b140: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
b150: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
b160: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b170: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
b180: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
b190: 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73  .    pUsage = (s
b1a0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b1b0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
b1c0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
b1d0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
b1e0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
b1f0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
b200: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69  = nTerm;.    *(i
b210: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
b220: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
b230: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
b240: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
b250: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
b260: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
b270: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
b280: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
b290: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
b2a0: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
b2b0: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
b2c0: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
b2d0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b2e0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
b2f0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
b300: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
b310: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
b360: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  .    for(i=j=0, 
b370: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
b380: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
b390: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
b3a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
b3b0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
b3c0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
b3d0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
b3e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
b3f0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
b400: 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  r-1))==0 );.    
b410: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
b420: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
b430: 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
b440: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
b450: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
b460: 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
b470: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b480: 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
b490: 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
b4a0: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
b4b0: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
b4c0: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  rm->leftColumn;.
b4d0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
b4e0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
b4f0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  i;.      pIdxCon
b500: 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d  s[j].op = pTerm-
b510: 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
b520: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
b530: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
b540: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
b550: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
b560: 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
b570: 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
b580: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
b590: 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
b5a0: 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
b5b0: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
b5c0: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
b5d0: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
b5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
b5f0: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
b600: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
b610: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b620: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
b630: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b640: 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LT );.      ass
b650: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
b660: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b670: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  INT_LE );.      
b680: 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
b690: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b6a0: 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
b6b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
b6c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
b6d0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
b6e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b6f0: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
b700: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b710: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61  MATCH );.      a
b720: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
b730: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
b740: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
b750: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
b760: 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b  H) );.      j++;
b770: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
b780: 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
b790: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
b7a0: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
b7b0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
b7c0: 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42        pIdxOrderB
b7d0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
b7e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
b7f0: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
b800: 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
b810: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
b820: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
b830: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
b840: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nt, the sqlite3_
b850: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
b860: 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e  ture that pIdxIn
b870: 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74  fo points.  ** t
b880: 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  o will have been
b890: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69   initialized, ei
b8a0: 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20  ther during the 
b8b0: 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
b8c0: 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e  on or.  ** durin
b8d0: 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76  g some prior inv
b8e0: 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65  ocation.  Now we
b8f0: 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75   just have to cu
b900: 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a  stomize the.  **
b910: 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78   details of pIdx
b920: 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72  Info for the cur
b930: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
b940: 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20  and pass it to. 
b950: 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   ** xBestIndex..
b960: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    */..  /* The m
b970: 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  odule name must 
b980: 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f  be defined. Also
b990: 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20  , by this point 
b9a0: 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20  there must.  ** 
b9b0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
b9c0: 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
b9d0: 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72  structure. Other
b9e0: 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  wise.  ** sqlite
b9f0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
ba00: 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65  mes() would have
ba10: 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65   picked up the e
ba20: 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  rror. .  */.  as
ba30: 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f  sert( pTab->azMo
ba40: 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d  duleArg && pTab-
ba50: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20  >azModuleArg[0] 
ba60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
ba70: 62 2d 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20  b->pVtab );.#if 
ba80: 30 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56  0.  if( pTab->pV
ba90: 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tab==0 ){.    sq
baa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bab0: 61 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64  arse, "undefined
bac0: 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74   module %s for t
bad0: 61 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20  able %s",.      
bae0: 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65    pTab->azModule
baf0: 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e  Arg[0], pTab->zN
bb00: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
bb10: 20 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   0.0;.  }.#endif
bb20: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ..  /* Set the a
bb30: 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
bb40: 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69  ble fields and i
bb50: 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20  nitialize all . 
bb60: 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61   ** output varia
bb70: 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  bles to zero..  
bb80: 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61  **.  ** aConstra
bb90: 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20  int[].usable is 
bba0: 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61  true for constra
bbb0: 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72  ints where the r
bbc0: 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73  ight-hand.  ** s
bbd0: 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ide contains onl
bbe0: 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
bbf0: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
bc00: 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ft of the curren
bc10: 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49  t.  ** table.  I
bc20: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
bc30: 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  f the constraint
bc40: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
bc50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
bc60: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78       column = ex
bc70: 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64  pr.  **.  ** and
bc80: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
bc90: 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ng a join, then 
bca0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
bcb0: 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a  n column is .  *
bcc0: 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20  * only valid if 
bcd0: 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72  all tables refer
bce0: 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63  enced in expr oc
bcf0: 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  cur to the left.
bd00: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
bd10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
bd20: 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  umn..  **.  ** T
bd30: 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b  he aConstraints[
bd40: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
bd50: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
bd60: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
bd70: 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * on the current
bd80: 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61   table.  That wa
bd90: 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74  y we only have t
bda0: 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63  o compute it onc
bdb0: 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75  e.  ** even thou
bdc0: 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20  gh we might try 
bdd0: 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74  to pick the best
bde0: 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20   index multiple 
bdf0: 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20  times..  ** For 
be00: 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20  each attempt at 
be10: 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78  picking an index
be20: 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74  , the order of t
be30: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
be40: 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20  * join might be 
be50: 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20  different so we 
be60: 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74  have to recomput
be70: 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61  e the usable fla
be80: 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65  g.  ** each time
be90: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
bea0: 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
beb0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
bec0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
bed0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
bee0: 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49    pUsage = pIdxI
bef0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
bf00: 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Usage;.  for(i=0
bf10: 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
bf20: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
bf30: 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
bf40: 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
bf50: 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
bf60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
bf70: 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  j];.    pIdxCons
bf80: 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65  ->usable =  (pTe
bf90: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
bfa0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a  & notReady)==0;.
bfb0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
bfc0: 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
bfd0: 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
bfe0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
bff0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
c000: 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
c010: 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
c020: 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
c030: 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
c040: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
c050: 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
c060: 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
c070: 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
c080: 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
c090: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
c0a0: 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
c0b0: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
c0c0: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
c0d0: 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e  ITE_BIG_DBL / 2.
c0e0: 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  0;.  nOrderBy = 
c0f0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
c100: 42 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  By;.  if( pIdxIn
c110: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20  fo->nOrderBy && 
c120: 21 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29  !orderByUsable )
c130: 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49  {.    *(int*)&pI
c140: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
c150: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f   = 0;.  }..  (vo
c160: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
c170: 4f 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  Off(pParse->db);
c180: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
c190: 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
c1a0: 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
c1b0: 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
c1c0: 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f  _INPUTS(pIdxInfo
c1d0: 29 3b 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e  );.  rc = pTab->
c1e0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
c1f0: 78 42 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d  xBestIndex(pTab-
c200: 3e 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f  >pVtab, pIdxInfo
c210: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
c220: 55 54 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  UTPUTS(pIdxInfo)
c230: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
c240: 33 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65  3SafetyOn(pParse
c250: 2d 3e 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  ->db);..  for(i=
c260: 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
c270: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
c280: 7b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 49  {.    if( !pIdxI
c290: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
c2a0: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55  [i].usable && pU
c2b0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
c2c0: 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
c2d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c2e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
c2f0: 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
c300: 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
c310: 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
c320: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
c330: 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b       return 0.0;
c340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
c350: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c360: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
c370: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
c380: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
c390: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
c3a0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20  1;.    }else {. 
c3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c3c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
c3d0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
c3e0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (rc));.    }.  }
c3f0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
c400: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
c410: 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 72 65 74  nOrderBy;..  ret
c420: 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  urn pIdxInfo->es
c430: 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23  timatedCost;.}.#
c440: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c450: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
c460: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  E */../*.** Find
c470: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
c480: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
c490: 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
c4a0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
c4b0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e  ter.** to the in
c4c0: 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20  dex, flags that 
c4d0: 64 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65  describe how the
c4e0: 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
c4f0: 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75   used, the.** nu
c500: 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
c510: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e   constraints, an
c520: 64 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72  d the "cost" for
c530: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a   this index..**.
c540: 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f  ** The lowest co
c550: 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20  st index wins.  
c560: 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65  The cost is an e
c570: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61  stimate of the a
c580: 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20  mount of.** CPU 
c590: 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65  and disk I/O nee
c5a0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
c5b0: 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74   request using t
c5c0: 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65  he selected inde
c5d0: 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  x..** Factors th
c5e0: 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
c5f0: 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
c600: 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
c610: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
c620: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
c630: 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
c640: 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
c650: 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
c660: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
c670: 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
c680: 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
c690: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
c6a0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
c6b0: 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
c6c0: 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
c6d0: 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
c6e0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
c6f0: 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
c700: 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65   double bestInde
c710: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
c720: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
c730: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
c740: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
c750: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
c760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c770: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
c780: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
c790: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
c7a0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
c7b0: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
c7c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
c7d0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
c7e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
c7f0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
c800: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
c810: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
c820: 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
c830: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
c840: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a  se */.  Index **
c850: 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  ppIndex,        
c860: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49      /* Make *ppI
c870: 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  ndex point to th
c880: 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a  e best index */.
c890: 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20    int *pFlags,  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8b0: 20 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72   Put flags descr
c8c0: 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63  ibing this choic
c8d0: 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a  e in *pFlags */.
c8e0: 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20    int *pnEq     
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c900: 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Put the number 
c910: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
c920: 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a  traints here */.
c930: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
c940: 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a  pTerm;.  Index *
c950: 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20  bestIdx = 0;    
c960: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
c970: 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77  at gives the low
c980: 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f  est cost */.  do
c990: 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b  uble lowestCost;
c9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c9b0: 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62   cost of using b
c9c0: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
c9d0: 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20  bestFlags = 0;  
c9e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
c9f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ca00: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
ca10: 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20  t bestNEq = 0;  
ca20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
ca30: 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20  t value for nEq 
ca40: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
ca50: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20  pSrc->iCursor;  
ca60: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
ca70: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
ca80: 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20  e accessed */.  
ca90: 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
cab0: 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
cac0: 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69  valuating */.  i
cad0: 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  nt rev;         
cae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
caf0: 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ue to scan in re
cb00: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
cb10: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb30: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
cb40: 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a   with pProbe */.
cb50: 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb70: 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
cb80: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
cb90: 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
cba0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
cbb0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69   /* Mask of vali
cbc0: 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
cbd0: 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  tors */.  double
cbe0: 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
cbf0: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
cc00: 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
cc10: 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
cc20: 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d  "bestIndex: tbl=
cc30: 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e  %s notReady=%x\n
cc40: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
cc50: 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29  Name, notReady))
cc60: 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ;.  lowestCost =
cc70: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
cc80: 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63  .  pProbe = pSrc
cc90: 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
cca0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
ccb0: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  le has no indice
ccc0: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
ccd0: 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  no terms in the 
cce0: 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73  where.  ** claus
ccf0: 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  e that refer to 
cd00: 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20  the ROWID, then 
cd10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  we will never be
cd20: 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a   able to do.  **
cd30: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
cd40: 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c  than a full tabl
cd50: 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74  e scan on this t
cd60: 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20  able.  We might 
cd70: 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74  as.  ** well put
cd80: 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65   it first in the
cd90: 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68   join order.  Th
cda0: 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20  at way, perhaps 
cdb0: 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72  it can be.  ** r
cdc0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68  eferenced by oth
cdd0: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
cde0: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
cdf0: 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20  ( pProbe==0 &&. 
ce00: 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43      findTerm(pWC
ce10: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
ce20: 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54  O_EQ|WO_IN|WO_LT
ce30: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
ce40: 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20  GE,0)==0 &&.    
ce50: 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c   (pOrderBy==0 ||
ce60: 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69   !sortableByRowi
ce70: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
ce80: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
ce90: 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a   &rev)) ){.    *
cea0: 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  pFlags = 0;.    
ceb0: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
cec0: 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20    *pnEq = 0;.   
ced0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d   return 0.0;.  }
cee0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
cef0: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
cf00: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
cf10: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
cf20: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
cf30: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
cf40: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
cf50: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
cf60: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
cf70: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
cf80: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a    *ppIndex = 0;.
cf90: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
cfa0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
cfb0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
cfc0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
cfd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
cfe0: 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74  id== is always t
cff0: 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c  he best pick.  L
d000: 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20  ook no further. 
d010: 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20   Because only.  
d020: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
d030: 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
d040: 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
d050: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
d060: 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c  er */.      *pFl
d070: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
d080: 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49  D_EQ | WHERE_UNI
d090: 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71  QUE;.      *pnEq
d0a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
d0b0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73  ETRACE(("... bes
d0c0: 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
d0d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
d0e0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
d0f0: 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   (pExpr = pTerm-
d100: 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d  >pExpr)->pList!=
d110: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  0 ){.      /* Ro
d120: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
d130: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
d140: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
d150: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
d160: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
d170: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
d180: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
d190: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d1a0: 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73  lowestCost *= es
d1b0: 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29  tLog(lowestCost)
d1c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d1d0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
d1e0: 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73  SELECT): cost is
d1f0: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
d200: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d210: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rows.      ** in
d220: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d230: 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
d240: 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
d250: 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
d260: 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
d270: 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
d280: 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
d290: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
d2a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  ;.    }.    WHER
d2b0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
d2c0: 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67  id IN cost: %.9g
d2d0: 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29  \n", lowestCost)
d2e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74  );.  }..  /* Est
d2f0: 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  imate the cost o
d300: 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20  f a table scan. 
d310: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   If we do not kn
d320: 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a  ow how many.  **
d330: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
d340: 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31  the table, use 1
d350: 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75   million as a gu
d360: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74  ess..  */.  cost
d370: 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f   = pProbe ? pPro
d380: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  be->aiRowEst[0] 
d390: 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 57 48 45  : 1000000;.  WHE
d3a0: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61  RETRACE(("... ta
d3b0: 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f  ble scan base co
d3c0: 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73  st: %.9g\n", cos
d3d0: 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57  t));.  flags = W
d3e0: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
d3f0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
d400: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  r constraints on
d410: 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69   a range of rowi
d420: 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63  ds in a table sc
d430: 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  an..  */.  pTerm
d440: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
d450: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
d460: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
d470: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29  |WO_GT|WO_GE, 0)
d480: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
d490: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
d4a0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
d4b0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
d4c0: 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_LE, 0) ){.  
d4d0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
d4e0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
d4f0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20      cost /= 3;  
d500: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
d510: 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid<EXPR elimina
d520: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
d530: 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  r rows */.    }.
d540: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
d550: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
d560: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
d570: 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
d580: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d590: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
d5a0: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
d5b0: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
d5c0: 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id>EXPR eliminat
d5d0: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
d5e0: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
d5f0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
d600: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
d610: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
d620: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
d630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
d640: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ags = 0;.  }..  
d650: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
d660: 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61  scan does not sa
d670: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
d680: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
d690: 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73  ase.  ** the cos
d6a0: 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
d6b0: 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
d6c0: 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
d6d0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
d6e0: 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c  .    if( sortabl
d6f0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
d700: 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d  OrderBy, pWC->pM
d710: 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b  askSet, &rev) ){
d720: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
d730: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48  WHERE_ORDERBY|WH
d740: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
d750: 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29  .      if( rev )
d760: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
d770: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
d780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d790: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20  lse{.      cost 
d7a0: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
d7b0: 6f 73 74 29 3b 0a 20 20 20 20 20 20 57 48 45 52  ost);.      WHER
d7c0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
d7d0: 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63  ting increases c
d7e0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
d7f0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  cost));.    }.  
d800: 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77  }.  if( cost<low
d810: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c  estCost ){.    l
d820: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
d830: 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20  ;.    bestFlags 
d840: 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
d850: 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74  /* If the pSrc t
d860: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
d870: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
d880: 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d  T JOIN then we m
d890: 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20  ay not.  ** use 
d8a0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69  an index to sati
d8b0: 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73  sfy IS NULL cons
d8c0: 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20  traints on that 
d8d0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a  table.  This is.
d8e0: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c    ** because col
d8f0: 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75  umns might end u
d900: 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20  p being NULL if 
d910: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
d920: 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20  ot match -.  ** 
d930: 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77  a circumstance w
d940: 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63  hich the index c
d950: 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69  annot help us di
d960: 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20  scover.  Ticket 
d970: 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66  #2177..  */.  if
d980: 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  ( (pSrc->jointyp
d990: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
d9a0: 29 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  ){.    eqTermMas
d9b0: 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
d9c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71  .  }else{.    eq
d9d0: 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
d9e0: 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
d9f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
da00: 20 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a   at each index..
da10: 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72    */.  for(; pPr
da20: 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
da30: 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
da40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da60: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
da70: 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c      double inMul
da80: 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20  tiplier = 1;..  
da90: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
daa0: 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c  .. index %s:\n",
dab0: 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29   pProbe->zName))
dac0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
dad0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
dae0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
daf0: 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69  ex that are sati
db00: 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sfied.    ** by 
db10: 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  x=EXPR constrain
db20: 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  ts or x IN (...)
db30: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
db40: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d    */.    flags =
db50: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
db60: 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
db70: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
db80: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
db90: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
dba0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
dbb0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
dbc0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  , notReady, eqTe
dbd0: 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  rmMask, pProbe);
dbe0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
dbf0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
dc00: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
dc10: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
dc20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
dc30: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
dc40: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
dc50: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
dc60: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66  pExpr;.        f
dc70: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
dc80: 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
dc90: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
dca0: 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect!=0 ){.      
dcb0: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
dcc0: 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
dcd0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
dce0: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
dcf0: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
dd00: 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c  ier *= pExpr->pL
dd10: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a  ist->nExpr + 1;.
dd20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74  }.    }.    cost
dd40: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
dd50: 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69  Est[i] * inMulti
dd60: 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69  plier * estLog(i
dd70: 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20  nMultiplier);.  
dd80: 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69    nEq = i;.    i
dd90: 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
dda0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28  or!=OE_None && (
ddb0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
ddc0: 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20  LUMN_IN)==0.    
ddd0: 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72       && nEq==pPr
dde0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
ddf0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
de00: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
de10: 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43   }.    WHERETRAC
de20: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25  E(("...... nEq=%
de30: 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f  d inMult=%.9g co
de40: 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69  st=%.9g\n",nEq,i
de50: 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74  nMultiplier,cost
de60: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b  ));..    /* Look
de70: 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74   for range const
de80: 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20  raints.    */.  
de90: 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65    if( nEq<pProbe
dea0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
deb0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
dec0: 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
ded0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
dee0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
def0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
df00: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
df10: 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
df20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
df30: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  rm ){.        fl
df40: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
df50: 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
df60: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
df70: 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
df80: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
df90: 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a  _LE, pProbe) ){.
dfa0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
dfb0: 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
dfc0: 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  IT;.          co
dfd0: 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  st /= 3;.       
dfe0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66   }.        if( f
dff0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
e000: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
e010: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
e020: 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
e030: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
e040: 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
e050: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
e060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e070: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
e080: 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64  ...... range red
e090: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
e0a0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
e0b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e0c0: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69   /* Add the addi
e0d0: 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73  tional cost of s
e0e0: 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69  orting if that i
e0f0: 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20  s a factor..    
e100: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  */.    if( pOrde
e110: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rBy ){.      if(
e120: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
e130: 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26  COLUMN_IN)==0 &&
e140: 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f  .           isSo
e150: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
e160: 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  e,pWC->pMaskSet,
e170: 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64  pProbe,iCur,pOrd
e180: 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29  erBy,nEq,&rev) )
e190: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  {.        if( fl
e1a0: 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ags==0 ){.      
e1b0: 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
e1c0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
e1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e1e0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
e1f0: 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
e200: 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20    if( rev ){.   
e210: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
e220: 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
e230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
e250: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
e260: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  g(cost);.       
e270: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
e280: 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63  .... orderby inc
e290: 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25  reases cost to %
e2a0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
e2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e2c0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
e2d0: 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74  ee if we can get
e2e0: 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67   away with using
e2f0: 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20   just the index 
e300: 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65  without.    ** e
e310: 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ver reading the 
e320: 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20  table.  If that 
e330: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
e340: 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20  n halve the.    
e350: 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20  ** cost of this 
e360: 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
e370: 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 70    if( flags && p
e380: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28  Src->colUsed < (
e390: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
e3a0: 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20  MS-1)) ){.      
e3b0: 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
e3c0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
e3d0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
e3e0: 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d  r(j=0; j<pProbe-
e3f0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
e400: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
e410: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
e420: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
e430: 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
e440: 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
e450: 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
e460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e470: 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
e480: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
e490: 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
e4a0: 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  LY;.        cost
e4b0: 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 57   /= 2;.        W
e4c0: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
e4d0: 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75  .. idx-only redu
e4e0: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
e4f0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
e500: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e510: 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
e520: 20 68 61 73 20 61 63 68 69 65 76 65 64 20 74 68   has achieved th
e530: 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f  e lowest cost so
e540: 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69   far, then use i
e550: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e560: 28 20 66 6c 61 67 73 20 26 26 20 63 6f 73 74 20  ( flags && cost 
e570: 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  < lowestCost ){.
e580: 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20        bestIdx = 
e590: 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f  pProbe;.      lo
e5a0: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
e5b0: 0a 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73  .      bestFlags
e5c0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   = flags;.      
e5d0: 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20  bestNEq = nEq;. 
e5e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
e5f0: 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20 72  eport the best r
e600: 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70  esult.  */.  *pp
e610: 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b  Index = bestIdx;
e620: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
e630: 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73  best index is %s
e640: 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61  , cost=%.9g, fla
e650: 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22  gs=%x, nEq=%d\n"
e660: 2c 0a 20 20 20 20 20 20 20 20 62 65 73 74 49 64  ,.        bestId
e670: 78 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61  x ? bestIdx->zNa
e680: 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c  me : "(none)", l
e690: 6f 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46  owestCost, bestF
e6a0: 6c 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b  lags, bestNEq));
e6b0: 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73  .  *pFlags = bes
e6c0: 74 46 6c 61 67 73 20 7c 20 65 71 54 65 72 6d 4d  tFlags | eqTermM
e6d0: 61 73 6b 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62  ask;.  *pnEq = b
e6e0: 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e  estNEq;.  return
e6f0: 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a   lowestCost;.}..
e700: 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
e710: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
e720: 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
e730: 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
e740: 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
e750: 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
e760: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
e770: 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
e780: 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
e790: 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
e7a0: 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
e7b0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
e7c0: 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
e7d0: 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
e7e0: 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
e7f0: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
e800: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
e810: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
e820: 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
e830: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
e840: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e850: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
e860: 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
e870: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
e880: 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
e890: 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
e8a0: 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
e8b0: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
e8c0: 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
e8d0: 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
e8e0: 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
e8f0: 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
e900: 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
e910: 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
e920: 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
e930: 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
e940: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
e950: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
e960: 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
e970: 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
e980: 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
e990: 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
e9a0: 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
e9b0: 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
e9c0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
e9d0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
e9e0: 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
e9f0: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
ea00: 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
ea10: 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
ea20: 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
ea30: 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
ea40: 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
ea50: 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
ea60: 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
ea70: 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
ea80: 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
ea90: 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
eaa0: 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
eab0: 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
eac0: 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
ead0: 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
eae0: 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
eaf0: 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
eb00: 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
eb10: 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
eb20: 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
eb30: 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
eb40: 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
eb50: 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
eb60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
eb70: 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
eb80: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
eb90: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
eba0: 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
ebb0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 66      && (pTerm->f
ebc0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
ebd0: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
ebe0: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
ebf0: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
ec00: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
ec10: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
ec20: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  n)).  ){.    pTe
ec30: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
ec40: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
ec50: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
ec60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
ec70: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
ec80: 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
ec90: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
eca0: 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
ecb0: 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
ecc0: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
ecd0: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
ece0: 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
ecf0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ed00: 2a 2a 20 41 70 70 6c 79 20 74 68 65 20 61 66 66  ** Apply the aff
ed10: 69 6e 69 74 69 65 73 20 61 73 73 6f 63 69 61 74  inities associat
ed20: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
ed30: 74 20 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 69  t n columns of i
ed40: 6e 64 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f 20  ndex.** pIdx to 
ed50: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68  the values in th
ed60: 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
ed70: 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 0a  arting at base..
ed80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ed90: 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
eda0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
edb0: 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
edc0: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
edd0: 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
ede0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
edf0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 61 73 73  ->pVdbe;.    ass
ee00: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
ee10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee20: 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
ee30: 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
ee40: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
ee50: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
ee60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
ee70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
ee80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
ee90: 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
eea0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
eeb0: 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
eec0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
eed0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
eee0: 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
eef0: 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
ef00: 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
ef10: 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
ef20: 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
ef30: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
ef40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
ef50: 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
ef60: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
ef70: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
ef80: 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
ef90: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
efa0: 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
efb0: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
efc0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
efd0: 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
efe0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
eff0: 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
f000: 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
f010: 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
f020: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
f030: 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
f040: 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
f050: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
f060: 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
f070: 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
f080: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
f090: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
f0a0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
f0b0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
f0c0: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
f0d0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
f0e0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
f0f0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
f100: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
f110: 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
f120: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f130: 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
f140: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  on */.  int iTar
f150: 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
f160: 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
f170: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
f180: 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
f190: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
f1a0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
f1b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f1c0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
f1f0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
f200: 0a 0a 20 20 69 66 28 20 69 54 61 72 67 65 74 3c  ..  if( iTarget<
f210: 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  =0 ){.    iReg =
f220: 20 69 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74   iTarget = sqlit
f230: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f240: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
f250: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
f260: 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
f270: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
f280: 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
f290: 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
f2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
f2b0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
f2c0: 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
f2d0: 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
f2e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
f300: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f310: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
f320: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
f330: 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
f340: 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
f350: 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20  nLoop *pIn;..   
f360: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
f370: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
f380: 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
f390: 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
f3a0: 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
f3b0: 72 73 65 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20  rse, pX, 1);.   
f3c0: 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
f3d0: 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
f3e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f3f0: 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
f400: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
f410: 74 28 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58  t((v, "%.*s", pX
f420: 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70  ->span.n, pX->sp
f430: 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 69 66 28 20  an.z));.    if( 
f440: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29  pLevel->nIn==0 )
f450: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
f460: 6e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nxt = sqlite3Vdb
f470: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
f480: 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
f490: 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  >nIn++;.    pLev
f4a0: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71  el->aInLoop = sq
f4b0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
f4c0: 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
f4d0: 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70   pLevel->aInLoop
f4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
f510: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  vel->aInLoop[0])
f520: 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20  *pLevel->nIn);. 
f530: 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
f540: 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  >aInLoop;.    if
f550: 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
f560: 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49  In += pLevel->nI
f570: 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  n - 1;.      pIn
f580: 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  ->iCur = iTab;. 
f590: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
f5a0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
f5b0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 74  {.        pIn->t
f5c0: 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
f5d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f5e0: 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
f5f0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
f600: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 74  {.        pIn->t
f610: 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
f620: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f630: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
f640: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
f650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f660: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
f670: 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
f680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f690: 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a  Level->nIn = 0;.
f6a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f6b0: 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
f6c0: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
f6d0: 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
f6e0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f6f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
f700: 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
f710: 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
f720: 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
f730: 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 66  x.  The values f
f740: 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  or all constrain
f750: 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74  ts are left on t
f760: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
f770: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
f780: 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
f790: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
f7a0: 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
f7b0: 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
f7c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
f7d0: 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
f7e0: 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
f7f0: 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
f800: 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
f810: 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
f820: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
f830: 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
f840: 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
f850: 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
f860: 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
f870: 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
f880: 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
f890: 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
f8a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f8b0: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
f8c0: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
f8d0: 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
f8e0: 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
f8f0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
f900: 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  d b will be left
f910: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
f920: 20 2d 20 61 20 69 73 20 74 68 65 20 64 65 65 70   - a is the deep
f930: 65 73 74 20 61 6e 64 20 62 20 74 68 65 20 73 68  est and b the sh
f940: 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  allowest..**.** 
f950: 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
f960: 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
f970: 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
f980: 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
f990: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
f9a0: 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
f9b0: 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
f9c0: 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
f9d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
f9e0: 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
f9f0: 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
fa00: 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
fa10: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
fa20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fa30: 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
fa40: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
fa50: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75  mory cell and pu
fa60: 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  ts.** the addres
fa70: 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  s of that memory
fa80: 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d   cell in pLevel-
fa90: 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65  >iMem.  The code
faa0: 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
fab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
fac0: 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   use pLevel->iMe
fad0: 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  m to store the t
fae0: 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
faf0: 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
fb00: 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
fb10: 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
fb20: 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
fb30: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
fb40: 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
fb50: 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
fb60: 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
fb70: 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a  rnal.** use..*/.
fb80: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
fb90: 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
fba0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fbb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
fbc0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fbd0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
fbe0: 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
fbf0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
fc00: 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
fc10: 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
fc20: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
fc30: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
fc40: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
fc50: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
fc60: 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
fc70: 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
fc80: 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
fc90: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
fca0: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g         /* Num
fcb0: 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
fcc0: 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
fcd0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  te */.){.  int n
fce0: 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
fcf0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
fd00: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
fd10: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  IN constraints t
fd20: 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65  o code */.  Vdbe
fd30: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
fd40: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
fd50: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fd60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fd70: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
fd80: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
fd90: 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  Idx;   /* The in
fda0: 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
fdb0: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
fdc0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65    int iCur = pLe
fdd0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20  vel->iTabCur;   
fde0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
fdf0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
fe00: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
fe10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fe20: 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
fe30: 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  aint term */.  i
fe40: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe60: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fe70: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
fea0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
feb0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
fec0: 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
fed0: 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
fee0: 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a  ocate them..  **
fef0: 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20   We always need 
ff00: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65  at least one use
ff10: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c  d to store the l
ff20: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20  oop terminator. 
ff30: 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74   ** value.  If t
ff40: 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72  here are IN oper
ff50: 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64  ators we'll need
ff60: 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d   one for each ==
ff70: 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73   or.  ** IN cons
ff80: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70  traint..  */.  p
ff90: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
ffa0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
ffb0: 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72    regBase = pPar
ffc0: 73 65 2d 3e 6e 4d 65 6d 20 2b 20 32 3b 0a 20 20  se->nMem + 2;.  
ffd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
ffe0: 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 2b 20 32 20  pLevel->nEq + 2 
fff0: 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 0a 20 20  + nExtraReg;..  
10000 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
10010 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
10020 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
10030 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
10040 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
10050 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
10060 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
10070 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
10080 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
10090 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
100a0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
100b0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
100c0 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  ->flags, pIdx);.
100d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
100e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
100f0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
10100 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
10110 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d  )==0 );.    r1 =
10120 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
10130 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
10140 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
10150 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
10160 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
10170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
10190 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
101a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  );.    }.    tes
101b0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
101c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
101d0 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
101e0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
101f0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
10200 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
10210 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
10220 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
10230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10240 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10250 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
10260 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 62  ase+j, pLevel->b
10270 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rk);.    }.  }. 
10280 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
10290 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
102a0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
102b0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
102c0 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
102d0 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
102e0 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
102f0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
10300 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10310 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
10320 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
10330 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
10340 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
10350 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
10360 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
10370 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
10380 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
10390 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
103a0 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
103b0 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
103c0 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
103d0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
103e0 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
103f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10400 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
10410 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
10420 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
10430 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
10440 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
10450 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
10460 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
10470 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
10480 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
10490 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66  fo){.  if( pWInf
104a0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  o ){.    int i;.
104b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
104c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
104d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
104e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
104f0 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
10500 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
10510 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
10520 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10530 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
10540 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20  eeIdxStr==0 );. 
10550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10560 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20  ree(pInfo);.    
10570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10580 6c 69 74 65 33 5f 66 72 65 65 28 70 57 49 6e 66  lite3_free(pWInf
10590 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  o);.  }.}.../*.*
105a0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
105b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
105c0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
105d0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
105e0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
105f0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
10600 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
10610 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
10620 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
10630 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
10640 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
10650 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
10660 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
10670 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
10680 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
10690 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
106a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
106b0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
106c0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
106d0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
106e0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
106f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
10700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
10710 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10720 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
10730 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
10740 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
10750 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
10760 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
10770 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
10780 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
10790 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
107a0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
107b0 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
107c0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
107d0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
107e0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
107f0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
10800 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
10810 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
10820 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
10830 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
10840 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
10850 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
10860 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
10870 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
10880 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
10890 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
108a0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
108b0 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
108c0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
108d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
108e0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
108f0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
10900 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
10910 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
10920 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
10930 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
10940 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
10950 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
10960 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
10970 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
10980 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
109b0 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
109c0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
109e0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
109f0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
10a00 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
10a10 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
10a20 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
10a30 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
10a40 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
10a50 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
10a60 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
10a70 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
10a80 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
10a90 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
10aa0 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
10ab0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
10ac0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
10ad0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
10ae0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
10af0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
10b00 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
10b10 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
10b20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
10b30 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
10b40 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
10b50 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
10b60 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
10b70 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
10b80 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
10b90 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
10ba0 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
10bb0 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
10bc0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
10bd0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
10be0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
10bf0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
10c00 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
10c10 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
10c20 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
10c30 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
10c40 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
10c50 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
10c60 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
10c70 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
10c80 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
10c90 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
10ca0 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
10cb0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
10cc0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
10cd0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
10ce0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
10cf0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
10d00 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
10d10 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
10d20 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
10d30 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
10d40 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
10d50 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
10d60 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
10d70 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
10d80 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
10d90 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
10da0 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
10db0 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
10dc0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
10dd0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
10de0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
10df0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
10e00 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
10e10 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
10e20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10e30 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
10e40 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
10e50 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
10e60 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
10e70 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
10e80 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
10e90 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
10ea0 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
10eb0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
10ec0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
10ed0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
10ee0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
10ef0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
10f00 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
10f10 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
10f20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10f30 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
10f40 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
10f50 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
10f60 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
10f70 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
10f80 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
10f90 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
10fa0 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
10fb0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10fc0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
10fd0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
10fe0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
10ff0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
11000 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
11010 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
11020 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
11030 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
11040 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
11050 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
11060 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
11070 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
11080 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
11090 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
110a0 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
110b0 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
110c0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
110d0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
110e0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
110f0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
11100 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
11110 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
11120 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
11130 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
11140 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
11150 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
11160 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
11170 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
11180 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
11190 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
111a0 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
111b0 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
111c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
111d0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
111e0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
111f0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
11200 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
11210 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
11220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
11230 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
11240 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11250 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
11260 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
11270 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
11280 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
11290 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
112a0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
112b0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
112c0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
112d0 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
112e0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
112f0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
11300 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
11310 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
11320 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
11330 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
11340 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
11350 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
11360 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
11370 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
11380 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
11390 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
113a0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
113b0 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
113c0 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
113d0 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
113e0 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
113f0 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
11400 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
11410 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
11420 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
11430 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
11440 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
11450 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
11460 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
11470 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
11480 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
11490 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
114a0 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
114b0 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
114c0 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
114d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
114e0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
114f0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
11500 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
11510 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
11520 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
11530 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
11540 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
11550 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11560 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11570 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c  ist **ppOrderBy,
11580 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
11590 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
115a0 2a 2f 0a 20 20 75 38 20 77 66 6c 61 67 73 20 20  */.  u8 wflags  
115b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
115c0 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
115d0 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
115e0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
115f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11620 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
11630 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
11640 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
11650 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11660 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
11670 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
11680 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
11690 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
116a0 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
116b0 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63   */.  int brk, c
116c0 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ont = 0;        
116d0 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73   /* Addresses us
116e0 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ed during code g
116f0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  eneration */.  B
11700 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11720 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11730 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
11740 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11750 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
11760 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11770 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
11780 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
11790 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20  askSet maskSet; 
117a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
117b0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
117c0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
117d0 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20  e wc;           
117e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
117f0 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20  ause is divided 
11800 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73  into these terms
11810 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11820 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
11830 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
11840 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
11850 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
11860 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
11870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11880 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
11890 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
118a0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
118d0 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
118e0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
118f0 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
11900 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
11910 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
11920 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61  f all wc.a[].fla
11930 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
11940 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
11950 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11960 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
11970 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11980 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  y = 0;..  /* The
11990 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
119a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
119b0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
119c0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
119d0 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
119e0 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
119f0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11a00 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
11a10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11a20 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
11a30 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
11a40 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
11a50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
11a60 69 66 28 20 70 70 4f 72 64 65 72 42 79 20 29 7b  if( ppOrderBy ){
11a70 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
11a80 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  *ppOrderBy;.  }.
11a90 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
11aa0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
11ab0 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
11ac0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
11ad0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
11ae0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
11af0 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
11b00 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
11b10 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73  initMaskSet(&mas
11b20 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
11b30 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50  auseInit(&wc, pP
11b40 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74 29 3b  arse, &maskSet);
11b50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
11b60 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  deConstants(pPar
11b70 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77  se, pWhere);.  w
11b80 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20 70  hereSplit(&wc, p
11b90 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
11ba0 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61      .  /* Alloca
11bb0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
11bc0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
11bd0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
11be0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
11bf0 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
11c00 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
11c10 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 49 6e  arse->db;.  pWIn
11c20 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
11c30 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 20 0a 20  llocZero(db,  . 
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
11c60 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73  eInfo) + pTabLis
11c70 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57  t->nSrc*sizeof(W
11c80 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69  hereLevel));.  i
11c90 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11ca0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
11cb0 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
11cc0 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
11cd0 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73 74  Level = pTabList
11ce0 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f  ->nSrc;.  pWInfo
11cf0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
11d00 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
11d10 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
11d20 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
11d30 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
11d40 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
11d50 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
11d60 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
11d70 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
11d80 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
11d90 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
11da0 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
11db0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
11dc0 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
11dd0 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
11de0 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69  Where && (pTabLi
11df0 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73  st->nSrc==0 || s
11e00 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11e10 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
11e20 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
11e30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
11e40 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
11e50 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
11e60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
11e70 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
11e80 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  0;.  }..  /* Ass
11e90 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
11ea0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
11eb0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
11ec0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
11ed0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
11ee0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
11ef0 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
11f00 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
11f10 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
11f20 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
11f30 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
11f40 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
11f50 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
11f60 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
11f70 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
11f80 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
11f90 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
11fa0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
11fb0 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
11fc0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
11fd0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
11fe0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
11ff0 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
12000 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
12010 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
12020 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
12030 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
12040 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
12050 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
12060 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
12070 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
12080 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
12090 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
120a0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
120b0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
120c0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
120d0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
120e0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
120f0 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
12100 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
12110 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2f  cket #3015..  */
12120 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
12130 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
12140 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
12150 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
12160 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
12170 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
12180 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
12190 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
121a0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
121b0 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
121c0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
121d0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
121e0 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
121f0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12200 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
12210 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
12220 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
12230 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
12240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
12250 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
12260 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
12270 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
12280 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
12290 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
122a0 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
122b0 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
122c0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
122d0 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
122e0 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
122f0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
12300 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
12310 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
12320 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
12330 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
12340 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
12350 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
12360 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
12370 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
12380 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
12390 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20 69 66  List, &wc);.  if
123a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
123b0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
123c0 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a  hereBeginNoMem;.
123d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
123e0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
123f0 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
12400 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
12410 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
12420 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
12430 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
12440 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
12450 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
12460 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
12470 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
12480 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
12490 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
124a0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c    pWInfo->a[].fl
124b0 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78 78  ags     WHERE_xx
124c0 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
124d0 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
124e0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
124f0 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
12500 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
12510 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
12520 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12530 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e 20  .iFrom     When 
12540 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
12550 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67   clause is being
12560 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57   coded.  **   pW
12570 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75  Info->a[].iTabCu
12580 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
12590 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
125a0 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20  base table.  ** 
125b0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49    pWInfo->a[].iI
125c0 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45  dxCur   The VDBE
125d0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
125e0 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20  index.  **.  ** 
125f0 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
12600 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
12610 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
12620 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12630 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
12640 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
12650 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
12660 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62   pTabItem = pTab
12670 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65  List->a;.  pLeve
12680 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
12690 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a   andFlags = ~0;.
126a0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
126b0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
126c0 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
126d0 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
126e0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
126f0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
12700 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
12710 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
12720 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12730 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
12740 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
12750 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
12760 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
12770 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
12780 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77 69  s asssociated wi
12790 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  th pIdx */.    i
127a0 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
127b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
127c0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
127d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
127e0 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72 20  /* The cost for 
12810 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pIdx */.    int 
12820 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
12830 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
12840 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d  ooping over FROM
12850 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49   tables */.    I
12860 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
12870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12880 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65 65  e best index see
12890 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
128a0 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20  int bestFlags = 
128b0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
128c0 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
128d0 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
128e0 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20    int bestNEq = 
128f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
12900 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64 20   nEq associated 
12910 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
12920 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43    double lowestC
12930 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ost;          /*
12940 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42 65   Cost of the pBe
12950 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  st */.    int be
12960 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  stJ = 0;        
12970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
12980 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
12990 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
129a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
129b0 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
129c0 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
129d0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20    int once = 0; 
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
129f0 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73 74   True when first
12a00 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20 2a   table is seen *
12a10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
12a20 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 64 65 78  dex_info *pIndex
12a30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 69 72  ; /* Current vir
12a40 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  tual index */.. 
12a50 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
12a60 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
12a70 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
12a80 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
12a90 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61  ist->a[j]; j<pTa
12aa0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b  bList->nSrc; j++
12ab0 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20  , pTabItem++){. 
12ac0 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65       int doNotRe
12ad0 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65 20  order;  /* True 
12ae0 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68  if this table sh
12af0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72  ould not be reor
12b00 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20 20 20  dered */..      
12b10 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20  doNotReorder =  
12b20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
12b30 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
12b40 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20  T_CROSS))!=0;.  
12b50 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26 20      if( once && 
12b60 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
12b70 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20  reak;.      m = 
12b80 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
12b90 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
12ba0 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
12bb0 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
12bc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
12bd0 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f   j==iFrom ) iFro
12be0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  m++;.        con
12bf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
12c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
12c10 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
12c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12c30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12c40 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
12c50 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
12c60 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
12c70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12c80 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20  o **ppIdxInfo = 
12c90 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49  &pWInfo->a[j].pI
12ca0 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
12cb0 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72 74 75  cost = bestVirtu
12cc0 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  alIndex(pParse, 
12cd0 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  &wc, pTabItem, n
12ce0 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65 72           ppOrder
12d10 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  By ? *ppOrderBy 
12d20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20 20  : 0, i==0,.     
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 70 70 49 64 78             ppIdx
12d50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
12d60 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
12d70 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20 20  TUALTABLE;.     
12d80 20 20 20 70 49 6e 64 65 78 20 3d 20 2a 70 70 49     pIndex = *ppI
12d90 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
12da0 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
12db0 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ndex->orderByCon
12dc0 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20 20  sumed ){.       
12dd0 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
12de0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c 20  _VIRTUALTABLE | 
12df0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
12e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e10 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20   pIdx = 0;.     
12e20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20     nEq = 0;.    
12e30 20 20 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f      if( (SQLITE_
12e40 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c 63 6f 73  BIG_DBL/2.0)<cos
12e50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  t ){.          /
12e60 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f  * The cost is no
12e70 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
12e80 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49  larger than SQLI
12e90 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a  TE_BIG_DBL (the.
12ea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69            ** ini
12eb0 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77  tal value of low
12ec0 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20  estCost in this 
12ed0 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20  loop. If it is, 
12ee0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  then.          *
12ef0 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77 65  * the (cost<lowe
12f00 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c  stCost) test bel
12f10 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ow will never be
12f20 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 20 20   true and.      
12f30 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c 2d 3e 70      ** pLevel->p
12f40 42 65 73 74 49 64 78 20 6e 65 76 65 72 20 73 65  BestIdx never se
12f50 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20  t..          */ 
12f60 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
12f70 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  = (SQLITE_BIG_DB
12f80 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20 20 20 20  L/2.0);.        
12f90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23  }.      }else .#
12fa0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
12fb0 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
12fc0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
12fd0 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  wc, pTabItem, no
12fe0 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
13010 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
13020 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26  &pIdx, &flags, &
13050 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70 49  nEq);.        pI
13060 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
13070 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73 74  }.      if( cost
13080 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
13090 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b         once = 1;
130a0 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43  .        lowestC
130b0 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
130c0 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
130d0 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46 6c  ;.        bestFl
130e0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
130f0 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
13100 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  Eq;.        best
13110 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  J = j;.        p
13120 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20  Level->pBestIdx 
13130 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  = pIndex;.      
13140 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f  }.      if( doNo
13150 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
13160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  ;.    }.    WHER
13170 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
13180 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74 61  imizer choose ta
13190 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20  ble %d for loop 
131a0 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20  %d\n", bestJ,.  
131b0 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
131c0 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20  pWInfo->a));.   
131d0 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73 20   if( (bestFlags 
131e0 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  & WHERE_ORDERBY)
131f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  !=0 ){.      *pp
13200 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
13210 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20   }.    andFlags 
13220 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20  &= bestFlags;.  
13230 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20    pLevel->flags 
13240 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20  = bestFlags;.   
13250 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20   pLevel->pIdx = 
13260 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76 65  pBest;.    pLeve
13270 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45 71  l->nEq = bestNEq
13280 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49  ;.    pLevel->aI
13290 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70  nLoop = 0;.    p
132a0 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a  Level->nIn = 0;.
132b0 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
132c0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
132d0 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
132e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nTab++;.    }el
132f0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
13300 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
13310 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61      }.    notRea
13320 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
13330 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  maskSet, pTabLis
13340 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72  t->a[bestJ].iCur
13350 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  sor);.    pLevel
13360 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b  ->iFrom = bestJ;
13370 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
13380 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
13390 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
133a0 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  "));..  /* If th
133b0 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e  e total query on
133c0 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e  ly selects a sin
133d0 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68  gle row, then th
133e0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
133f0 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65  clause is irrele
13400 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  vant..  */.  if(
13410 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
13420 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26  RE_UNIQUE)!=0 &&
13430 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20   ppOrderBy ){.  
13440 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
13450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
13460 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
13470 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
13480 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13490 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
134a0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
134b0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
134c0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
134d0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
134e0 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
134f0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
13500 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
13510 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
13520 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
13530 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
13540 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
13550 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
13560 74 28 20 28 77 66 6c 61 67 73 20 26 20 57 48 45  t( (wflags & WHE
13570 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
13580 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
13590 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
135a0 20 69 66 28 20 28 77 66 6c 61 67 73 20 26 20 57   if( (wflags & W
135b0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
135c0 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64  IRED)!=0 && (and
135d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
135e0 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
135f0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
13600 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
13610 6f 2d 3e 61 5b 30 5d 2e 66 6c 61 67 73 20 26 3d  o->a[0].flags &=
13620 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
13630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
13640 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
13650 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
13660 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
13670 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
13680 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
13690 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  bles..  */.  sql
136a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
136b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
136c0 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
136d0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
136e0 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  Goto */.  for(i=
136f0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
13700 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
13710 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
13720 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
13730 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
13740 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
13750 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b 20      Index *pIx; 
13760 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
13770 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54 61  ed to access pTa
13780 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  b (if any) */.  
13790 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
137a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
137b0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
137c0 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
137d0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
137e0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
137f0 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
13800 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
13810 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  N.    if( pParse
13820 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
13830 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
13840 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
13850 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
13860 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
13870 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
13880 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
13890 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
138a0 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49  , "TABLE %s", pI
138b0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
138c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
138d0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
138e0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
138f0 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 41 53  rintf(db, "%z AS
13900 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
13910 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
13920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
13930 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
13940 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  x)!=0 ){.       
13950 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
13960 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 57  Printf(db, "%z W
13970 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a  ITH INDEX %s", z
13980 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  Msg, pIx->zName)
13990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
139a0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
139b0 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
139c0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
139d0 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NGE) ){.        
139e0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
139f0 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 55 53  rintf(db, "%z US
13a00 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
13a10 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
13a20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13a30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13a40 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
13a50 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
13a60 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
13a70 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13a80 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65 76  *pBestIdx = pLev
13a90 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20 20  el->pBestIdx;.  
13aa0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
13ab0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
13ac0 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%z VIRTUAL TABL
13ad0 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
13ae0 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
13af0 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49            pBestI
13b00 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65 73  dx->idxNum, pBes
13b10 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20  tIdx->idxStr);. 
13b20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13b30 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
13b40 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  flags & WHERE_OR
13b50 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20 20  DERBY ){.       
13b60 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
13b70 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 4f  Printf(db, "%z O
13b80 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b  RDER BY", zMsg);
13b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13bb0 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
13bc0 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
13bd0 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
13be0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65  NAMIC);.    }.#e
13bf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
13c00 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20  MIT_EXPLAIN */. 
13c10 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
13c20 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
13c30 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
13c40 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
13c50 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
13c60 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
13c70 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
13c80 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13c90 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
13ca0 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e  sEphem || pTab->
13cb0 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
13cc0 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
13cd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13ce0 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65  ABLE.    if( pLe
13cf0 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b  vel->pBestIdx ){
13d00 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
13d10 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
13d20 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
13d30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13d40 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
13d50 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
13d70 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d  onst char*)pTab-
13d80 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42 29  >pVtab, P4_VTAB)
13d90 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
13da0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
13db0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
13dc0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
13dd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
13de0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
13df0 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
13e00 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
13e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
13e20 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13e30 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
13e40 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
13e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  );.      if( !pW
13e60 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
13e70 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73  && pTab->nCol<(s
13e80 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
13e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
13ea0 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
13eb0 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
13ec0 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
13ed0 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
13ee0 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
13ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13f00 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71  beChangeP2(v, sq
13f10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
13f20 41 64 64 72 28 76 29 2d 32 2c 20 6e 29 3b 0a 20  Addr(v)-2, n);. 
13f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
13f40 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
13f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13f60 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
13f70 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
13f80 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
13f90 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
13fa0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  e);.    }.    pL
13fb0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
13fc0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
13fd0 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78 20  r;.    if( (pIx 
13fe0 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
13ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  =0 ){.      KeyI
14000 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
14010 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
14020 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
14030 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
14040 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
14050 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
14060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14070 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  p2(v, OP_SetNumC
14080 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 49 78 2d 3e  olumns, 0, pIx->
14090 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20  nColumn+1);.    
140a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
140b0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
140c0 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78  ad, iIdxCur, pIx
140d0 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14100 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
14110 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62  DOFF);.      Vdb
14120 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
14130 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
14140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14150 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
14160 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
14170 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
14180 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
14190 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
141a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
141b0 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
141c0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
141d0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
141e0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
141f0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
14200 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
14210 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
14220 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
14230 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
14240 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
14250 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  k)0;.  for(i=0, 
14260 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
14270 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
14280 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
14290 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  +){.    int j;. 
142a0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
142b0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
142c0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
142d0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
142e0 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  le */.    Index 
142f0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  *pIdx;       /* 
14300 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
14310 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
14320 20 20 69 6e 74 20 6e 78 74 3b 20 20 20 20 20 20    int nxt;      
14330 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
14340 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
14350 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
14360 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69  IN case */.    i
14370 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
14380 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
14390 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
143a0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d  ex */.    int om
143b0 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20  itTable;     /* 
143c0 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
143d0 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
143e0 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20  .    int bRev;  
143f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14400 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
14410 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
14420 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62  der */..    pTab
14430 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
14440 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
14450 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70  m];.    iCur = p
14460 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
14470 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ;.    pIdx = pLe
14480 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69  vel->pIdx;.    i
14490 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
144a0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52  >iIdxCur;.    bR
144b0 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  ev = (pLevel->fl
144c0 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
144d0 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69  RSE)!=0;.    omi
144e0 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c  tTable = (pLevel
144f0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
14500 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20  IDX_ONLY)!=0;.. 
14510 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
14520 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
14530 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
14540 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
14550 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
14560 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
14570 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65  mp to brk to bre
14580 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
14590 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  ..    ** Jump to
145a0 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
145b0 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
145c0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
145d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70   the.    ** loop
145e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
145f0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
14600 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
14610 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 6e 78   also have a "nx
14620 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
14630 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
14640 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
14650 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
14660 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
14670 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
14680 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
14690 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
146a0 69 6e 74 73 2c 20 74 68 65 20 22 6e 78 74 22 20  ints, the "nxt" 
146b0 6c 61 62 65 6c 0a 20 20 20 20 2a 2a 20 69 73 20  label.    ** is 
146c0 74 68 65 20 73 61 6d 65 20 61 73 20 22 62 72 6b  the same as "brk
146d0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72  "..    */.    br
146e0 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20  k = pLevel->brk 
146f0 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20  = pLevel->nxt = 
14700 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14710 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e  abel(v);.    con
14720 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74  t = pLevel->cont
14730 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14740 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
14750 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
14760 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
14770 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
14780 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
14790 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c  d.    ** initial
147a0 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
147b0 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
147c0 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
147d0 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20  ches any.    ** 
147e0 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
147f0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
14800 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
14810 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
14820 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
14830 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
14840 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
14850 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
14860 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
14870 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
14880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14890 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
148a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
148b0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
148c0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
148d0 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
148e0 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  ch flag"));.    
148f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14900 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14910 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76  BLE.    if( pLev
14920 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a  el->pBestIdx ){.
14930 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a        /* Case 0:
14940 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
14950 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
14960 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
14970 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 20   and VNext.     
14980 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
14990 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
149a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
149b0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  int j;.      int
149c0 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
149d0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
149e0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
149f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14a00 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65 76  *pBestIdx = pLev
14a10 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20 20  el->pBestIdx;.  
14a20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
14a30 69 6e 74 20 3d 20 70 42 65 73 74 49 64 78 2d 3e  int = pBestIdx->
14a40 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  nConstraint;.   
14a50 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
14a60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
14a70 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
14a80 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 61       pBestIdx->a
14ac0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
14ad0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74 72  .      const str
14ae0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14af0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
14b00 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
14b40 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  estIdx->aConstra
14b50 69 6e 74 3b 0a 0a 20 20 20 20 20 20 69 52 65 67  int;..      iReg
14b60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14b70 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
14b80 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
14b90 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
14ba0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
14bb0 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
14bc0 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  <=nConstraint; j
14bd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
14be0 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
14bf0 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69  k=0; k<nConstrai
14c00 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; k++){.      
14c10 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
14c20 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
14c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
14c40 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
14c50 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66  raint[k].iTermOf
14c60 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
14c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14c80 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b 69  e(pParse, wc.a[i
14c90 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69  Term].pExpr->pRi
14ca0 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a  ght, iReg+j+1);.
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14cc0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
14cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ce0 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61   if( k==nConstra
14cf0 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  int ) break;.   
14d00 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73     }.      pPars
14d10 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
14d20 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
14d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42 65   OP_Integer, pBe
14d50 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69  stIdx->idxNum, i
14d60 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
14d70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31   OP_Integer, j-1
14d90 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  , iReg+1);.     
14da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14db0 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
14dc0 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69 52 65  , iCur, brk, iRe
14dd0 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  g, pBestIdx->idx
14de0 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
14e00 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  stIdx->needToFre
14e10 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52  eIdxStr ? P4_MPR
14e20 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
14e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14e40 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
14e50 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
14e60 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
14e70 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e       pBestIdx->n
14e80 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
14e90 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
14ea0 3d 30 3b 20 6a 3c 70 42 65 73 74 49 64 78 2d 3e  =0; j<pBestIdx->
14eb0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
14ec0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
14ed0 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
14ee0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14ef0 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
14f00 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
14f10 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  t;.          dis
14f20 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
14f30 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29 3b 0a   &wc.a[iTerm]);.
14f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14f50 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
14f60 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
14f70 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
14f80 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
14f90 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
14fa0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14fb0 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  r(v);.    }else.
14fc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14fd0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14fe0 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  LE */..    if( p
14ff0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
15000 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
15010 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
15020 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
15030 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
15040 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
15050 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
15060 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
15070 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
15080 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
15090 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
150a0 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
150b0 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
150c0 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
150d0 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
150e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
150f0 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
15100 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  /.      int r1;.
15110 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
15120 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
15130 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
15140 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
15150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15160 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20  Term!=0 );.     
15170 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
15180 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
15190 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
151a0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
151b0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
151c0 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
151d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 63 6f  );.      r1 = co
151e0 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
151f0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
15200 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  evel, 0);.      
15210 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  nxt = pLevel->nx
15220 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15240 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
15250 6e 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nxt);.      sqli
15260 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15270 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
15280 43 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20  Cur, nxt, r1);. 
15290 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
152a0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
152b0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
152c0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
152d0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
152e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
152f0 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
15300 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
15310 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
15320 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
15330 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
15340 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
15350 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
15360 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
15370 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
15380 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
15390 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
153a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
153b0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
153c0 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
153d0 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
153e0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
153f0 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
15400 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64       pEnd = find
15410 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
15420 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
15430 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
15440 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
15450 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
15460 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   pStart;.       
15470 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
15480 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
15490 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
154a0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
154b0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
154c0 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
154d0 72 31 2c 20 72 65 67 46 72 65 65 31 3b 0a 20 20  r1, regFree1;.  
154e0 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
154f0 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
15500 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
15510 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
15520 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  t( pStart->leftC
15530 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
15540 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
15550 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15560 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
15570 68 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ht, &regFree1);.
15580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15590 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
155a0 46 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20 62 72  ForceInt, r1, br
155b0 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c   pX->op==TK_LE |
155e0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29  | pX->op==TK_GT)
155f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15600 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
15610 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20  Rev ? OP_MoveLt 
15620 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  : OP_MoveGe, iCu
15630 72 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20  r, brk, r1);.   
15640 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
15650 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
15660 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15670 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15680 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
15690 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
156a0 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
156b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
156c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
156d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
156e0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
156f0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62  _Rewind, iCur, b
15700 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rk);.      }.   
15710 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
15720 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
15730 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 45  .        pX = pE
15740 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
15750 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
15760 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
15770 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
15780 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
15790 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
157a0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
157b0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
157c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
157d0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
157e0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a   pLevel->iMem);.
157f0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e          if( pX->
15800 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
15810 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
15820 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
15830 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
15840 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Ge;.        }
15850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15860 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
15870 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
15880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15890 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
158a0 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
158b0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20    }.      start 
158c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
158d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
158e0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
158f0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
15900 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
15910 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
15920 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
15930 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
15940 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
15950 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
15960 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
15970 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15980 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
15990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
159a0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
159b0 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
159c0 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  /* sqlite3VdbeAd
159d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
159e0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
159f0 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  0); */.        s
15a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15a10 28 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c 65 76  (v, testOp, pLev
15a20 65 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c 20 72  el->iMem, brk, r
15a30 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
15a40 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
15a50 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
15a60 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
15a70 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
15a80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15a90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15aa0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
15ab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
15ac0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48  vel->flags & (WH
15ad0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
15ae0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
15af0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  ) ){.      /* Ca
15b00 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69  se 3: A scan usi
15b10 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  ng an index..   
15b20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
15b30 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
15b40 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
15b50 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
15b60 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 20   equality .     
15b70 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d   **         term
15b80 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  s ("==" or "IN" 
15b90 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20  operators) that 
15ba0 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20  refer to the N. 
15bb0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15bc0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
15bd0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
15be0 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
15bf0 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ain.      **    
15c00 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
15c10 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
15c20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
15c30 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
15c40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
15c50 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
15c60 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
15c70 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
15c80 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  nly .      **   
15c90 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
15ca0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
15cb0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
15cc0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
15cd0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15ce0 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61    use the "==" a
15cf0 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  nd "IN" operator
15d00 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
15d10 69 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  if the .      **
15d20 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
15d30 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
15d40 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
15d50 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
15d60 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20   .      **      
15d70 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
15d80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15d90 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
15da0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15db0 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
15dc0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15dd0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
15de0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15df0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
15e00 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 20 20   AND y<10.      
15e10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
15e20 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c  5 AND y=5 AND z<
15e30 3d 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  =10.      **.   
15e40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
15e50 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
15e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
15e70 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
15e80 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  y.      **      
15e90 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a     the x=5 term:
15ea0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15eb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
15ec0 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 20  5 AND z<10.     
15ed0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
15ee0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
15ef0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
15f00 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
15f10 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2a  raints..      **
15f20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
15f30 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c  e are no inequal
15f40 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
15f50 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20   then N is at.  
15f60 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
15f70 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 20 20  east one..      
15f80 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
15f90 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
15fa0 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
15fb0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
15fc0 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
15fd0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
15fe0 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
15ff0 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
16000 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
16010 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
16020 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
16030 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
16040 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
16050 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 20  ER BY..      */ 
16060 20 0a 20 20 20 20 20 20 69 6e 74 20 61 53 74 61   .      int aSta
16070 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
16080 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 30 2c     0,.        0,
16090 0a 20 20 20 20 20 20 20 20 4f 50 5f 52 65 77 69  .        OP_Rewi
160a0 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
160b0 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
160c0 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
160d0 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
160e0 0a 20 20 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  .        OP_Last
160f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16100 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
16110 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
16120 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
16130 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65  .        OP_Move
16140 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
16150 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
16160 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
16170 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
16180 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65  .        OP_Move
16190 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
161a0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
161b0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
161c0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
161d0 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65  .        OP_Move
161e0 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Ge,           /*
161f0 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   6: (start_const
16200 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
16210 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
16220 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65  .        OP_Move
16230 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
16240 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
16250 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
16260 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
16270 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
16280 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b  int aEndOp[] = {
16290 0a 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70  .        OP_Noop
162a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
162b0 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
162c0 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
162d0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
162e0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
162f0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
16300 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
16310 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20     OP_IdxLT     
16320 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
16330 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
16340 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20  & bRev) */.     
16350 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   };.      int nE
16360 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
16370 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  .      int isMin
16380 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
16390 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
163a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
163b0 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
163c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 42  /.      int regB
163d0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
163e0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
163f0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
16400 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
16410 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  */.      int r1;
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
16440 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
16450 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
16460 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20  eStart = 0;  /* 
16470 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
16480 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73  raint at range s
16490 74 61 72 74 20 2a 2f 0a 20 20 20 20 20 20 57 68  tart */.      Wh
164a0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
164b0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
164c0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
164d0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
164e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
164f0 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
16500 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
16510 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
16520 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
16530 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64  */.      int end
16540 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
16550 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16560 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
16570 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
16580 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f        int start_
16590 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
165a0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
165b0 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
165c0 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ned */.      int
165d0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
165e0 75 6d 6e 5b 6e 45 71 5d 3b 20 2f 2a 20 43 6f 6c  umn[nEq]; /* Col
165f0 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69  umn for inequali
16600 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
16610 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e  /.      int nCon
16620 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
16630 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16640 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
16650 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
16660 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  op;..      /* Ge
16670 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
16680 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
16690 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
166a0 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
166b0 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
166c0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
166d0 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
166e0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
166f0 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74  s.      ** start
16700 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
16710 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
16720 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
16730 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
16740 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77  arse, pLevel, &w
16750 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32 29 3b  c, notReady, 2);
16760 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65  .      nxt = pLe
16770 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20 20 20  vel->nxt;..     
16780 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
16790 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
167a0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
167b0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
167c0 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 70 61  .      ** was pa
167d0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
167e0 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65  ction to impleme
167f0 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  nt a "SELECT min
16800 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 20 20  (x) ..." .      
16810 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
16820 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
16830 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
16840 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
16850 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
16860 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
16870 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
16880 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
16890 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c  d.      ** shoul
168a0 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
168b0 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
168c0 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
168d0 20 27 78 27 20 69 73 0a 20 20 20 20 20 20 2a 2a   'x' is.      **
168e0 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
168f0 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
16900 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16910 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
16920 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65        ** this re
16930 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
16940 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
16950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16960 20 28 77 66 6c 61 67 73 26 57 48 45 52 45 5f 4f   (wflags&WHERE_O
16970 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
16980 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
16990 2d 3e 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  ->flags&WHERE_OR
169a0 44 45 52 42 59 29 0a 20 20 20 20 20 20 20 26 26  DERBY).       &&
169b0 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e   (pIdx->nColumn>
169c0 6e 45 71 29 0a 20 20 20 20 20 20 20 26 26 20 28  nEq).       && (
169d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
169e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
169f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
16a00 71 5d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  q]).      ){.   
16a10 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
16a20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
16a30 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
16a40 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
16a50 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
16a60 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
16a70 64 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  d .      ** of t
16a80 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 20  he range. .     
16a90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c   */.      if( pL
16aa0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
16ab0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
16ac0 0a 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 45  .        pRangeE
16ad0 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  nd = findTerm(&w
16ae0 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  c, iCur, k, notR
16af0 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
16b00 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
16b10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
16b20 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
16b30 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
16b40 0a 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 53  .        pRangeS
16b50 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
16b60 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
16b70 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57  tReady, (WO_GT|W
16b80 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_GE), pIdx);.  
16b90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16ba0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
16bb0 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
16bc0 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
16bd0 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
16be0 20 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72       ** a forwar
16bf0 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
16c00 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
16c10 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
16c20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74  the .      ** st
16c30 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
16c40 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
16c50 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
16c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16c70 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  ( bRev==(pIdx->a
16c80 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
16c90 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
16ca0 7b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57  {.        SWAP(W
16cb0 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e  hereTerm *, pRan
16cc0 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61  geEnd, pRangeSta
16cd0 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rt);.      }..  
16ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
16cf0 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
16d00 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
16d10 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
16d20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16d30 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52  RangeStart && pR
16d40 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
16d50 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
16d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16d70 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
16d80 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
16d90 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
16da0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
16db0 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
16dc0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
16dd0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
16de0 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
16df0 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
16e00 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
16e10 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
16e20 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20  ;.      endEq = 
16e30 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
16e40 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
16e50 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
16e60 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 74 61 72  _GE);.      star
16e70 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
16e80 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
16e90 45 71 3e 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Eq>0;..      /* 
16ea0 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
16eb0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
16ec0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
16ed0 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74   */.      nConst
16ee0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
16ef0 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
16f00 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rt ){.        in
16f10 74 20 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e  t dcc = pParse->
16f20 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b  disableColCache;
16f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 61  .        if( pRa
16f40 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
16f50 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
16f60 62 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 31 3b  bleColCache = 1;
16f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16f80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16f90 64 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67  de(pParse, pRang
16fa0 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
16fb0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
16fc0 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  Eq);.        pPa
16fd0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
16fe0 61 63 68 65 20 3d 20 64 63 63 3b 0a 20 20 20 20  ache = dcc;.    
16ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17000 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
17010 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
17020 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 6e   nxt);.        n
17030 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
17040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
17050 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
17060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17070 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
17080 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
17090 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  );.        nCons
170a0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
170b0 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
170c0 20 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e         start_con
170d0 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
170e0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64 65      }.      code
170f0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
17100 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
17110 43 6f 6e 73 74 72 61 69 6e 74 2c 20 70 49 64 78  Constraint, pIdx
17120 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 53  );.      op = aS
17130 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
17140 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
17150 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
17160 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Rev];.      asse
17170 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
17180 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17190 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
171a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
171b0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
171c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
171d0 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20  =OP_MoveGt );.  
171e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
171f0 3d 3d 4f 50 5f 4d 6f 76 65 47 65 20 29 3b 0a 20  ==OP_MoveGe );. 
17200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17210 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 65 20 29 3b 0a  p==OP_MoveLe );.
17220 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17230 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 74 20 29 3b  op==OP_MoveLt );
17240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17250 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
17260 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 72 65  iIdxCur, nxt, re
17270 67 42 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20  gBase, .        
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 28 63 68 61 72 2a 29 6e 43 6f 6e 73 74 72 61 69  (char*)nConstrai
172a0 6e 74 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a  nt, P4_INT32);..
172b0 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68        /* Load th
172c0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
172d0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
172e0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
172f0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
17300 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
17310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17320 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
17330 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  q;.      if( pRa
17340 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
17350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17360 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65  e(pParse, pRange
17370 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
17380 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
17390 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
173a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
173b0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
173c0 65 2b 6e 45 71 2c 20 6e 78 74 29 3b 0a 20 20 20  e+nEq, nxt);.   
173d0 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
173e0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
173f0 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70  egBase, nEq+1, p
17400 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  Idx);.        nC
17410 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
17420 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
17430 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
17440 6f 64 79 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65  ody */.      pLe
17450 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
17460 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17470 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  (v);..      /* C
17480 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
17490 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
174a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
174b0 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  range. */.      
174c0 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
174d0 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
174e0 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
174f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17500 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
17510 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17520 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
17530 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17540 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
17550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17560 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
17570 43 75 72 2c 20 6e 78 74 2c 20 72 65 67 42 61 73  Cur, nxt, regBas
17580 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17590 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
175a0 2a 29 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 50  *)nConstraint, P
175b0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
175c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
175d0 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
175e0 65 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ev);..      /* I
175f0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
17600 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17610 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
17620 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
17630 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
17640 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69  olumn that the i
17650 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61  nequality contra
17660 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ins is not NULL.
17670 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20  .      ** If it 
17680 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
17690 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
176a0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
176b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20    */.      r1 = 
176c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
176d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
176e0 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
176f0 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
17700 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
17710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
17720 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
17730 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
17740 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
17750 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
17760 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
17770 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
17780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17790 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
177a0 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
177b0 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
177c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
177d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
177e0 6c 2c 20 72 31 2c 20 63 6f 6e 74 29 3b 0a 20 20  l, r1, cont);.  
177f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17800 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
17810 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
17820 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
17830 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
17840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
17860 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
17870 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
17880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17890 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
178a0 75 72 2c 20 30 2c 20 72 31 29 3b 20 20 2f 2a 20  ur, 0, r1);  /* 
178b0 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
178c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
178d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
178e0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
178f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  ;..      /* Reco
17900 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
17910 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
17920 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
17930 69 73 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a  isable .      **
17940 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
17950 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
17960 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
17970 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
17980 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65    */.      pLeve
17990 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
179a0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
179b0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
179c0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
179d0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
179e0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
179f0 61 72 74 29 3b 0a 20 20 20 20 20 20 64 69 73 61  art);.      disa
17a00 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
17a10 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
17a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17a30 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20 69  Case 4:  There i
17a40 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
17a50 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
17a60 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20   complete.      
17a70 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
17a80 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
17a90 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
17aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
17ab0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
17ac0 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
17ad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  =0 );.      pLev
17ae0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
17af0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
17b00 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
17b10 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
17b20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
17b30 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
17b40 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
17b50 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
17b60 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
17b70 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
17b80 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
17b90 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
17ba0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
17bb0 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
17bc0 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
17bd0 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
17be0 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
17bf0 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
17c00 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
17c10 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
17c20 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
17c30 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
17c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17c50 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
17c60 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
17c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17c80 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
17c90 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
17ca0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
17cb0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
17cc0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
17cd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17ce0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
17cf0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
17d00 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
17d10 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
17d20 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
17d30 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
17d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
17d50 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
17d60 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
17d70 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
17d80 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
17d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
17da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17db0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17dc0 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 53 51 4c 49  , pE, cont, SQLI
17dd0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17de0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
17df0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
17e00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17e10 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
17e20 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
17e30 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
17e40 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
17e50 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
17e60 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
17e70 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
17e80 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
17e90 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
17ea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
17eb0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
17ec0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
17ed0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
17ee0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17f10 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
17f20 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
17f30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17f40 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
17f50 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
17f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17f70 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
17f80 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  pParse, pLevel->
17f90 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
17fa0 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
17fb0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
17fc0 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
17fd0 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Cur);.      for(
17fe0 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b  pTerm=wc.a, j=0;
17ff0 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b   j<wc.nTerm; j++
18000 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
18010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
18020 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
18030 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
18040 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18050 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
18060 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
18070 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
18080 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
18090 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
180a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
180b0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
180c0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
180d0 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
180e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
180f0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
18100 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pr );.        sq
18110 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18120 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
18130 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20 53 51 4c  pExpr, cont, SQL
18140 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
18150 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
18160 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
18170 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  DED;.      }.   
18180 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
18190 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
181a0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
181b0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
181c0 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
181d0 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
181e0 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
181f0 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
18200 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
18210 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
18220 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
18230 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
18240 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
18250 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
18260 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
18270 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
18280 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
18290 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
182a0 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
182b0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
182c0 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
182d0 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
182e0 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
182f0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
18300 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
18310 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
18320 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
18330 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
18340 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
18350 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
18360 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
18370 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
18380 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
18390 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
183a0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
183b0 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29     n = strlen(z)
183c0 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c  ;.    if( n+nQPl
183d0 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
183e0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
183f0 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  10 ){.      if( 
18400 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
18410 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
18420 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
18430 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
18440 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
18450 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
18460 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
18470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18480 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
18490 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
184a0 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
184b0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
184c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
184d0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
184e0 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
184f0 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
18500 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
18510 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
18520 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65  WID_EQ );.    te
18530 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
18540 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
18550 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20  WID_RANGE );.   
18560 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
18570 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
18580 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
18590 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
185a0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
185b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
185c0 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20  an], "* ", 2);. 
185d0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
185e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
185f0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
18600 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18610 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
18620 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
18630 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51   ", 3);.      nQ
18640 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
18650 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
18660 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70  strlen(pLevel->p
18670 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
18680 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
18690 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
186a0 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29  _query_plan)-2 )
186b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
186c0 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
186d0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c  plan[nQPlan], pL
186e0 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
186f0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, n);.        n
18700 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
18710 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
18720 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
18730 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a   = ' ';.      }.
18740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
18750 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
18760 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18770 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
18780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18790 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
187a0 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
187b0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
187c0 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
187d0 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
187e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
187f0 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
18800 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
18810 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
18820 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
18830 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
18840 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
18850 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
18860 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
18870 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
18880 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
18890 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68  nue = cont;.  wh
188a0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
188b0 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  wc);.  return pW
188c0 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
188d0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
188e0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
188f0 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72  ginNoMem:.  wher
18900 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
18910 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  );.  whereInfoFr
18920 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
18930 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18940 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
18950 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
18960 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
18970 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
18980 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
18990 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
189a0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
189b0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
189c0 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
189d0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
189e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
189f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
18a00 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
18a10 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73  pLevel;.  SrcLis
18a20 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
18a30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
18a40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
18a50 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
18a60 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
18a70 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
18a80 75 6d 6e 43 61 63 68 65 28 70 57 49 6e 66 6f 2d  umnCache(pWInfo-
18a90 3e 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20  >pParse, -1);.  
18aa0 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e  for(i=pTabList->
18ab0 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nSrc-1; i>=0; i-
18ac0 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
18ad0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
18ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18af0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
18b00 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20  Level->cont);.  
18b10 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
18b20 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
18b30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18b40 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
18b50 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
18b60 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
18b70 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
18b80 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  l->nIn ){.      
18b90 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
18ba0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
18bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18bc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18bd0 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a  , pLevel->nxt);.
18be0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
18bf0 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  el->nIn, pIn=&pL
18c00 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d  evel->aInLoop[j-
18c10 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
18c20 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
18c30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18c40 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64  e(v, pIn->topAdd
18c50 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r+1);.        sq
18c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18c70 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d  v, OP_Next, pIn-
18c80 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41  >iCur, pIn->topA
18c90 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ddr);.        sq
18ca0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18cb0 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64  e(v, pIn->topAdd
18cc0 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
18cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18ce0 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
18cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18d00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18d10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
18d20 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  brk);.    if( pL
18d30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
18d40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
18d50 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
18d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18d70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
18d80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
18d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18da0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18db0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
18dc0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
18dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
18de0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
18df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18e10 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
18e20 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
18e30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18e50 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
18e60 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20  vel->top);.     
18e70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18e80 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
18e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
18ea0 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
18eb0 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
18ec0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
18ed0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
18ee0 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
18ef0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
18f00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
18f10 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
18f20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
18f30 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
18f40 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
18f50 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
18f60 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  gin..  */.  for(
18f70 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
18f80 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
18f90 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
18fa0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
18fb0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18fc0 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
18fd0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
18fe0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
18ff0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
19000 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
19010 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
19020 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
19030 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62  >isEphem || pTab
19040 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
19050 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 70  inue;.    if( !p
19060 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
19070 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61   && (pLevel->fla
19080 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
19090 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
190a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190b0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
190c0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
190d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
190e0 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d  ( pLevel->pIdx!=
190f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
19100 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19110 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
19120 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
19130 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
19140 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
19150 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
19160 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
19170 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
19180 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
19190 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
191a0 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
191b0 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
191c0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
191d0 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
191e0 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
191f0 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
19200 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
19210 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
19220 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
19230 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
19240 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
19250 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
19260 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
19270 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
19280 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
19290 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
192a0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
192b0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
192c0 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
192d0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
192e0 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
192f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
19300 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
19310 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
19320 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
19330 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
19340 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
19350 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
19360 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
19370 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
19380 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
19390 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
193a0 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
193b0 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
193c0 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
193d0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
193e0 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
193f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19400 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b   pLevel->pIdx ){
19410 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
19420 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
19430 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
19440 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
19450 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
19460 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e    int useIndexOn
19470 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ly = pLevel->fla
19480 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
19490 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  NLY;..      asse
194a0 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
194b0 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
194c0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
194d0 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
194e0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
194f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19500 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
19510 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
19520 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
19530 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19540 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
19550 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
19560 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
19570 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
19580 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
19590 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
195a0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
195b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
195c0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
195d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
195e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
195f0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
19610 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
19620 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
19630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19660 20 61 73 73 65 72 74 28 21 75 73 65 49 6e 64 65   assert(!useInde
19670 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d  xOnly || j<pIdx-
19680 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >nColumn);.     
19690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
196a0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
196b0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
196c0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
196d0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
196e0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
196f0 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
19700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
19710 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
19720 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65  P_NullRow && use
19730 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20  IndexOnly ){.   
19740 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
19750 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
19760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19770 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19780 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
19790 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  */.  whereInfoFr
197a0 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
197b0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.