/ Hex Artifact Content
Login

Artifact 85719d58e0f680b5d8239dc6af82b159775d7376:


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 32   where.c,v 1.302
0340: 20 32 30 30 38 2f 30 34 2f 31 39 20 31 34 3a 34   2008/04/19 14:4
0350: 30 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  0:44 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 20 20 54 68 69 73 20 74 72 69 63 6b 20 6f 66  .  This trick of
77c0: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
77d0: 65 20 6c 61 73 74 0a 20 20 2a 2a 20 69 73 20 6e  e last.  ** is n
77e0: 6f 74 20 32 35 35 20 61 6e 64 20 69 66 20 74 68  ot 255 and if th
77f0: 65 20 63 68 61 72 61 63 74 65 72 20 73 65 74 20  e character set 
7800: 69 73 20 6e 6f 74 20 45 42 43 44 49 43 2e 20 20  is not EBCDIC.  
7810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
7820: 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45 78  keOrGlob(db, pEx
7830: 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26  pr, &nPattern, &
7840: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
7850: 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72  ase) ){.    Expr
7860: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
7870: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  ;.    Expr *pStr
7880: 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45  1, *pStr2;.    E
7890: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20  xpr *pNewExpr1, 
78a0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
78b0: 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78  int idxNew1, idx
78c0: 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74  New2;..    pLeft
78d0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
78e0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
78f0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
7900: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
7910: 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20  pr;.    pStr1 = 
7920: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7930: 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  rse, TK_STRING, 
7940: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
7950: 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20  ( pStr1 ){.     
7960: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
7970: 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f  y(db, &pStr1->to
7980: 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  ken, &pRight->to
7990: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ken);.      pStr
79a0: 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61  1->token.n = nPa
79b0: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70 53 74  ttern;.      pSt
79c0: 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44  r1->flags = EP_D
79d0: 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20  equoted;.    }. 
79e0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
79f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
7a00: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 21 64  tr1);.    if( !d
7a10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a20: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
7a30: 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pC;.      assert
7a40: 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64  ( pStr2->token.d
7a50: 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43 20 3d  yn );.      pC =
7a60: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f   (u8*)&pStr2->to
7a70: 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31  ken.z[nPattern-1
7a80: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
7a90: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
7aa0: 73 65 20 29 20 63 20 3d 20 73 71 6c 69 74 65 33  se ) c = sqlite3
7ab0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
7ac0: 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b  .      *pC = c +
7ad0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   1;.    }.    pN
7ae0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
7af0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7b00: 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70  K_GE, sqlite3Exp
7b10: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20  rDup(db,pLeft), 
7b20: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
7b30: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
7b40: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
7b50: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
7b60: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
7b70: 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41  AMIC);.    exprA
7b80: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
7b90: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
7ba0: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
7bb0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7bc0: 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45   TK_LT, sqlite3E
7bd0: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29  xprDup(db,pLeft)
7be0: 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20  , pStr2, 0);.   
7bf0: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
7c00: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
7c10: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
7c20: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
7c30: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70  YNAMIC);.    exp
7c40: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
7c50: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
7c60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
7c70: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
7c80: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
7c90: 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
7ca0: 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
7cb0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
7cc0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
7cd0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
7ce0: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
7cf0: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
7d00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
7d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
7d20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
7d30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
7d40: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7d50: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
7d60: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
7d70: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
7d80: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
7d90: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
7da0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
7db0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
7dc0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
7dd0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
7de0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
7df0: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
7e00: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
7e10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
7e20: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
7e30: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
7e40: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
7e50: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
7e60: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
7e70: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
7e80: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
7e90: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
7ea0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
7eb0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
7ec0: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
7ed0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
7ee0: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
7ef0: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
7f00: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
7f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
7f20: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
7f30: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
7f40: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
7f50: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
7f60: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
7f70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
7f80: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
7f90: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
7fa0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7fb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
7fc0: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
7fd0: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
7fe0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
7ff0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
8000: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
8010: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41  e3Expr(db, TK_MA
8020: 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  TCH, 0, sqlite3E
8030: 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
8040: 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  t), 0);.      id
8050: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
8060: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
8070: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
8080: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
8090: 43 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  C);.      pNewTe
80a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
80b0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
80c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
80d0: 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a  t = prereqExpr;.
80e0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
80f0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
8100: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
8110: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
8120: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
8130: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
8140: 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
8150: 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
8160: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
8170: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
8180: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
8190: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
81a0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
81b0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
81c0: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
81d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
81e0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
81f0: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
8200: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
8210: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
8220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8230: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f  UALTABLE */..  /
8240: 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61  * Prevent ON cla
8250: 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c  use terms of a L
8260: 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65  EFT JOIN from be
8270: 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76  ing used to driv
8280: 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  e.  ** an index 
8290: 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68  for tables to th
82a0: 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
82b0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  in..  */.  pTerm
82c0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d  ->prereqRight |=
82d0: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a   extraRight;.}..
82e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
82f0: 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  E if any of the 
8300: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
8310: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e  List->a[iFirst..
8320: 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20  .] contain.** a 
8330: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
8340: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
8350: 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c  n the iBase tabl
8360: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8370: 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72   referencesOther
8380: 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69  Tables(.  ExprLi
8390: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
83a0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78      /* Search ex
83b0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73  pressions in ths
83c0: 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d   list */.  ExprM
83d0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
83e0: 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  ,    /* Mapping 
83f0: 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62  from tables to b
8400: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20  itmaps */.  int 
8410: 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
8420: 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72        /* Be sear
8430: 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69  ching with the i
8440: 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73  First-th express
8450: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  ion */.  int iBa
8460: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
8470: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66     /* Ignore ref
8480: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
8490: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69  table */.){.  Bi
84a0: 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20  tmask allowed = 
84b0: 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  ~getMask(pMaskSe
84c0: 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69  t, iBase);.  whi
84d0: 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74  le( iFirst<pList
84e0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
84f0: 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
8500: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
8510: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e  st->a[iFirst++].
8520: 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21  pExpr)&allowed)!
8530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
8540: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
8560: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8570: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
8580: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
8590: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
85a0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
85b0: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
85c0: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
85d0: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
85e0: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
85f0: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
8600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
8610: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
8620: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
8630: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
8640: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8650: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
8660: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
8670: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
8680: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
8690: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
86a0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
86b0: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
86c0: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
86d0: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
86e0: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
86f0: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
8700: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
8710: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
8720: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
8730: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
8740: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
8750: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
8760: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
8770: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
8780: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
8790: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
87a0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
87b0: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
87c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
87d0: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
87e0: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
87f0: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
8800: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
8810: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8820: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
8830: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
8840: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
8850: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
8860: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
8870: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
8880: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
8890: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
88a0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
88b0: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
88c0: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
88d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
88e0: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
88f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
8900: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
8910: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8920: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8930: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8940: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
8950: 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69  skSet,  /* Mappi
8960: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e  ng from table in
8970: 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73  dices to bitmaps
8980: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8990: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
89a0: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
89b0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
89c0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
89d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
89e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
89f0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
8a00: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
8a10: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
8a20: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8a30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
8a40: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
8a50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8a60: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
8a70: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
8a80: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
8a90: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
8aa0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
8ab0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
8ac0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
8ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8af0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8b00: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b20: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
8b30: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
8b40: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
8b50: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
8b80: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
8b90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8ba0: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
8bb0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
8bc0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8bd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8be0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8bf0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
8c00: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
8c10: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
8c20: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
8c30: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
8c40: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
8c50: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8c60: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
8c70: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
8c80: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
8c90: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
8ca0: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
8cb0: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
8cc0: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
8cd0: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
8ce0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
8cf0: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
8d00: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
8d10: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
8d20: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
8d30: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8d40: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
8d50: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
8d60: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
8d70: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
8d80: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
8d90: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
8da0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
8db0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
8dc0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
8dd0: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
8de0: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
8df0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
8e00: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8e10: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
8e20: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
8e30: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
8e40: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
8e50: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
8e60: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
8e70: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
8e80: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
8e90: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
8ea0: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
8eb0: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
8ec0: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
8ed0: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
8ee0: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
8ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
8f00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8f10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8f20: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
8f30: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
8f40: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
8f50: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
8f60: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
8f70: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
8f80: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
8f90: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
8fa0: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
8fb0: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
8fc0: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
8fd0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
8fe0: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8ff0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
9000: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
9010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
9020: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
9030: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9040: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
9050: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
9060: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9070: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
9080: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
9090: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
90a0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
90b0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
90c0: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
90d0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
90e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
90f0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
9100: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
9110: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
9120: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
9130: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
9140: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
9150: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
9160: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
9170: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
9180: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
9190: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
91a0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
91b0: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
91c0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
91d0: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
91e0: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
91f0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
9200: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9210: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
9220: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
9230: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
9240: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
9250: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
9260: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
9270: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
9280: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
9290: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
92a0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
92b0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
92c0: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
92d0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
92e0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
92f0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9300: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
9310: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
9320: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
9330: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
9340: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
9350: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
9360: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
9370: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
9380: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
9390: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
93a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
93b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
93c0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
93d0: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
93e0: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
93f0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
9400: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
9410: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
9420: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9430: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
9440: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
9450: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
9460: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
9470: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
9480: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
9490: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
94a0: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
94b0: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
94c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
94d0: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
94e0: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
94f0: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
9500: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
9510: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9520: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
9530: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
9540: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9550: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
9570: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
9580: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
9590: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
95a0: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
95b0: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
95c0: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
95d0: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
95e0: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
95f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
9600: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
9610: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9620: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
9630: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
9640: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
9650: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
9660: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
9670: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
9680: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
9690: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
96a0: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
96b0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
96c0: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
96d0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
96e0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
96f0: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
9700: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
9710: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
9720: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
9730: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
9740: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
9750: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
9760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
9770: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
9780: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
9790: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
97a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
97b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
97c0: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
97d0: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
97e0: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
97f0: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
9800: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
9810: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9820: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
9830: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
9840: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
9850: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
9860: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
9870: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
9880: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
9890: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
98a0: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
98b0: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
98c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
98d0: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
98e0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
98f0: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
9900: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
9910: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
9920: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
9930: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
9940: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
9950: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
9960: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
9970: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
9980: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
9990: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
99a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
99b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  0;.}../*.** Chec
99c0: 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69  k table to see i
99d0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
99e0: 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42  lause in pOrderB
99f0: 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  y can be satisfi
9a00: 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67  ed.** by sorting
9a10: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57   in order of ROW
9a20: 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ID.  Return true
9a30: 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a   if so and set *
9a40: 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74  pbRev to be.** t
9a50: 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20  rue for reverse 
9a60: 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20  ROWID and false 
9a70: 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49  for forward ROWI
9a80: 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  D order..*/.stat
9a90: 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42  ic int sortableB
9aa0: 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61  yRowid(.  int ba
9ab0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9ac0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9ad0: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20  er for table to 
9ae0: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
9af0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9b00: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
9b10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9b20: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
9b30: 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61  pMaskSet,  /* Ma
9b40: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
9b50: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
9b60: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
9b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9b80: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
9b90: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
9ba0: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
9bb0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
9bc0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9bd0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
9be0: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
9bf0: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
9c00: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
9c10: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
9c20: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
9c30: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
9c40: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
9c50: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
9c60: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
9c70: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
9c80: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
9c90: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
9ca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9cc0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
9cd0: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
9ce0: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
9cf0: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
9d00: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
9d10: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
9d20: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
9d30: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
9d40: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
9d50: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
9d60: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
9d70: 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ings with O(logN
9d80: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
9d90: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
9da0: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
9db0: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
9dc0: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
9dd0: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
9de0: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
9df0: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
9e00: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
9e10: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
9e20: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
9e30: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
9e40: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
9e50: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
9e60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
9e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
9e80: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
9e90: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
9ea0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
9eb0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
9ec0: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
9ed0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
9ee0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
9ef0: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
9f00: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
9f10: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
9f20: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
9f30: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
9f40: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
9f50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9f60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9f70: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9f80: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
9f90: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
9fa0: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
9fb0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
9fc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9fd0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
9fe0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
9ff0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
a000: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
a010: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
a020: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
a030: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
a040: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
a050: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
a060: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
a070: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
a080: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
a090: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
a0a0: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
a0b0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
a0c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
a0d0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
a0e0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
a0f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
a100: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
a110: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a120: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
a130: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
a140: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
a150: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a160: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
a170: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
a180: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
a190: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
a1a0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
a1b0: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
a1c0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
a1d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
a1e0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
a1f0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
a200: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
a210: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
a220: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
a230: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
a240: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
a250: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
a260: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
a270: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
a280: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
a290: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
a2a0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
a2b0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
a2c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
a2d0: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
a2e0: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
a2f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
a300: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
a310: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
a320: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
a330: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
a340: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
a350: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
a360: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a370: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
a380: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
a390: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
a3a0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
a3b0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
a3c0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
a3d0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
a3e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
a3f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a400: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
a410: 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
a420: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
a430: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
a440: 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
a450: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
a460: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
a470: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
a480: 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
a490: 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
a4a0: 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
a4b0: 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
a4c0: 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
a4d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
a4e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
a4f0: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
a500: 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
a510: 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
a520: 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
a530: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
a540: 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
a550: 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
a560: 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
a570: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
a580: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
a590: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
a5a0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
a5b0: 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
a5c0: 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
a5d0: 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
a5e0: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
a5f0: 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
a600: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
a610: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
a620: 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
a630: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
a640: 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
a650: 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
a660: 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
a670: 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
a680: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
a690: 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
a6a0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
a6b0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
a6c0: 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
a6d0: 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
a6e0: 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
a6f0: 63 20 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72  c double bestVir
a700: 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72  tualIndex(.  Par
a710: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a730: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
a740: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
a750: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
a760: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
a770: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
a780: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a790: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
a7a0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
a7b0: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
a7c0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
a7d0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
a7e0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
a7f0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
a800: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
a810: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
a820: 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
a830: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
a840: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  by clause */.  i
a850: 6e 74 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65  nt orderByUsable
a860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a870: 20 54 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   True if we can 
a880: 70 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a  potential sort *
a890: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
a8a0: 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
a8b0: 66 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  fo /* Index info
a8c0: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
a8d0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
a8e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
a8f0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
a900: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
a910: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
a920: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
a930: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
a940: 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
a950: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
a960: 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78  ex_orderby *pIdx
a970: 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63  OrderBy;.  struc
a980: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
a990: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
a9a0: 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
a9b0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
a9c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
a9d0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  nOrderBy;.  int 
a9e0: 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
a9f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
aa00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61  nfo structure ha
aa10: 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
aa20: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ously.  ** alloc
aa30: 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
aa40: 69 7a 65 64 20 66 6f 72 20 74 68 69 73 20 76 69  ized for this vi
aa50: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65  rtual table, the
aa60: 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  n allocate.  ** 
aa70: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
aa80: 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64  t now.  */.  pId
aa90: 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e  xInfo = *ppIdxIn
aaa0: 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
aab0: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 57 68 65  fo==0 ){.    Whe
aac0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
aad0: 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
aae0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 52    WHERETRACE(("R
aaf0: 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78  ecomputing index
ab00: 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c   info for %s...\
ab10: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
ab20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74  );..    /* Count
ab30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ab40: 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
ab50: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
ab60: 20 72 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a   referring.    *
ab70: 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
ab80: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  l table */.    f
ab90: 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
aba0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
abb0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
abc0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
abd0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
abe0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
abf0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
ac00: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
ac10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
ac20: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
ac30: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1))==0 );.      
ac40: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
ac50: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
ac60: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
ac70: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
ac80: 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
ac90: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
aca0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
acb0: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
acc0: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
acd0: 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20       nTerm++;.  
ace0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
acf0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ad00: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
ad10: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
ad20: 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
ad30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
ad40: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
ad50: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
ad60: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a  By part of.    *
ad70: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
ad80: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
ad90: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  re..    */.    n
ada0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
adb0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
adc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
add0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
ade0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
adf0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
ae00: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
ae10: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
ae20: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
ae30: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
ae40: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
ae50: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
ae60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ae70: 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45   i==pOrderBy->nE
ae80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  xpr ){.        n
ae90: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
aea0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
aeb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
aec0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
aed0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
aee0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
aef0: 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d  /.    pIdxInfo =
af00: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
af10: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
af20: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
af30: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
af60: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
af70: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
afa0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
afb0: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
afc0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
afd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
afe0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aff0: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
b000: 79 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  y");.      retur
b010: 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n 0.0;.    }.   
b020: 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49   *ppIdxInfo = pI
b030: 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20  dxInfo;..    /* 
b040: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
b050: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
b060: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
b070: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
b080: 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79  ains.    ** many
b090: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
b0a0: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
b0b0: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
b0c0: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20  stIndex from.   
b0d0: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
b0e0: 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
b0f0: 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
b100: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
b110: 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  .    ** initiali
b120: 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
b130: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
b140: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
b150: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
b160: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
b170: 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f  fo[1];.    pIdxO
b180: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
b190: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
b1a0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
b1b0: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55  s[nTerm];.    pU
b1c0: 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
b1d0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
b1e0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
b1f0: 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
b200: 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74  erBy];.    *(int
b210: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
b220: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
b230: 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49  ;.    *(int*)&pI
b240: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
b250: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
b260: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
b270: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
b280: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
b290: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
b2a0: 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74  dxCons;.    *(st
b2b0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
b2c0: 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
b2d0: 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
b2e0: 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
b2f0: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
b300: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
b310: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
b320: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
b330: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
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 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 70 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f   pUsage;..    fo
b390: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
b3a0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
b3b0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
b3c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
b3d0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
b3e0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
b3f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b400: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
b410: 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d  Operator&(pTerm-
b420: 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d  >eOperator-1))==
b430: 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
b440: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
b450: 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
b460: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b470: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b480: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
b490: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
b4a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
b4b0: 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
b4c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b4d0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
b4e0: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 6c 65 66  umn = pTerm->lef
b4f0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  tColumn;.      p
b500: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
b510: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
b520: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
b530: 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
b540: 74 6f 72 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  tor;.      /* Th
b550: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
b560: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
b570: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
b580: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
b590: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57  e.      ** the W
b5a0: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
b5b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
b5c0: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
b5d0: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20  cal.  The.      
b5e0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
b5f0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
b600: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20   fact. */.      
b610: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
b620: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b630: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
b640: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
b650: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
b660: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
b670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b680: 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
b690: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
b6a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b6b0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
b6c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b6d0: 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GT );.      asse
b6e0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
b6f0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b700: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_GE );.      a
b710: 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
b720: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
b730: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
b740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b750: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b760: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c   & (WO_EQ|WO_LT|
b770: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
b780: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
b790: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
b7a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b7b0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
b7c0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
b7d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
b7e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
b7f0: 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
b800: 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
b810: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49  Column;.      pI
b820: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
b830: 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
b840: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
b850: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
b860: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
b870: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
b880: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
b890: 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e  at pIdxInfo poin
b8a0: 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20  ts.  ** to will 
b8b0: 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61  have been initia
b8c0: 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75  lized, either du
b8d0: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
b8e0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20   invocation or. 
b8f0: 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20   ** during some 
b900: 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e  prior invocation
b910: 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68  .  Now we just h
b920: 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65  ave to customize
b930: 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c   the.  ** detail
b940: 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f  s of pIdxInfo fo
b950: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  r the current in
b960: 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73  vocation and pas
b970: 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65  s it to.  ** xBe
b980: 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20  stIndex..  */.. 
b990: 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e   /* The module n
b9a0: 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  ame must be defi
b9b0: 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68  ned. Also, by th
b9c0: 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
b9d0: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f  ust.  ** be a po
b9e0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
b9f0: 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
ba00: 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  re. Otherwise.  
ba10: 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  ** sqlite3ViewGe
ba20: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77  tColumnNames() w
ba30: 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64  ould have picked
ba40: 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a   up the error. .
ba50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ba60: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
ba70: 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75   && pTab->azModu
ba80: 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73  leArg[0] );.  as
ba90: 73 65 72 74 28 20 70 54 61 62 2d 3e 70 56 74 61  sert( pTab->pVta
baa0: 62 20 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28  b );.#if 0.  if(
bab0: 20 70 54 61 62 2d 3e 70 56 74 61 62 3d 3d 30 20   pTab->pVtab==0 
bac0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bad0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bae0: 75 6e 64 65 66 69 6e 65 64 20 6d 6f 64 75 6c 65  undefined module
baf0: 20 25 73 20 66 6f 72 20 74 61 62 6c 65 20 25 73   %s for table %s
bb00: 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
bb10: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c  >azModuleArg[0],
bb20: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
bb30: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
bb40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
bb50: 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61  Set the aConstra
bb60: 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65  int[].usable fie
bb70: 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  lds and initiali
bb80: 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74  ze all .  ** out
bb90: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
bba0: 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
bbb0: 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
bbc0: 73 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f  sable is true fo
bbd0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68  r constraints wh
bbe0: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
bbf0: 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e  nd.  ** side con
bc00: 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72  tains only refer
bc10: 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20  ences to tables 
bc20: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
bc30: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
bc40: 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
bc50: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63   words, if the c
bc60: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20  onstraint is of 
bc70: 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
bc80: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f   **           co
bc90: 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a  lumn = expr.  **
bca0: 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
bcb0: 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f   evaluating a jo
bcc0: 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  in, then the con
bcd0: 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d  straint on colum
bce0: 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20  n is .  ** only 
bcf0: 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
bd00: 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
bd10: 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
bd20: 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
bd30: 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   the table conta
bd40: 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20  ining column..  
bd50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e  **.  ** The aCon
bd60: 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79  straints[] array
bd70: 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
bd80: 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
bd90: 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  aints.  ** on th
bda0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e  e current table.
bdb0: 20 20 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e    That way we on
bdc0: 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75  ly have to compu
bdd0: 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20  te it once.  ** 
bde0: 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d  even though we m
bdf0: 69 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b  ight try to pick
be00: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
be10: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a  multiple times..
be20: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74    ** For each at
be30: 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67  tempt at picking
be40: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
be50: 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  rder of tables i
be60: 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20  n the.  ** join 
be70: 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65  might be differe
be80: 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  nt so we have to
be90: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75   recompute the u
bea0: 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20  sable flag.  ** 
beb0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  each time..  */.
bec0: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
bed0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
bee0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
bef0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
bf00: 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67  straint;.  pUsag
bf10: 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
bf20: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
bf30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
bf40: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
bf50: 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
bf60: 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49  s++){.    j = pI
bf70: 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
bf80: 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  set;.    pTerm =
bf90: 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
bfa0: 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
bfb0: 65 20 3d 20 20 28 70 54 65 72 6d 2d 3e 70 72 65  e =  (pTerm->pre
bfc0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
bfd0: 61 64 79 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 6d  ady)==0;.  }.  m
bfe0: 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
bff0: 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
c000: 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
c010: 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28  nstraint);.  if(
c020: 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
c030: 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
c040: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c050: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
c060: 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  );.  }.  pIdxInf
c070: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
c080: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
c090: 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
c0a0: 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
c0b0: 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
c0c0: 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
c0d0: 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78  umed = 0;.  pIdx
c0e0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
c0f0: 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
c100: 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a 20 20 6e 4f  _DBL / 2.0;.  nO
c110: 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66  rderBy = pIdxInf
c120: 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  o->nOrderBy;.  i
c130: 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  f( pIdxInfo->nOr
c140: 64 65 72 42 79 20 26 26 20 21 6f 72 64 65 72 42  derBy && !orderB
c150: 79 55 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a  yUsable ){.    *
c160: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
c170: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >nOrderBy = 0;. 
c180: 20 7d 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   }..  (void)sqli
c190: 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61  te3SafetyOff(pPa
c1a0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52  rse->db);.  WHER
c1b0: 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
c1c0: 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
c1d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
c1e0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
c1f0: 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63  (pIdxInfo);.  rc
c200: 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e   = pTab->pVtab->
c210: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
c220: 64 65 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c  dex(pTab->pVtab,
c230: 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52   pIdxInfo);.  TR
c240: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
c250: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 28 76 6f  pIdxInfo);.  (vo
c260: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
c270: 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  On(pParse->db);.
c280: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
c290: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
c2a0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
c2b0: 66 28 20 21 70 49 64 78 49 6e 66 6f 2d 3e 61 43  f( !pIdxInfo->aC
c2c0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
c2d0: 62 6c 65 20 26 26 20 70 55 73 61 67 65 5b 69 5d  ble && pUsage[i]
c2e0: 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
c2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c300: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
c310: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
c320: 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
c330: 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
c340: 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
c350: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
c360: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a  turn 0.0;.    }.
c370: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
c380: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c390: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
c3a0: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
c3b0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
c3c0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c3d0: 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 71  }else {.      sq
c3e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c3f0: 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
c400: 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
c410: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 28 69 6e      }.  }.  *(in
c420: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
c430: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
c440: 79 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64  y;..  return pId
c450: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
c460: 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Cost;.}.#endif /
c470: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c480: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
c490: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65  *.** Find the be
c4a0: 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63  st index for acc
c4b0: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
c4c0: 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75  lar table.  Retu
c4d0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
c4e0: 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c  to the index, fl
c4f0: 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
c500: 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20  e how the index 
c510: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20  should be used, 
c520: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
c530: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
c540: 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22  aints, and the "
c550: 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69  cost" for this i
c560: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
c570: 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65  lowest cost inde
c580: 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73  x wins.  The cos
c590: 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  t is an estimate
c5a0: 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   of the amount o
c5b0: 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73  f.** CPU and dis
c5c0: 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72  k I/O need to pr
c5d0: 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
c5e0: 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65  t using the sele
c5f0: 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46  cted index..** F
c600: 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
c610: 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
c620: 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
c630: 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
c640: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
c650: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
c660: 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
c670: 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
c680: 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
c690: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
c6a0: 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
c6b0: 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
c6c0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
c6d0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
c6e0: 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
c6f0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
c700: 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
c710: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
c720: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
c730: 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61   bestIndex(.  Pa
c740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c760: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c770: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c780: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
c790: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
c7a0: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
c7b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
c7c0: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
c7d0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
c7e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
c7f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
c800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
c810: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
c820: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
c830: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
c840: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
c850: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
c860: 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
c870: 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78   Index **ppIndex
c880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c890: 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f  Make *ppIndex po
c8a0: 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74 20  int to the best 
c8b0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  index */.  int *
c8c0: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
c8d0: 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c         /* Put fl
c8e0: 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74  ags describing t
c8f0: 68 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70  his choice in *p
c900: 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  Flags */.  int *
c910: 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20  pnEq            
c920: 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68         /* Put th
c930: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
c940: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
c950: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68   here */.){.  Wh
c960: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
c970: 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78    Index *bestIdx
c980: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
c990: 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65   Index that give
c9a0: 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  s the lowest cos
c9b0: 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f  t */.  double lo
c9c0: 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
c9d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
c9e0: 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20  f using bestIdx 
c9f0: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61  */.  int bestFla
ca00: 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
ca10: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
ca20: 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64  ated with bestId
ca30: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e  x */.  int bestN
ca40: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
ca50: 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65     /* Best value
ca60: 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e   for nEq */.  in
ca70: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
ca80: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
ca90: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
caa0: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
cab0: 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
cac0: 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
cad0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
cae0: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
caf0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b  ng */.  int rev;
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
cb20: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
cb30: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  rder */.  int fl
cb40: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
cb50: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
cb60: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
cb70: 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Probe */.  int n
cb80: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
cb90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cba0: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
cbb0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
cbc0: 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20  t eqTermMask;   
cbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
cbe0: 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
cbf0: 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
cc00: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc20: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
cc30: 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 57 48 45  pProbe */..  WHE
cc40: 52 45 54 52 41 43 45 28 28 22 62 65 73 74 49 6e  RETRACE(("bestIn
cc50: 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52  dex: tbl=%s notR
cc60: 65 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63  eady=%x\n", pSrc
cc70: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  ->pTab->zName, n
cc80: 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77  otReady));.  low
cc90: 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  estCost = SQLITE
cca0: 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f  _BIG_DBL;.  pPro
ccb0: 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  be = pSrc->pTab-
ccc0: 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49  >pIndex;..  /* I
ccd0: 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
cce0: 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  no indices and t
ccf0: 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d  here are no term
cd00: 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20  s in the where. 
cd10: 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20   ** clause that 
cd20: 72 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57  refer to the ROW
cd30: 49 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ID, then we will
cd40: 20 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74   never be able t
cd50: 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69  o do.  ** anythi
cd60: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
cd70: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
cd80: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  on this table.  
cd90: 57 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a  We might as.  **
cda0: 20 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72   well put it fir
cdb0: 73 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f  st in the join o
cdc0: 72 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c  rder.  That way,
cdd0: 20 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20   perhaps it can 
cde0: 62 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  be.  ** referenc
cdf0: 65 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c  ed by other tabl
ce00: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a  es in the join..
ce10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 6f 62    */.  if( pProb
ce20: 65 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e  e==0 &&.     fin
ce30: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
ce40: 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f   -1, 0, WO_EQ|WO
ce50: 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _IN|WO_LT|WO_LE|
ce60: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d  WO_GT|WO_GE,0)==
ce70: 30 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65  0 &&.     (pOrde
ce80: 72 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61  rBy==0 || !sorta
ce90: 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
cea0: 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e   pOrderBy, pWC->
ceb0: 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29  pMaskSet, &rev))
cec0: 20 29 7b 0a 20 20 20 20 2a 70 46 6c 61 67 73 20   ){.    *pFlags 
ced0: 3d 20 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65  = 0;.    *ppInde
cee0: 78 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71  x = 0;.    *pnEq
cef0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
cf00: 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   0.0;.  }..  /* 
cf10: 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69  Check for a rowi
cf20: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
cf30: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
cf40: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72  ints.  */.  pTer
cf50: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
cf60: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
cf70: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
cf80: 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  N, 0);.  if( pTe
cf90: 72 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  rm ){.    Expr *
cfa0: 70 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e  pExpr;.    *ppIn
cfb0: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73  dex = 0;.    bes
cfc0: 74 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  tFlags = WHERE_R
cfd0: 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28  OWID_EQ;.    if(
cfe0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
cff0: 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20  r & WO_EQ ){.   
d000: 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73     /* Rowid== is
d010: 20 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74   always the best
d020: 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20   pick.  Look no 
d030: 66 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73  further.  Becaus
d040: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
d050: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20  a single row is 
d060: 67 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75  generated, outpu
d070: 74 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73  t is always in s
d080: 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
d090: 20 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57       *pFlags = W
d0a0: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20  HERE_ROWID_EQ | 
d0b0: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
d0c0: 20 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20      *pnEq = 1;. 
d0d0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
d0e0: 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f  ("... best is ro
d0f0: 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wid\n"));.      
d100: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
d110: 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72  }else if( (pExpr
d120: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29   = pTerm->pExpr)
d130: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
d140: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
d150: 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20  (LIST): cost is 
d160: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
d170: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
d180: 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ist.      ** ele
d190: 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
d1a0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45   lowestCost = pE
d1b0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d1c0: 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  r;.      lowestC
d1d0: 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f  ost *= estLog(lo
d1e0: 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d  westCost);.    }
d1f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
d200: 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29  owid IN (SELECT)
d210: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
d220: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
d230: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
d240: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
d250: 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65  sult of the inne
d260: 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61  r select.  We ha
d270: 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74  ve no way to est
d280: 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  imate.      ** t
d290: 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b  hat value so mak
d2a0: 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20  e a wild guess. 
d2b0: 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  */.      lowestC
d2c0: 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d  ost = 200;.    }
d2d0: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d2e0: 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63  ("... rowid IN c
d2f0: 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f  ost: %.9g\n", lo
d300: 77 65 73 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a  westCost));.  }.
d310: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
d320: 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61 62  he cost of a tab
d330: 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65 20  le scan.  If we 
d340: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
d350: 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65  many.  ** entrie
d360: 73 20 61 72 65 20 69 6e 20 74 68 65 20 74 61 62  s are in the tab
d370: 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f  le, use 1 millio
d380: 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20  n as a guess..  
d390: 2a 2f 0a 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  */.  cost = pPro
d3a0: 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52  be ? pProbe->aiR
d3b0: 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30  owEst[0] : 10000
d3c0: 30 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  00;.  WHERETRACE
d3d0: 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61  (("... table sca
d3e0: 6e 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39  n base cost: %.9
d3f0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
d400: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  flags = WHERE_RO
d410: 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a  WID_RANGE;..  /*
d420: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74   Check for const
d430: 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67  raints on a rang
d440: 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61  e of rowids in a
d450: 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a   table scan..  *
d460: 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  /.  pTerm = find
d470: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
d480: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
d490: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
d4a0: 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28  WO_GE, 0);.  if(
d4b0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
d4c0: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
d4d0: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
d4e0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
d4f0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61   0) ){.      fla
d500: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
d510: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73  LIMIT;.      cos
d520: 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73  t /= 3;  /* Gues
d530: 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50  s that rowid<EXP
d540: 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
d550: 2d 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20  -thirds or rows 
d560: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
d570: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d580: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
d590: 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
d5a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
d5b0: 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
d5c0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
d5d0: 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
d5e0: 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52   that rowid>EXPR
d5f0: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
d600: 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
d610: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  /.    }.    WHER
d620: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
d630: 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  id range reduces
d640: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
d650: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73  , cost));.  }els
d660: 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  e{.    flags = 0
d670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d680: 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f  he table scan do
d690: 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74  es not satisfy t
d6a0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d6b0: 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a  se, increase.  *
d6c0: 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c  * the cost by Nl
d6d0: 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ogN to cover the
d6e0: 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74   expense of sort
d6f0: 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ing. */.  if( pO
d700: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66  rderBy ){.    if
d710: 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  ( sortableByRowi
d720: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
d730: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
d740: 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
d750: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
d760: 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57  RDERBY|WHERE_ROW
d770: 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  ID_RANGE;.      
d780: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
d790: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d7a0: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
d7b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d7c0: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
d7d0: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
d7e0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
d7f0: 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
d800: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
d810: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
d820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d830: 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74   cost<lowestCost
d840: 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f   ){.    lowestCo
d850: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62  st = cost;.    b
d860: 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  estFlags = flags
d870: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d880: 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73  he pSrc table is
d890: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
d8a0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
d8b0: 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a  then we may not.
d8c0: 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65    ** use an inde
d8d0: 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20  x to satisfy IS 
d8e0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
d8f0: 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   on that table. 
d900: 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65   This is.  ** be
d910: 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69  cause columns mi
d920: 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
d930: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62   NULL if the tab
d940: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  le does not matc
d950: 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75  h -.  ** a circu
d960: 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68  mstance which th
d970: 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  e index cannot h
d980: 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e  elp us discover.
d990: 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a    Ticket #2177..
d9a0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 72 63    */.  if( (pSrc
d9b0: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
d9c0: 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
d9d0: 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
d9e0: 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73  EQ|WO_IN;.  }els
d9f0: 65 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  e{.    eqTermMas
da00: 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
da10: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  WO_ISNULL;.  }..
da20: 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63    /* Look at eac
da30: 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  h index..  */.  
da40: 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50  for(; pProbe; pP
da50: 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
da60: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  xt){.    int i; 
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
da90: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75  unter */.    dou
daa0: 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ble inMultiplier
dab0: 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45   = 1;..    WHERE
dac0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65  TRACE(("... inde
dad0: 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65  x %s:\n", pProbe
dae0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
daf0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
db00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
db10: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
db20: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20   are satisfied. 
db30: 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20     ** by x=EXPR 
db40: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78  constraints or x
db50: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
db60: 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
db70: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20    flags = 0;.   
db80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f   for(i=0; i<pPro
db90: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  be->nColumn; i++
dba0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
dbb0: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
dbc0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  n[i];.      pTer
dbd0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
dbe0: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
dbf0: 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c  ady, eqTermMask,
dc00: 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20   pProbe);.      
dc10: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
dc20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67  reak;.      flag
dc30: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
dc40: 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
dc50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
dc60: 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
dc70: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
dc80: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
dc90: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
dca0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
dcb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
dcc0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  xpr->pSelect!=0 
dcd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
dce0: 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b  ultiplier *= 25;
dcf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dd00: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21  f( pExpr->pList!
dd10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
dd20: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20  inMultiplier *= 
dd30: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
dd40: 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  xpr + 1;.       
dd50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
dd60: 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  .    cost = pPro
dd70: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20  be->aiRowEst[i] 
dd80: 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a  * inMultiplier *
dd90: 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70   estLog(inMultip
dda0: 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d  lier);.    nEq =
ddb0: 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   i;.    if( pPro
ddc0: 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
ddd0: 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26  None && (flags &
dde0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
ddf0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
de00: 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43   nEq==pProbe->nC
de10: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66  olumn ){.      f
de20: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
de30: 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
de40: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
de50: 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c  ... nEq=%d inMul
de60: 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67  t=%.9g cost=%.9g
de70: 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70  \n",nEq,inMultip
de80: 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20  lier,cost));..  
de90: 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
dea0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
deb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
dec0: 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
ded0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
dee0: 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
def0: 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
df00: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
df10: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
df20: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
df30: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
df40: 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
df50: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
df60: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
df70: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
df80: 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
df90: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
dfa0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
dfb0: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50   WO_LT|WO_LE, pP
dfc0: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
dfd0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
dfe0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
dff0: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
e000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e010: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
e020: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
e030: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
e040: 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
e050: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
e060: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
e070: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
e080: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
e090: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
e0a0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
e0b0: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
e0c0: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
e0d0: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
e0e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
e0f0: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
e100: 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
e110: 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
e120: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
e130: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
e140: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
e150: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
e160: 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  IN)==0 &&.      
e170: 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e       isSortingIn
e180: 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e  dex(pParse,pWC->
e190: 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c  pMaskSet,pProbe,
e1a0: 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45  iCur,pOrderBy,nE
e1b0: 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20  q,&rev) ){.     
e1c0: 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20     if( flags==0 
e1d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
e1e0: 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
e1f0: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
e200: 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73   }.        flags
e210: 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
e220: 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  Y;.        if( r
e230: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
e240: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
e250: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
e260: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e270: 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63         cost += c
e280: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
e290: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
e2a0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72  RACE(("...... or
e2b0: 64 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20  derby increases 
e2c0: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
e2d0: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
e2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
e2f0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
e300: 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77  e can get away w
e310: 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ith using just t
e320: 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74  he index without
e330: 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61  .    ** ever rea
e340: 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ding the table. 
e350: 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
e360: 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65  case, then halve
e370: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
e380: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
e390: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
e3a0: 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f  lags && pSrc->co
e3b0: 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
e3c0: 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
e3d0: 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
e3e0: 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
e3f0: 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
e400: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e410: 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j<pProbe->nColum
e420: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
e430: 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d   int x = pProbe-
e440: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
e450: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
e460: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
e470: 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
e480: 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
e490: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e4a0: 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
e4b0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
e4c0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
e4d0: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a       cost /= 2;.
e4e0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e4f0: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
e500: 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
e510: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
e520: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
e530: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
e540: 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
e550: 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
e560: 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
e570: 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
e580: 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
e590: 20 26 26 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73   && cost < lowes
e5a0: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62  tCost ){.      b
e5b0: 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  estIdx = pProbe;
e5c0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
e5d0: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
e5e0: 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
e5f0: 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45 71  s;.      bestNEq
e600: 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20 20   = nEq;.    }.  
e610: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  }..  /* Report t
e620: 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a 20  he best result. 
e630: 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20 3d   */.  *ppIndex =
e640: 20 62 65 73 74 49 64 78 3b 0a 20 20 57 48 45 52   bestIdx;.  WHER
e650: 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e  ETRACE(("best in
e660: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
e670: 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20  %.9g, flags=%x, 
e680: 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
e690: 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73     bestIdx ? bes
e6a0: 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28  tIdx->zName : "(
e6b0: 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f  none)", lowestCo
e6c0: 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62  st, bestFlags, b
e6d0: 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c  estNEq));.  *pFl
e6e0: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 20  ags = bestFlags 
e6f0: 7c 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  | eqTermMask;.  
e700: 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b  *pnEq = bestNEq;
e710: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74  .  return lowest
e720: 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cost;.}.../*.** 
e730: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
e740: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
e750: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
e760: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
e770: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
e780: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
e790: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
e7a0: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
e7b0: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
e7c0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
e7d0: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
e7e0: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
e7f0: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
e800: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
e810: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
e820: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
e830: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
e840: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
e850: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
e860: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
e870: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
e880: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
e890: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
e8a0: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
e8b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
e8c0: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
e8d0: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
e8e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
e8f0: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
e900: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
e910: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
e920: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
e930: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
e940: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
e950: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
e960: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
e970: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
e980: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
e990: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
e9a0: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
e9b0: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
e9c0: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
e9d0: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
e9e0: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
e9f0: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
ea00: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
ea10: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
ea20: 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
ea30: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
ea40: 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
ea50: 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
ea60: 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
ea70: 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
ea80: 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
ea90: 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
eaa0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
eab0: 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
eac0: 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
ead0: 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
eae0: 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
eaf0: 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
eb00: 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
eb10: 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
eb20: 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
eb30: 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
eb40: 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
eb50: 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
eb60: 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
eb70: 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
eb80: 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
eb90: 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
eba0: 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
ebb0: 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
ebc0: 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
ebd0: 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
ebe0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
ebf0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
ec00: 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
ec10: 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
ec20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ec30: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
ec40: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
ec50: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61  {.    pTerm->fla
ec60: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
ec70: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ec80: 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
ec90: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
eca0: 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
ecb0: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
ecc0: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
ecd0: 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
ece0: 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
ecf0: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
ed00: 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
ed10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ed20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c   }.}../*.** Appl
ed30: 79 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  y the affinities
ed40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ed50: 20 74 68 65 20 66 69 72 73 74 20 6e 20 63 6f 6c   the first n col
ed60: 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 0a 2a 2a  umns of index.**
ed70: 20 70 49 64 78 20 74 6f 20 74 68 65 20 76 61 6c   pIdx to the val
ed80: 75 65 73 20 69 6e 20 74 68 65 20 6e 20 72 65 67  ues in the n reg
ed90: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
eda0: 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  at base..*/.stat
edb0: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
edc0: 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
edd0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
ede0: 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64 65 78 20  e, int n, Index 
edf0: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 6e 3e  *pIdx){.  if( n>
ee00: 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
ee10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ee20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
ee30: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
ee40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee50: 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
ee60: 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
ee70: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
ee80: 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  r(v, pIdx);.    
ee90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
eea0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
eeb0: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
eec0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
eed0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
eee0: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
eef0: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
ef00: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
ef10: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
ef20: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
ef30: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
ef40: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
ef50: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
ef60: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
ef70: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
ef80: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
ef90: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
efa0: 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
efb0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
efc0: 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
efd0: 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
efe0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
eff0: 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
f000: 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
f010: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
f020: 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
f030: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
f040: 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
f050: 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
f060: 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
f070: 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
f080: 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
f090: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
f0a0: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
f0b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f0c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
f0d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f0e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f0f0: 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
f100: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
f110: 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
f120: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
f130: 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e  *pLevel, /* When
f140: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
f150: 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
f160: 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
f170: 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
f180: 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
f190: 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
f1a0: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
f1b0: 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
f1c0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
f1d0: 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
f1e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f1f0: 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
f200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f210: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
f220: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 69 66 28  esults */..  if(
f230: 20 69 54 61 72 67 65 74 3c 3d 30 20 29 7b 0a 20   iTarget<=0 ){. 
f240: 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
f250: 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
f260: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f270: 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d   }.  if( pX->op=
f280: 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
f290: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
f2a0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
f2b0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
f2c0: 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
f2d0: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
f2e0: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
f2f0: 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
f300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f310: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
f320: 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
f330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f340: 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
f350: 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
f360: 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
f370: 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
f380: 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  pIn;..    assert
f390: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
f3a0: 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
f3b0: 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
f3c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
f3d0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
f3e0: 2c 20 31 29 3b 0a 20 20 20 20 69 54 61 62 20 3d  , 1);.    iTab =
f3f0: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
f400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f410: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f420: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56   iTab, 0);.    V
f430: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f440: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
f450: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
f460: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f470: 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >nIn==0 ){.     
f480: 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20 73   pLevel->nxt = s
f490: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f4a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
f4b0: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b    pLevel->nIn++;
f4c0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  .    pLevel->aIn
f4d0: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Loop = sqlite3Db
f4e0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
f4f0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
f500: 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  ->aInLoop,.     
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f530: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
f540: 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
f550: 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  ->nIn);.    pIn 
f560: 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  = pLevel->aInLoo
f570: 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
f580: 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
f590: 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20 31 3b 0a  Level->nIn - 1;.
f5a0: 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
f5b0: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
f5c0: 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
f5d0: 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
f5e0: 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20     pIn->topAddr 
f5f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f600: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
f610: 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
f620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f630: 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20     pIn->topAddr 
f640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f650: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
f660: 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
f670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f690: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
f6a0: 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
f6b0: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
f6c0: 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
f6d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
f6e0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
f6f0: 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
f700: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
f710: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f720: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
f730: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
f740: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
f750: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65  n.** index.  The
f760: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
f770: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
f780: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
f790: 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  k..**.** For exa
f7a0: 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
f7b0: 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
f7c0: 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
f7d0: 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
f7e0: 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
f7f0: 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
f800: 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
f810: 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
f820: 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
f830: 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
f840: 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
f850: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
f860: 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
f870: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
f880: 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
f890: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
f8a0: 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
f8b0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
f8c0: 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
f8d0: 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
f8e0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f8f0: 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
f900: 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
f910: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
f920: 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
f930: 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20  l be left.** on 
f940: 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73  the stack - a is
f950: 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64   the deepest and
f960: 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73   b the shallowes
f970: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  t..**.** In the 
f980: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
f990: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
f9a0: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
f9b0: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
f9c0: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
f9d0: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
f9e0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
f9f0: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
fa00: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
fa10: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
fa20: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
fa30: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
fa40: 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
fa50: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
fa60: 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
fa70: 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
fa80: 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74  ll and puts.** t
fa90: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
faa0: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
fab0: 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20  n pLevel->iMem. 
fac0: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
fad0: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
fae0: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c  tine will use pL
faf0: 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74  evel->iMem to st
fb00: 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
fb10: 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
fb20: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
fb30: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
fb40: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
fb50: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
fb60: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
fb70: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
fb80: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
fb90: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
fba0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
fbb0: 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
fbc0: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
fbd0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fbe0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
fbf0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
fc00: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
fc10: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
fc20: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
fc30: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
fc40: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
fc50: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
fc60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
fc70: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
fc80: 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
fc90: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
fca0: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
fcb0: 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
fcc0: 20 6e 45 78 74 72 61 52 65 67 20 20 20 20 20 20   nExtraReg      
fcd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fce0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
fcf0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 29  to allocate */.)
fd00: 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
fd10: 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20  evel->nEq;      
fd20: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
fd30: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
fd40: 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
fd50: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
fd60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
fd70: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
fd80: 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
fd90: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
fda0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
fdb0: 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20  pLevel->pIdx;   
fdc0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
fdd0: 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
fde0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
fdf0: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
fe00: 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20  abCur;   /* The 
fe10: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
fe20: 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ble */.  WhereTe
fe30: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
fe40: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
fe50: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
fe60: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  rm */.  int j;  
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fe90: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
fea0: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
feb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
fec0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
fed0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
fee0: 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
fef0: 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
ff00: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
ff10: 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77  hem..  ** We alw
ff20: 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73  ays need at leas
ff30: 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74  t one used to st
ff40: 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72  ore the loop ter
ff50: 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c  minator.  ** val
ff60: 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ue.  If there ar
ff70: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77  e IN operators w
ff80: 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f  e'll need one fo
ff90: 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a  r each == or.  *
ffa0: 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e  * IN constraint.
ffb0: 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e  .  */.  pLevel->
ffc0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
ffd0: 4d 65 6d 20 2b 20 31 3b 0a 20 20 72 65 67 42 61  Mem + 1;.  regBa
ffe0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
fff0: 6d 20 2b 20 32 3b 0a 20 20 70 50 61 72 73 65 2d  m + 2;.  pParse-
10000 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d  >nMem += pLevel-
10010 3e 6e 45 71 20 2b 20 32 20 2b 20 6e 45 78 74 72  >nEq + 2 + nExtr
10020 61 52 65 67 3b 0a 0a 20 20 2f 2a 20 45 76 61 6c  aReg;..  /* Eval
10030 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
10040 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
10050 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
10060 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
10070 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
10080 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
10090 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
100a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
100b0 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
100c0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
100d0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
100e0 79 2c 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  y, pLevel->flags
100f0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
10100 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
10110 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  k;.    assert( (
10120 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
10130 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
10140 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
10150 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
10160 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
10170 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
10180 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
10190 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e+j ){.      sql
101a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
101b0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
101c0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
101d0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
101e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
101f0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
10200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10210 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10220 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
10230 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
10240 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
10250 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
10260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
10280 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
10290 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
102a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
102b0 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
102c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
102d0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
102e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
102f0 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
10300 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
10310 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
10320 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
10330 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
10340 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
10350 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
10360 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
10370 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
10380 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
10390 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
103a0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
103b0 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
103c0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
103d0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
103e0 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
103f0 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
10400 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
10410 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
10420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
10430 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
10440 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
10450 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10460 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
10470 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
10480 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
10490 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
104a0 65 49 6e 66 6f 46 72 65 65 28 57 68 65 72 65 49  eInfoFree(WhereI
104b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
104c0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
104d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
104e0 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
104f0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
10500 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
10510 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
10520 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
10530 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
10540 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
10550 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d    assert( pInfo-
10560 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
10570 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r==0 );.        
10580 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
10590 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
105a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
105b0 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  ree(pWInfo);.  }
105c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
105d0 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
105e0 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
105f0 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
10600 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
10610 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
10620 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
10630 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
10640 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
10650 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
10660 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
10670 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
10680 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
10690 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
106a0 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
106b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
106c0 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
106d0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
106e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
106f0 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
10700 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10710 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
10720 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10730 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
10740 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
10750 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
10760 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
10770 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
10780 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
10790 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
107a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
107b0 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
107c0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
107d0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
107e0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
107f0 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
10800 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
10810 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10820 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
10830 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
10840 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
10850 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
10860 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
10870 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
10880 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
10890 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
108a0 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
108b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
108c0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
108d0 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
108e0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
108f0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
10900 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
10910 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
10920 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
10930 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
10940 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
10950 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
10960 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
10970 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
109a0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
109b0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
109c0 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
109d0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
109e0 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
10a10 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
10a20 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
10a30 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
10a40 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
10a50 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
10a60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10a70 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
10a80 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
10a90 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
10aa0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
10ab0 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
10ac0 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
10ad0 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
10ae0 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
10af0 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
10b00 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
10b10 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
10b20 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
10b30 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
10b40 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
10b50 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
10b60 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
10b70 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
10b80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
10b90 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
10ba0 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
10bb0 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
10bc0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
10bd0 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
10be0 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
10bf0 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
10c00 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
10c10 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
10c20 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
10c30 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
10c40 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
10c50 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
10c60 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
10c70 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
10c80 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
10c90 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
10ca0 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
10cb0 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
10cc0 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
10cd0 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
10ce0 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
10cf0 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
10d00 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
10d10 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
10d20 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
10d30 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
10d40 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
10d50 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
10d60 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
10d70 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
10d80 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
10d90 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
10da0 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
10db0 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
10dc0 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
10dd0 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
10de0 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
10df0 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
10e00 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
10e10 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
10e20 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
10e30 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
10e40 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
10e50 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
10e60 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
10e70 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
10e80 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
10e90 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
10ea0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
10eb0 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
10ec0 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
10ed0 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
10ee0 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
10ef0 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
10f00 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
10f10 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
10f20 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
10f30 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
10f40 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
10f50 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
10f60 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
10f70 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
10f80 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
10f90 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
10fa0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
10fb0 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
10fc0 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
10fd0 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
10fe0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
10ff0 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
11000 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
11010 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
11020 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
11030 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
11040 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
11050 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
11060 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
11070 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
11080 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
11090 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
110a0 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
110b0 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
110c0 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
110d0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
110e0 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
110f0 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
11100 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
11110 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
11120 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
11130 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
11140 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
11150 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
11160 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
11170 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
11180 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
11190 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
111a0 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
111b0 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
111c0 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
111d0 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
111e0 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
111f0 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
11200 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
11210 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
11220 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
11230 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
11240 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
11250 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11260 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
11270 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
11280 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
11290 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
112a0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
112b0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
112c0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
112d0 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
112e0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
112f0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
11300 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
11310 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
11320 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
11330 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
11340 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
11350 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
11360 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
11370 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11380 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
11390 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
113a0 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
113b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
113c0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
113d0 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
113e0 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
113f0 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
11400 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11410 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
11420 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
11430 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
11440 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
11450 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
11460 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
11470 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
11480 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
11490 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
114a0 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
114b0 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
114c0 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
114d0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
114e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
114f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11500 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
11510 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
11520 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
11530 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
11540 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
11550 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
11560 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
11570 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
11580 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11590 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
115a0 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20  pOrderBy, /* An 
115b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
115c0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38   or NULL */.  u8
115d0 20 77 66 6c 61 67 73 20 20 20 20 20 20 20 20 20   wflags         
115e0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
115f0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
11600 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
11610 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69  eInt.h */.){.  i
11620 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11640 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
11650 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11660 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
11670 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
11680 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
11690 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
116a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
116b0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
116c0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
116d0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69  se engine */.  i
116e0 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30  nt brk, cont = 0
116f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
11700 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72 69  resses used duri
11710 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
11720 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
11730 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
11740 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
11750 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
11760 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
11770 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
11780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
11790 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
117a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
117b0 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
117c0 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f  maskSet;       /
117d0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
117e0 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
117f0 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20  hereClause wc;  
11800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11810 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
11820 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68   divided into th
11830 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73  ese terms */.  s
11840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
11850 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
11860 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
11870 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
11880 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
11890 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
118a0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
118b0 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
118c0 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  nfo list */.  in
118d0 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118f0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
11900 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
11910 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
11920 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
11930 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
11940 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77  ination of all w
11950 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 20  c.a[].flags */. 
11960 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
11970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11980 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11990 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
119a0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a   *pOrderBy = 0;.
119b0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
119c0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
119d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
119e0 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
119f0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
11a00 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
11a10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
11a20 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
11a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11a40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11a50 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
11a60 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
11a70 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
11a80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f  ;.  }..  if( ppO
11a90 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f  rderBy ){.    pO
11aa0 72 64 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65  rderBy = *ppOrde
11ab0 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  rBy;.  }..  /* S
11ac0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
11ad0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
11ae0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
11af0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
11b00 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
11b10 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
11b20 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
11b30 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
11b40 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a  kSet(&maskSet);.
11b50 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
11b60 74 28 26 77 63 2c 20 70 50 61 72 73 65 2c 20 26  t(&wc, pParse, &
11b70 6d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  maskSet);.  sqli
11b80 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
11b90 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
11ba0 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
11bb0 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20  it(&wc, pWhere, 
11bc0 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
11bd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
11be0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
11bf0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
11c00 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
11c10 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
11c20 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  urn value..  */.
11c30 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11c40 62 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  b;.  pWInfo = sq
11c50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11c60 6f 28 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20  o(db,  .        
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
11c80 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20  zeof(WhereInfo) 
11c90 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  + pTabList->nSrc
11ca0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
11cb0 65 6c 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  el));.  if( db->
11cc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11cd0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
11ce0 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20  ginNoMem;.  }.  
11cf0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
11d00 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
11d10 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
11d20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
11d30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
11d40 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
11d50 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
11d60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11d70 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  el(v);..  /* Spe
11d80 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
11d90 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
11da0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
11db0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
11dc0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
11dd0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
11de0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
11df0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
11e00 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
11e10 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
11e20 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  c==0 || sqlite3E
11e30 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
11e40 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
11e50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
11e60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
11e70 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
11e80 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
11e90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
11ea0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
11eb0 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
11ec0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
11ed0 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
11ee0 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
11ef0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
11f00 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
11f10 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
11f20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
11f30 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
11f40 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
11f50 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
11f60 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
11f70 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
11f80 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
11f90 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
11fa0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
11fb0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
11fc0 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
11fd0 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
11fe0 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
11ff0 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
12000 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
12010 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
12020 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
12030 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
12040 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
12050 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
12060 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
12070 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
12080 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
12090 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
120a0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
120b0 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
120c0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
120d0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
120e0 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
120f0 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
12100 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
12110 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
12120 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
12130 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
12140 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  015..  */.  for(
12150 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
12160 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
12170 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73   createMask(&mas
12180 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
12190 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
121a0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
121b0 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
121c0 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
121d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
121e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
121f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
12200 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
12210 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
12220 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
12230 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12240 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
12250 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
12260 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
12270 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
12280 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
12290 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
122a0 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
122b0 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
122c0 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
122d0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
122e0 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
122f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
12300 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
12310 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
12320 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
12330 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
12340 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
12350 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
12360 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
12370 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
12380 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
12390 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
123a0 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
123b0 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
123c0 77 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  wc);.  if( db->m
123d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
123e0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
123f0 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20  inNoMem;.  }..  
12400 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
12410 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
12420 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
12430 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
12440 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
12450 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
12460 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
12470 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
12480 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
12490 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
124a0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
124b0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
124c0 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
124d0 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20  o->a[].flags    
124e0 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
124f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12500 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
12510 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
12520 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
12530 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
12540 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
12550 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
12560 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66      When term of
12570 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
12580 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a   is being coded.
12590 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
125a0 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65  [].iTabCur   The
125b0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
125c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
125d0 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ble.  **   pWInf
125e0 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20  o->a[].iIdxCur  
125f0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
12600 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
12610 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
12620 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
12630 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
12640 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
12650 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
12660 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
12670 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
12680 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74  mask)0;.  pTabIt
12690 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
126a0 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  ;.  pLevel = pWI
126b0 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61  nfo->a;.  andFla
126c0 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45  gs = ~0;.  WHERE
126d0 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
126e0 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
126f0 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46  n"));.  for(i=iF
12700 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
12710 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
12720 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
12730 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
12740 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
12750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12760 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62  dex for FROM tab
12770 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a  le at pTabItem *
12780 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b  /.    int flags;
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f    /* Flags assso
127b0 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
127c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b   */.    int nEq;
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
127f0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
12800 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75  aints */.    dou
12810 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
12820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12830 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f  cost for pIdx */
12840 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
12870 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73  over FROM tables
12880 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
12890 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
128a0 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20      /* The best 
128b0 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61  index seen so fa
128c0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  r */.    int bes
128d0 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  tFlags = 0;     
128e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
128f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
12900 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
12910 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20  estNEq = 0;     
12920 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73         /* nEq as
12930 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
12940 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  est */.    doubl
12950 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20  e lowestCost;   
12960 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
12970 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20  f the pBest */. 
12980 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30     int bestJ = 0
12990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
129a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
129b0 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
129c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
129d0 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
129e0 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
129f0 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  stJ */.    int o
12a00 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
12a10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
12a20 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20  hen first table 
12a30 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 73  is seen */.    s
12a40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12a50 6f 20 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43 75  o *pIndex; /* Cu
12a60 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e  rrent virtual in
12a70 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65  dex */..    lowe
12a80 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  stCost = SQLITE_
12a90 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72  BIG_DBL;.    for
12aa0 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
12ab0 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
12ac0 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j]; j<pTabList->
12ad0 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49  nSrc; j++, pTabI
12ae0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  tem++){.      in
12af0 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20  t doNotReorder; 
12b00 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
12b10 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f   table should no
12b20 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a  t be reordered *
12b30 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  /..      doNotRe
12b40 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
12b50 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
12b60 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
12b70 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  ))!=0;.      if(
12b80 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65   once && doNotRe
12b90 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
12ba0 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
12bb0 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (&maskSet, pTabI
12bc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
12bd0 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
12be0 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
12bf0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
12c00 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
12c10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12c30 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
12c40 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  pTab );.#ifndef 
12c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12c60 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69  UALTABLE.      i
12c70 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
12c80 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  bItem->pTab) ){.
12c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12ca0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
12cb0 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f  dxInfo = &pWInfo
12cc0 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
12cd0 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
12ce0 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
12cf0 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54  (pParse, &wc, pT
12d00 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
12d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70    ppOrderBy ? *p
12d40 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d  pOrderBy : 0, i=
12d50 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0,.            
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a      ppIdxInfo);.
12d80 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
12d90 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
12da0 4c 45 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  LE;.        pInd
12db0 65 78 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  ex = *ppIdxInfo;
12dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
12dd0 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 6f  dex && pIndex->o
12de0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
12df0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
12e00 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
12e10 4c 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  LTABLE | WHERE_O
12e20 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
12e30 7d 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d  }.        pIdx =
12e40 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 45 71 20   0;.        nEq 
12e50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
12e60 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
12e70 2f 32 2e 30 29 3c 63 6f 73 74 20 29 7b 0a 20 20  /2.0)<cost ){.  
12e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
12e90 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ost is not allow
12ea0 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ed to be larger 
12eb0 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f  than SQLITE_BIG_
12ec0 44 42 4c 20 28 74 68 65 0a 20 20 20 20 20 20 20  DBL (the.       
12ed0 20 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c     ** inital val
12ee0 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
12ef0 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
12f00 66 20 69 74 20 69 73 2c 20 74 68 65 6e 0a 20 20  f it is, then.  
12f10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 28          ** the (
12f20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29  cost<lowestCost)
12f30 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c   test below will
12f40 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 61   never be true a
12f50 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
12f60 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
12f70 20 6e 65 76 65 72 20 73 65 74 2e 0a 20 20 20 20   never set..    
12f80 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
12f90 20 20 20 20 63 6f 73 74 20 3d 20 28 53 51 4c 49      cost = (SQLI
12fa0 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b  TE_BIG_DBL/2.0);
12fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12fc0 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
12fd0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
12fe0 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28  ost = bestIndex(
12ff0 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61  pParse, &wc, pTa
13000 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
13010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13020 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20            (i==0 
13030 26 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20  && ppOrderBy) ? 
13040 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a  *ppOrderBy : 0,.
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c 20           &pIdx, 
13070 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20  &flags, &nEq);. 
13080 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
13090 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
130a0 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
130b0 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
130c0 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
130d0 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
130e0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65  ost;.        pBe
130f0 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
13100 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
13110 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65  lags;.        be
13120 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
13130 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a       bestJ = j;.
13140 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
13150 70 42 65 73 74 49 64 78 20 3d 20 70 49 6e 64 65  pBestIdx = pInde
13160 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
13170 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65   if( doNotReorde
13180 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
13190 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
131a0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
131b0 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20  choose table %d 
131c0 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
131d0 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
131e0 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
131f0 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
13200 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45  estFlags & WHERE
13210 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a  _ORDERBY)!=0 ){.
13220 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79        *ppOrderBy
13230 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
13240 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74  andFlags &= best
13250 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
13260 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46  l->flags = bestF
13270 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
13280 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a  ->pIdx = pBest;.
13290 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20      pLevel->nEq 
132a0 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70  = bestNEq;.    p
132b0 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d  Level->aInLoop =
132c0 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   0;.    pLevel->
132d0 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nIn = 0;.    if(
132e0 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
132f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
13300 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13320 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
13330 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ur = -1;.    }. 
13340 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
13350 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
13360 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  , pTabList->a[be
13370 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  stJ].iCursor);. 
13380 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
13390 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20   = bestJ;.  }.  
133a0 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
133b0 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
133c0 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20  hed ***\n"));.. 
133d0 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c   /* If the total
133e0 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65   query only sele
133f0 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  cts a single row
13400 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52  , then the ORDER
13410 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20   BY.  ** clause 
13420 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20  is irrelevant.. 
13430 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c   */.  if( (andFl
13440 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
13450 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65  UE)!=0 && ppOrde
13460 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72  rBy ){.    *ppOr
13470 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
13480 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
13490 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
134a0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
134b0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
134c0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
134d0 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
134e0 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
134f0 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
13500 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
13510 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
13520 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
13530 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
13540 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
13550 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
13560 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
13570 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
13580 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 66 6c  /.  assert( (wfl
13590 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
135a0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
135b0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
135c0 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
135d0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  flags & WHERE_ON
135e0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
135f0 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26  0 && (andFlags &
13600 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
13610 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
13620 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
13630 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
13640 2e 66 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  .flags &= ~WHERE
13650 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
13660 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
13670 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
13680 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
13690 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
136a0 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
136b0 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
136c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
136d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
136e0 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
136f0 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
13700 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
13710 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
13720 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
13730 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
13740 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
13750 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
13760 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
13770 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64   open */.    Ind
13780 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a  ex *pIx;      /*
13790 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   Index used to a
137a0 63 63 65 73 73 20 70 54 61 62 20 28 69 66 20 61  ccess pTab (if a
137b0 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ny) */.    int i
137c0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
137d0 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
137e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
137f0 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e/index */.    i
13800 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
13810 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23  vel->iIdxCur;..#
13820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13830 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
13840 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
13850 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63  in==2 ){.      c
13860 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20  har *zMsg;.     
13870 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
13880 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
13890 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
138a0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20  l->iFrom];.     
138b0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
138c0 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41 42 4c  Printf(db, "TABL
138d0 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  E %s", pItem->zN
138e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
138f0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
13900 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
13910 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13920 62 2c 20 22 25 7a 20 41 53 20 25 73 22 2c 20 7a  b, "%z AS %s", z
13930 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
13940 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
13950 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c     if( (pIx = pL
13960 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29  evel->pIdx)!=0 )
13970 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
13980 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13990 64 62 2c 20 22 25 7a 20 57 49 54 48 20 49 4e 44  db, "%z WITH IND
139a0 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  EX %s", zMsg, pI
139b0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
139c0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
139d0 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
139e0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
139f0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
13a00 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
13a10 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13a20 62 2c 20 22 25 7a 20 55 53 49 4e 47 20 50 52 49  b, "%z USING PRI
13a30 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
13a40 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
13a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13a60 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
13a70 20 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c   else if( pLevel
13a80 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20  ->pBestIdx ){.  
13a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
13aa0 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49  dex_info *pBestI
13ab0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65  dx = pLevel->pBe
13ac0 73 74 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a  stIdx;.        z
13ad0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
13ae0 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 56 49 52  intf(db, "%z VIR
13af0 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
13b00 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78     pBestIdx->idx
13b30 4e 75 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e 69  Num, pBestIdx->i
13b40 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxStr);.      }.
13b50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
13b60 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
13b70 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29   WHERE_ORDERBY )
13b80 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
13b90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13ba0 64 62 2c 20 22 25 7a 20 4f 52 44 45 52 20 42 59  db, "%z ORDER BY
13bb0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
13bc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
13bd0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13be0 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76  Explain, i, pLev
13bf0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d  el->iFrom, 0, zM
13c00 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
13c10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
13c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
13c30 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62  LAIN */.    pTab
13c40 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
13c50 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
13c60 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
13c70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
13c80 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13c90 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
13ca0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
13cb0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66  pSchema);.    if
13cc0 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  ( pTab->isEphem 
13cd0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
13ce0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
13cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13d10 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42    if( pLevel->pB
13d20 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  estIdx ){.      
13d30 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
13d40 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
13d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
13d70 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20  n, iCur, 0, 0,. 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
13da0 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c  ar*)pTab->pVtab,
13db0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
13dc0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
13dd0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  if( (pLevel->fla
13de0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
13df0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
13e00 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
13e10 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
13e20 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
13e30 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
13e40 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
13e50 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
13e60 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
13e70 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
13e80 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
13e90 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
13ea0 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42  ->nCol<(sizeof(B
13eb0 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20  itmask)*8) ){.  
13ec0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
13ed0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
13ee0 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
13ef0 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
13f00 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
13f10 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
13f20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13f30 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP2(v, sqlite3Vd
13f40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13f50 2d 32 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  -2, n);.        
13f60 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
13f70 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
13f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13f90 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
13fa0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
13fb0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
13fc0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
13fd0 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69   }.    pLevel->i
13fe0 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
13ff0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
14000 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65  if( (pIx = pLeve
14010 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20  l->pIdx)!=0 ){. 
14020 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
14030 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
14040 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
14050 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73 73   pIx);.      ass
14060 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
14070 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
14080 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
140a0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
140b0 20 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   0, pIx->nColumn
140c0 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
140d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
140e0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
140f0 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
14100 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
14120 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
14130 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
14140 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14150 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
14160 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
14170 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
14180 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
14190 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
141a0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
141b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
141c0 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
141d0 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
141e0 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
141f0 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
14200 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
14210 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
14220 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
14230 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
14240 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
14250 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
14260 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
14270 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
14280 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
14290 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
142a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
142b0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
142c0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20   int j;.    int 
142d0 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
142e0 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68  >iCursor;  /* Th
142f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
14300 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
14310 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
14320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
14330 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
14340 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ing */.    int n
14350 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
14360 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
14370 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
14380 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
14390 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
143a0 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
143b0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
143c0 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
143d0 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65     int omitTable
143e0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
143f0 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
14400 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  x only */.    in
14410 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
14420 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
14430 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
14440 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
14450 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
14460 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
14470 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
14480 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
14490 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
144a0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
144b0 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
144c0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
144d0 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70  r;.    bRev = (p
144e0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
144f0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
14500 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20  ;.    omitTable 
14510 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
14520 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
14530 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  Y)!=0;..    /* C
14540 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
14550 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
14560 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
14570 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  ructions.    ** 
14580 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
14590 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62  loop.  Jump to b
145a0 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
145b0 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  of a loop..    *
145c0 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
145d0 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
145e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
145f0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
14600 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a    ** loop..    *
14610 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68  *.    ** When th
14620 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
14630 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
14640 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61 62 65  ave a "nxt" labe
14650 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 6d 65  l that.    ** me
14660 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
14670 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
14680 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
14690 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20 2a 2a  on.  When.    **
146a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
146b0 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
146c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
146d0 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c 0a 20  he "nxt" label. 
146e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
146f0 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20 20 20  e as "brk"..    
14700 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65  */.    brk = pLe
14710 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65 76 65  vel->brk = pLeve
14720 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33  l->nxt = sqlite3
14730 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14740 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65  ;.    cont = pLe
14750 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69  vel->cont = sqli
14760 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14770 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  (v);..    /* If 
14780 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
14790 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
147a0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
147b0 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a  locate and.    *
147c0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
147d0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
147e0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
147f0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
14800 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20  y.    ** row of 
14810 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
14820 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20  f the join..    
14830 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
14840 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
14850 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
14860 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
14870 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
14880 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
14890 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
148a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
148c0 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
148d0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
148e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
148f0 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
14900 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
14910 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  "));.    }..#ifn
14920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14930 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
14940 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
14950 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  stIdx ){.      /
14960 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74  * Case 0:  The t
14970 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
14980 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
14990 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
149a0 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ext.      **    
149b0 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
149c0 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20 20  the data..      
149d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
149e0 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20        int iReg; 
149f0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
14a00 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
14a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
14a20 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49  dex_info *pBestI
14a30 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65  dx = pLevel->pBe
14a40 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  stIdx;.      int
14a50 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
14a60 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72  BestIdx->nConstr
14a70 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72 75  aint;.      stru
14a80 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14a90 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
14aa0 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20  e *aUsage =.    
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
14ae0 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  estIdx->aConstra
14af0 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20 20  intUsage;.      
14b00 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
14b10 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14b20 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69  raint *aConstrai
14b30 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  nt =.           
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d         pBestIdx-
14b70 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20  >aConstraint;.. 
14b80 20 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69       iReg = sqli
14b90 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
14ba0 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
14bb0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 66 6f  int+2);.      fo
14bc0 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74  r(j=1; j<=nConst
14bd0 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
14be0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
14bf0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
14c00 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
14c10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14c20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
14c30 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
14c40 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
14c50 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d  = aConstraint[k]
14c60 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
14c70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c80 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14c90 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70 45  , wc.a[iTerm].pE
14ca0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65  xpr->pRight, iRe
14cb0 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  g+j+1);.        
14cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
14cf0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
14d00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d20 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14d30 65 72 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64  er, pBestIdx->id
14d40 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
14d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14d70 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
14d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14d90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14da0 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 62  VFilter, iCur, b
14db0 72 6b 2c 20 69 52 65 67 2c 20 70 42 65 73 74 49  rk, iReg, pBestI
14dc0 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e 65      pBestIdx->ne
14df0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
14e00 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
14e10 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
14e20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
14e30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
14e40 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
14e50 74 2b 32 29 3b 0a 20 20 20 20 20 20 70 42 65 73  t+2);.      pBes
14e60 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  tIdx->needToFree
14e70 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
14e80 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65    for(j=0; j<pBe
14e90 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69  stIdx->nConstrai
14ea0 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
14eb0 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
14ec0 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
14ed0 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
14ee0 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
14ef0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
14f00 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14f10 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54  pLevel, &wc.a[iT
14f20 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  erm]);.        }
14f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14f40 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
14f50 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
14f60 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
14f70 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
14f80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14f90 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
14fa0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
14fb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14fc0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
14fd0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
14fe0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
14ff0 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  D_EQ ){.      /*
15000 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
15010 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
15020 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
15030 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20   using an.      
15040 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
15050 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
15060 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
15070 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
15080 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
15090 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
150a0 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
150b0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
150c0 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  )".      **     
150d0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
150e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
150f0 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 70 54 65  nt r1;.      pTe
15100 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rm = findTerm(&w
15110 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  c, iCur, -1, not
15120 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
15130 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  IN, 0);.      as
15140 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
15150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15160 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
15170 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15180 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
15190 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
151a0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
151b0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
151c0 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
151d0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
151e0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 29 3b  erm, pLevel, 0);
151f0 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65  .      nxt = pLe
15200 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20  vel->nxt;.      
15210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15220 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
15230 74 2c 20 72 31 2c 20 6e 78 74 29 3b 0a 20 20 20  t, r1, nxt);.   
15240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15250 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
15260 69 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74 2c  ists, iCur, nxt,
15270 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
15280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
15290 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ));.      pLevel
152a0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
152b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
152c0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
152d0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
152e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
152f0 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
15300 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
15310 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
15320 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
15330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
15340 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
15350 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  op;.      int st
15360 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65  art;.      Where
15370 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
15380 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  End;..      asse
15390 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
153a0 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74   );.      pStart
153b0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
153c0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
153d0 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
153e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64  , 0);.      pEnd
153f0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
15400 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
15410 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
15420 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15430 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15440 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
15450 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d          pStart =
15460 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70   pEnd;.        p
15470 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
15480 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
15490 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
154a0 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
154b0 20 20 20 69 6e 74 20 72 31 2c 20 72 65 67 46 72     int r1, regFr
154c0 65 65 31 3b 0a 20 20 20 20 20 20 20 20 70 58 20  ee1;.        pX 
154d0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
154e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
154f0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
15500 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
15510 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
15520 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 31  ur );.        r1
15530 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15540 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15550 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  X->pRight, &regF
15560 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
15570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15580 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c  (v, OP_ForceInt,
15590 20 72 31 2c 20 62 72 6b 2c 20 0a 20 20 20 20 20   r1, brk, .     
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 20 20 20 20 20 20 20 20 70 58 2d 3e 6f 70 3d 3d          pX->op==
155c0 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LE || pX->op=
155d0 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 20  =TK_GT);.       
155e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155f0 70 33 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p3(v, bRev ? OP_
15600 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65  MoveLt : OP_Move
15610 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 72  Ge, iCur, brk, r
15620 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
15630 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
15640 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
15650 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15660 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
15670 65 31 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  e1);.        dis
15680 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15690 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   pStart);.      
156a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
156b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
156c0 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
156d0 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
156e0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
156f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
15700 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
15710 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
15720 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
15730 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15740 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
15750 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
15760 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
15770 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  r );.        pLe
15780 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  vel->iMem = ++pP
15790 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
157a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
157b0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
157c0 70 52 69 67 68 74 2c 20 70 4c 65 76 65 6c 2d 3e  pRight, pLevel->
157d0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  iMem);.        i
157e0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
157f0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
15800 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  T ){.          t
15810 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
15820 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
15830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15840 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15850 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
15860 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  P_Gt;.        }.
15870 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
15880 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
15890 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
158a0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
158b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
158c0 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v);.      pLevel
158d0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
158e0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
158f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
15900 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
15910 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
15920 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  rt;.      if( te
15930 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
15940 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
15950 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15960 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15980 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15990 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20  id, iCur, r1);. 
159a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
159b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
159c0 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d  P_SCopy, pLevel-
159d0 3e 69 4d 65 6d 2c 20 30 29 3b 20 2a 2f 0a 20 20  >iMem, 0); */.  
159e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
159f0 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
15a00 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  p, pLevel->iMem,
15a10 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20   brk, r1);.     
15a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15a30 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
15a40 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
15a50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15a60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15a70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15a80 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15a90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
15aa0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
15ab0 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
15ac0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
15ad0 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
15ae0 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73    /* Case 3: A s
15af0 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
15b00 65 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ex..      **.   
15b10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
15b20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d  e WHERE clause m
15b30 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20  ay contain zero 
15b40 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79  or more equality
15b50 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20   .      **      
15b60 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
15b70 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
15b80 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
15b90 74 68 65 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20  the N.      **  
15ba0 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
15bb0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
15bc0 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
15bd0 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  so contain.     
15be0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
15bf0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
15c00 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
15c10 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
15c20 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ed.      **     
15c30 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
15c40 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c50 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
15c60 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
15c70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
15c80 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
15c90 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
15ca0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
15cb0 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
15cc0 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
15cd0 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
15ce0 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
15cf0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
15d00 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15d10 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
15d20 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
15d30 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
15d40 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a  are all .      *
15d50 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69  *         optimi
15d60 7a 65 64 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  zed:.      **.  
15d70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15d80 20 20 78 3d 35 0a 20 20 20 20 20 20 2a 2a 20 20    x=5.      **  
15d90 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
15da0 44 20 79 3d 31 30 0a 20 20 20 20 20 20 2a 2a 20  D y=10.      ** 
15db0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
15dc0 4e 44 20 79 3c 31 30 0a 20 20 20 20 20 20 2a 2a  ND y<10.      **
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
15de0 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
15df0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15e00 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
15e10 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 20   AND z<=10.     
15e20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
15e30 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65       The z<10 te
15e40 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  rm of the follow
15e50 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ing cannot be us
15e60 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ed, only.      *
15e70 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
15e80 35 20 74 65 72 6d 3a 0a 20 20 20 20 20 20 2a 2a  5 term:.      **
15e90 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15ea0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
15eb0 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  0.      **.     
15ec0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
15ed0 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
15ee0 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
15ef0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
15f00 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15f10 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
15f20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
15f30 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
15f40 73 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  s at.      **   
15f50 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
15f60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15f70 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
15f80 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
15f90 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
15fa0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
15fb0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15fc0 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
15fd0 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
15fe0 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
15ff0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
16000 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
16010 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
16020 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
16030 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
16040 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 69      */  .      i
16050 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  nt aStartOp[] = 
16060 7b 0a 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20  {.        0,.   
16070 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
16080 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
16090 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
160a0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
160b0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
160c0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  Rev) */.        
160d0 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
160e0 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
160f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
16100 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
16110 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  Rev) */.        
16120 4f 50 5f 4d 6f 76 65 47 74 2c 20 20 20 20 20 20  OP_MoveGt,      
16130 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
16140 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
16150 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
16160 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  Rev) */.        
16170 4f 50 5f 4d 6f 76 65 4c 74 2c 20 20 20 20 20 20  OP_MoveLt,      
16180 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
16190 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
161a0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
161b0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  Rev) */.        
161c0 4f 50 5f 4d 6f 76 65 47 65 2c 20 20 20 20 20 20  OP_MoveGe,      
161d0 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
161e0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
161f0 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
16200 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  Rev) */.        
16210 4f 50 5f 4d 6f 76 65 4c 65 20 20 20 20 20 20 20  OP_MoveLe       
16220 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
16230 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
16240 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
16250 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  Rev) */.      };
16260 0a 20 20 20 20 20 20 69 6e 74 20 61 45 6e 64 4f  .      int aEndO
16270 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
16280 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
16290 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
162a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
162b0 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78 47  .        OP_IdxG
162c0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
162d0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
162e0 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
162f0 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78  /.        OP_Idx
16300 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
16310 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
16320 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
16330 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  /.      };.     
16340 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
16350 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e  l->nEq;.      in
16360 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30  t isMinQuery = 0
16370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
16380 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
16390 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
163a0 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69  (x).. */.      i
163b0 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
163c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
163d0 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
163e0 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
163f0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
16400 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16420 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
16430 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
16440 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
16450 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
16460 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
16470 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
16480 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
16490 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
164a0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
164b0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
164c0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  nge end */.     
164d0 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164f0 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
16500 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
16510 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20 20   or <= */.      
16520 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20  int endEq;      
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16540 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e  True if range en
16550 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  d uses ==, >= or
16560 20 3c 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   <= */.      int
16570 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
16580 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
16590 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
165a0 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
165b0 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
165c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
165d0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69   /* Column for i
165e0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
165f0 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  aints */.      i
16600 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
16610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16620 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
16630 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
16640 20 20 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 20 20     int op;..    
16650 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16660 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
16670 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
16680 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
16690 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  IN.      ** and 
166a0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
166b0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
166c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
166d0 65 67 69 73 74 65 72 73 0a 20 20 20 20 20 20 2a  egisters.      *
166e0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
166f0 67 42 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  gBase..      */.
16700 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
16710 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
16720 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
16730 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
16740 64 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 78  dy, 2);.      nx
16750 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b  t = pLevel->nxt;
16760 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
16770 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65  is loop satisfie
16780 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28  s a sort order (
16790 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73  pOrderBy) reques
167a0 74 20 74 68 61 74 20 0a 20 20 20 20 20 20 2a 2a  t that .      **
167b0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
167c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
167d0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
167e0 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
167f0 0a 20 20 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  .      ** query,
16800 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
16810 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
16820 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
16830 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
16840 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
16850 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
16860 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
16870 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20 20 2a  returned.      *
16880 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
16890 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
168a0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
168b0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
168c0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
168d0 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20  t one after the 
168e0 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  nEq equality con
168f0 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
16900 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 2a 2a 20  index,.      ** 
16910 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
16920 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
16930 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
16940 20 20 20 20 69 66 28 20 28 77 66 6c 61 67 73 26      if( (wflags&
16950 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
16960 4e 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  N)!=0.       && 
16970 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 26 57  (pLevel->flags&W
16980 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20  HERE_ORDERBY).  
16990 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
169a0 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
169b0 20 20 20 26 26 20 28 70 4f 72 64 65 72 42 79 2d     && (pOrderBy-
169c0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
169d0 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
169e0 6c 75 6d 6e 5b 6e 45 71 5d 29 0a 20 20 20 20 20  lumn[nEq]).     
169f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 4d 69   ){.        isMi
16a00 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
16a10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
16a20 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74  nd any inequalit
16a30 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  y constraint ter
16a40 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  ms for the start
16a50 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 20 20   and end .      
16a60 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
16a70 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
16a80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
16a90 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
16aa0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
16ab0 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64  pRangeEnd = find
16ac0 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
16ad0 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f  k, notReady, (WO
16ae0 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78  _LT|WO_LE), pIdx
16af0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16b00 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
16b10 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
16b20 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
16b30 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69  pRangeStart = fi
16b40 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
16b50 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28  , k, notReady, (
16b60 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49  WO_GT|WO_GE), pI
16b70 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
16b80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
16b90 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
16ba0 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
16bb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
16bc0 78 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  x, or.      ** a
16bd0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
16be0 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
16bf0 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
16c00 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
16c10 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
16c20 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
16c30 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
16c40 45 6e 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  End)..      */. 
16c50 20 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 28       if( bRev==(
16c60 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
16c70 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
16c80 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20 20  _ASC) ){.       
16c90 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
16ca0 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
16cb0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
16cc0 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63    }..      testc
16cd0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
16ce0 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
16cf0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
16d00 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
16d10 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
16d20 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
16d30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16d40 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
16d50 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
16d60 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
16d70 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
16d80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16d90 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
16da0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
16db0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
16dc0 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
16dd0 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
16de0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
16df0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
16e00 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 65  |WO_GE);.      e
16e10 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
16e20 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
16e30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
16e40 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
16e50 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
16e60 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
16e70 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
16e80 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
16e90 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
16ea0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16eb0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20   range. */.     
16ec0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
16ed0 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  Eq;.      if( pR
16ee0 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
16ef0 20 20 20 20 20 69 6e 74 20 64 63 63 20 3d 20 70       int dcc = p
16f00 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
16f10 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 20 20  lCache;.        
16f20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
16f30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
16f40 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16f50 68 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  he = 1;.        
16f60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16f70 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16f80 2c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  , pRangeStart->p
16f90 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65  Expr->pRight, re
16fa0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
16fb0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
16fc0 62 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 64 63  bleColCache = dc
16fd0 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  c;.        sqlit
16fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16ff0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
17000 73 65 2b 6e 45 71 2c 20 6e 78 74 29 3b 0a 20 20  se+nEq, nxt);.  
17010 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
17020 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
17030 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
17040 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17060 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
17070 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
17080 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
17090 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 45 71  .        startEq
170a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
170b0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
170c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
170d0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
170e0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
170f0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
17100 74 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  t, pIdx);.      
17110 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
17120 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
17130 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
17140 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
17150 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
17160 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17170 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
17180 64 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  d );.      testc
17190 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  ase( op==OP_Last
171a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
171b0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 47  se( op==OP_MoveG
171c0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
171d0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65  ase( op==OP_Move
171e0 47 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ge );.      test
171f0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76  case( op==OP_Mov
17200 65 4c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  eLe );.      tes
17210 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f  tcase( op==OP_Mo
17220 76 65 4c 74 20 29 3b 0a 20 20 20 20 20 20 73 71  veLt );.      sq
17230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17240 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
17250 6e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 0a 20  nxt, regBase, . 
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6e 43         (char*)nC
17280 6f 6e 73 74 72 61 69 6e 74 2c 20 50 34 5f 49 4e  onstraint, P4_IN
17290 54 33 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  T32);..      /* 
172a0 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
172b0 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
172c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
172d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
172e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69       ** range (i
172f0 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
17300 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
17310 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  nt = nEq;.      
17320 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
17330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17340 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17350 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
17360 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61  r->pRight, regBa
17370 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  se+nEq);.       
17380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17390 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
173a0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78   regBase+nEq, nx
173b0 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  t);.        code
173c0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
173d0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
173e0 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20 20  Eq+1, pIdx);.   
173f0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
17400 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ++;.      }..   
17410 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
17420 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
17430 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
17440 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17450 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
17460 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
17470 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
17480 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
17490 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
174a0 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  .      op = aEnd
174b0 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
174c0 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
174d0 76 29 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  v)];.      testc
174e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
174f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17500 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
17510 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17520 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
17530 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17540 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f  3VdbeAddOp4(v, o
17550 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c  p, iIdxCur, nxt,
17560 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20 20 20   regBase,.      
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17580 20 20 28 63 68 61 72 2a 29 6e 43 6f 6e 73 74 72    (char*)nConstr
17590 61 69 6e 74 2c 20 50 34 5f 49 4e 54 33 32 29 3b  aint, P4_INT32);
175a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
175b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e  beChangeP5(v, en
175c0 64 45 71 21 3d 62 52 65 76 29 3b 0a 0a 20 20 20  dEq!=bRev);..   
175d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
175e0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
175f0 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
17600 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
17610 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
17620 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
17630 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
17640 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
17650 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a  t NULL..      **
17660 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
17670 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
17680 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
17690 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
176a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
176b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
176c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
176d0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
176e0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
176f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
17700 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ase( pLevel->fla
17710 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
17720 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 69 66  IMIT );.      if
17730 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
17740 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
17750 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
17760 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  IT) ){.        s
17770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17780 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
17790 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
177a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
177b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
177c0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 63 6f  P_IsNull, r1, co
177d0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nt);.      }..  
177e0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
177f0 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
17800 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
17810 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
17820 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
17830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17840 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
17850 49 64 78 43 75 72 2c 20 72 31 29 3b 0a 20 20 20  IdxCur, r1);.   
17860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17870 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
17880 65 47 65 2c 20 69 43 75 72 2c 20 30 2c 20 72 31  eGe, iCur, 0, r1
17890 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  );  /* Deferred 
178a0 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  seek */.      }.
178b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
178c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
178d0 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 20 20  se, r1);..      
178e0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
178f0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
17900 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
17910 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
17920 20 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c       ** WHERE cl
17930 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
17940 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
17950 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
17960 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
17970 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
17980 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
17990 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
179a0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
179b0 43 75 72 3b 0a 20 20 20 20 20 20 64 69 73 61 62  Cur;.      disab
179c0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
179d0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
179e0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
179f0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
17a00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17a10 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20      /* Case 4:  
17a20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
17a30 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
17a40 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
17a50 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
17a60 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
17a70 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
17a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
17a90 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
17aa0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17ab0 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20  ( bRev==0 );.   
17ac0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
17ad0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
17ae0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
17af0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
17b00 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
17b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17b20 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62  _Rewind, iCur, b
17b30 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  rk);.    }.    n
17b40 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
17b50 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43  ask(&maskSet, iC
17b60 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  ur);..    /* Ins
17b70 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
17b80 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
17b90 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
17ba0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20   completely.    
17bb0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
17bc0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
17bd0 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20  t of tables..   
17be0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72   */.    for(pTer
17bf0 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65  m=wc.a, j=wc.nTe
17c00 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
17c10 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  erm++){.      Ex
17c20 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 74 65  pr *pE;.      te
17c30 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66  stcase( pTerm->f
17c40 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
17c50 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UAL );.      tes
17c60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c  tcase( pTerm->fl
17c70 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
17c80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
17c90 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45  erm->flags & (TE
17ca0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
17cb0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
17cc0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
17cd0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
17ce0 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
17cf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17d00 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
17d10 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
17d20 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
17d30 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
17d40 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
17d50 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
17d60 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
17d70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
17d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17d90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
17da0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e  (pParse, pE, con
17db0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
17dc0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65  NULL);.      pTe
17dd0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
17de0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a  M_CODED;.    }..
17df0 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46      /* For a LEF
17e00 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
17e10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17e20 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
17e30 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a   fact that.    *
17e40 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
17e50 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
17e60 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
17e70 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
17e80 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
17e90 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
17ea0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c  Join ){.      pL
17eb0 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69  evel->top = sqli
17ec0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17ed0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
17ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ef0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
17f00 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
17f10 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  in);.      VdbeC
17f20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
17f30 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
17f40 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
17f50 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d  e3ExprClearColum
17f60 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  nCache(pParse, p
17f70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
17f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17f90 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63  prClearColumnCac
17fa0 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  he(pParse, pLeve
17fb0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
17fc0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
17fd0 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65  a, j=0; j<wc.nTe
17fe0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
17ff0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
18000 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67  ase( pTerm->flag
18010 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
18020 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
18030 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61  case( pTerm->fla
18040 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
18050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18060 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
18070 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
18080 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
18090 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
180a0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
180b0 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
180c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
180d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
180e0 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
180f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18100 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
18110 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f  pTerm->pExpr, co
18120 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
18130 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
18140 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
18150 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
18160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
18170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18180 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
18190 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
181a0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
181b0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
181c0 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
181d0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
181e0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
181f0 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
18200 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
18210 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
18220 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
18230 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
18240 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
18250 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
18260 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
18270 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
18280 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
18290 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
182a0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
182b0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
182c0 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
182d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
182e0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
182f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
18300 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
18310 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
18320 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
18330 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
18340 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
18350 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
18360 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
18370 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
18380 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
18390 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Name;.    n = st
183a0 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
183b0 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
183c0 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
183d0 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
183e0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
183f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
18400 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
18410 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
18420 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
18430 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20  an], "{}", 2);. 
18440 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
18450 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
18460 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
18470 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
18480 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20  lan[nQPlan], z, 
18490 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
184a0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  an += n;.      }
184b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71  .      sqlite3_q
184c0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
184d0 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  ++] = ' ';.    }
184e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
184f0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
18500 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b  HERE_ROWID_EQ );
18510 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
18520 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
18530 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
18540 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
18550 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
18560 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
18570 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
18580 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
18590 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
185a0 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22  an[nQPlan], "* "
185b0 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 2);.      nQPl
185c0 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
185d0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
185e0 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
185f0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
18600 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
18610 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
18620 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
18630 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18640 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c     n = strlen(pL
18650 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
18660 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
18670 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
18680 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
18690 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
186a0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
186b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
186c0 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64  an], pLevel->pId
186d0 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  x->zName, n);.  
186e0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
186f0 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  n;.        sqlit
18700 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
18710 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
18720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18730 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
18740 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
18750 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
18760 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
18770 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18780 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
18790 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
187a0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
187b0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
187c0 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
187d0 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
187e0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
187f0 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
18800 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
18810 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
18820 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
18830 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
18840 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
18850 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
18860 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d  ..  */.  pWInfo-
18870 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e  >iContinue = con
18880 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  t;.  whereClause
18890 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65  Clear(&wc);.  re
188a0 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
188b0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
188c0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
188d0 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a  whereBeginNoMem:
188e0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
188f0 65 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72  ear(&wc);.  wher
18900 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
18910 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
18920 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18930 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18940 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
18950 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
18960 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18970 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
18980 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
18990 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
189a0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
189b0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56  fo *pWInfo){.  V
189c0 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
189d0 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
189e0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
189f0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
18a00 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
18a10 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18a20 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e  bList;..  /* Gen
18a30 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
18a40 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
18a50 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
18a60 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
18a70 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
18a80 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  -1);.  for(i=pTa
18a90 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69  bList->nSrc-1; i
18aa0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
18ab0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
18ac0 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
18ad0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18ae0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f  el(v, pLevel->co
18af0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
18b00 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
18b10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18b20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
18b30 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
18b40 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
18b50 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
18b60 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b  ( pLevel->nIn ){
18b70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
18b80 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
18b90 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
18ba0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18bb0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
18bc0 3e 6e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  >nxt);.      for
18bd0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20  (j=pLevel->nIn, 
18be0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e  pIn=&pLevel->aIn
18bf0 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
18c00 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
18c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18c20 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
18c30 3e 74 6f 70 41 64 64 72 2b 31 29 3b 0a 20 20 20  >topAddr+1);.   
18c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18c50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
18c60 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  t, pIn->iCur, pI
18c70 6e 2d 3e 74 6f 70 41 64 64 72 29 3b 0a 20 20 20  n->topAddr);.   
18c80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18c90 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
18ca0 3e 74 6f 70 41 64 64 72 2d 31 29 3b 0a 20 20 20  >topAddr-1);.   
18cb0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18cc0 65 33 5f 66 72 65 65 28 70 4c 65 76 65 6c 2d 3e  e3_free(pLevel->
18cd0 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
18ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18cf0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
18d00 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
18d10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
18d20 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
18d30 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
18d40 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18d50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
18d60 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
18d70 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
18d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18d90 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
18da0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
18db0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
18dc0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
18dd0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
18de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18df0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
18e00 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
18e10 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
18e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18e30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
18e40 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29   0, pLevel->top)
18e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18e60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18e70 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
18e80 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
18e90 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
18ea0 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
18eb0 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
18ec0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
18ed0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
18ee0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18ef0 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
18f00 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
18f10 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
18f20 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
18f30 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
18f40 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
18f50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
18f60 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
18f70 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
18f80 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
18f90 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
18fa0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
18fb0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
18fc0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
18fd0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
18fe0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
18ff0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
19000 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
19010 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  ( pTab->isEphem 
19020 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
19030 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19040 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
19050 4f 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65 76  OnePass && (pLev
19060 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
19070 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
19080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19090 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
190a0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
190b0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  >iCursor);.    }
190c0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
190d0 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
190e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
190f0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
19100 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
19110 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
19120 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
19130 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
19140 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  e code substitut
19150 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
19160 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
19170 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65  e index in prefe
19180 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62  rence to the tab
19190 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74  le. Sometimes, t
191a0 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
191b0 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20   the table need 
191c0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72  never be read fr
191d0 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65  om. This is a pe
191e0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c  rformance boost,
191f0 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76  .    ** as the v
19200 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20  dbe level waits 
19210 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20  until the table 
19220 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61  is read before a
19230 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73  ctually.    ** s
19240 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eeking the table
19250 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72   cursor to the r
19260 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64  ecord correspond
19270 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
19280 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  nt.    ** positi
19290 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  on in the index.
192a0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
192b0 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
192c0 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
192d0 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
192e0 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
192f0 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
19300 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
19310 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
19320 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
19330 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
19340 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
19350 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
19360 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
19370 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
19380 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
19390 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
193a0 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
193b0 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
193c0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
193d0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
193e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
193f0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e  pIdx ){.      in
19400 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20  t k, j, last;.  
19410 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
19420 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
19430 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
19440 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65  x;.      int use
19450 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76  IndexOnly = pLev
19460 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
19470 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20  E_IDX_ONLY;..   
19480 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
19490 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
194a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
194b0 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
194c0 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
194d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
194e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
194f0 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
19500 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
19510 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
19520 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
19530 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
19540 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19550 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
19560 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
19570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
19580 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
19590 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
195a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
195b0 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
195c0 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
195d0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
195e0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
195f0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
19600 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
19620 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
19630 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
19640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
19650 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20  useIndexOnly || 
19660 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  j<pIdx->nColumn)
19670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
19680 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
19690 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
196a0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
196b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
196c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
196d0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
196e0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
196f0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
19700 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77  code==OP_NullRow
19710 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79   && useIndexOnly
19720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
19730 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
19740 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
19750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19760 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
19770 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
19780 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
19790 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.