/ Hex Artifact Content
Login

Artifact 4835f36ba01f663794b96131b81a1ca43ac239fa:


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 32 39 39   where.c,v 1.299
0340: 20 32 30 30 38 2f 30 34 2f 31 37 20 31 39 3a 31   2008/04/17 19:1
0350: 34 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a 2a  4:02 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 70 54 65 72  ;.      if( pTer
ac10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
ac20: 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _IN ) continue;.
ac30: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
ac40: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
ac50: 53 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  SNULL ) continue
ac60: 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ;.      nTerm++;
ac70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
ac80: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
ac90: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
aca0: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
acb0: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
acc0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
acd0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
ace0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
acf0: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
ad00: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
ad10: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
ad20: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
ad30: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
ad40: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
ad50: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
ad60: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
ad70: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ad80: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
ad90: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
ada0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
adb0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
adc0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
add0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
ade0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
adf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae00: 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d  if( i==pOrderBy-
ae10: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
ae20: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
ae30: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
ae40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ae50: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
ae60: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
ae70: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
ae80: 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66    */.    pIdxInf
ae90: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
aea0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
aeb0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
aec0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
aef0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
af00: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
af10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
af30: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
af40: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
af50: 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
af60: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o==0 ){.      sq
af70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
af80: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
af90: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65  mory");.      re
afa0: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a  turn 0.0;.    }.
afb0: 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
afc0: 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20   pIdxInfo;..    
afd0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
afe0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
aff0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
b000: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
b010: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d  ontains.    ** m
b020: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
b030: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
b040: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
b050: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
b060: 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20      ** changing 
b070: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
b080: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
b090: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
b0a0: 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69   to.    ** initi
b0b0: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
b0c0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
b0d0: 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
b0e0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
b0f0: 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
b100: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49  xInfo[1];.    pI
b110: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
b120: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b130: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
b140: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20  Cons[nTerm];.   
b150: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
b160: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
b170: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
b180: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
b190: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28  OrderBy];.    *(
b1a0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
b1b0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
b1c0: 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  erm;.    *(int*)
b1d0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
b1e0: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
b1f0: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
b200: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
b210: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
b220: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
b230: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a   pIdxCons;.    *
b240: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b250: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
b260: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
b270: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
b280: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
b290: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
b2a0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
b2b0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
b2c0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20      pUsage;..   
b320: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
b330: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
b340: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
b350: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
b360: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
b370: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
b380: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
b390: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
b3a0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
b3b0: 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
b3c0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
b3d0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
b3e0: 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
b3f0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
b400: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
b410: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  m->leftColumn;. 
b420: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
b430: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
b440: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
b450: 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e  [j].op = pTerm->
b460: 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20  eOperator;.     
b470: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
b480: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
b490: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
b4a0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
b4b0: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
b4c0: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
b4d0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b4e0: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
b4f0: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
b500: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
b510: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
b520: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
b530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b540: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
b550: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
b560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b570: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
b580: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b590: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
b5a0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
b5b0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b5c0: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
b5d0: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
b5e0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
b5f0: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
b600: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
b610: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
b620: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
b630: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
b640: 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
b650: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
b660: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73  ATCH );.      as
b670: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
b680: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
b690: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
b6a0: 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
b6b0: 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ) );.      j++;.
b6c0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
b6d0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
b6e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b6f0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
b700: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
b710: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
b720: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
b730: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
b740: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
b750: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
b760: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
b770: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
b780: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
b790: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
b7a0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
b7b0: 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
b7c0: 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
b7d0: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
b7e0: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
b7f0: 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
b800: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
b810: 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
b820: 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
b830: 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
b840: 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
b850: 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
b860: 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
b870: 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
b880: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
b890: 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
b8a0: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
b8b0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
b8c0: 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
b8d0: 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
b8e0: 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
b8f0: 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
b900: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
b910: 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
b920: 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
b930: 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
b940: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
b950: 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
b960: 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
b970: 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
b980: 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
b990: 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
b9a0: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
b9b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
b9c0: 2d 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30  ->pVtab );.#if 0
b9d0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74  .  if( pTab->pVt
b9e0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
b9f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ba00: 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20  rse, "undefined 
ba10: 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61  module %s for ta
ba20: 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ble %s",.       
ba30: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
ba40: 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61  rg[0], pTab->zNa
ba50: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
ba60: 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0.0;.  }.#endif.
ba70: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
ba80: 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
ba90: 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
baa0: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
bab0: 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
bac0: 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  les to zero..  *
bad0: 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69  *.  ** aConstrai
bae0: 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74  nt[].usable is t
baf0: 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  rue for constrai
bb00: 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69  nts where the ri
bb10: 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69  ght-hand.  ** si
bb20: 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
bb30: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
bb40: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
bb50: 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
bb60: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e  .  ** table.  In
bb70: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
bb80: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
bb90: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
bba0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
bbb0: 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70      column = exp
bbc0: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  r.  **.  ** and 
bbd0: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
bbe0: 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  g a join, then t
bbf0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  he constraint on
bc00: 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a   column is .  **
bc10: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
bc20: 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  ll tables refere
bc30: 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63  nced in expr occ
bc40: 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ur to the left. 
bc50: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
bc60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
bc70: 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  mn..  **.  ** Th
bc80: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
bc90: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
bca0: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
bcb0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
bcc0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
bcd0: 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
bce0: 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
bcf0: 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
bd00: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
bd10: 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74  h we might try t
bd20: 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20  o pick the best 
bd30: 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74  index multiple t
bd40: 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  imes..  ** For e
bd50: 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70  ach attempt at p
bd60: 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c  icking an index,
bd70: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61   the order of ta
bd80: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
bd90: 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64   join might be d
bda0: 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68  ifferent so we h
bdb0: 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  ave to recompute
bdc0: 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
bdd0: 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e  .  ** each time.
bde0: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
bdf0: 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
be00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
be10: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
be20: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
be30: 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
be40: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
be50: 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sage;.  for(i=0;
be60: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
be70: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
be80: 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
be90: 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
bea0: 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  ermOffset;.    p
beb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
bec0: 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
bed0: 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72  >usable =  (pTer
bee0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
bef0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20   notReady)==0;. 
bf00: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61   }.  memset(pUsa
bf10: 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
bf20: 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
bf30: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
bf40: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
bf50: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
bf60: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
bf70: 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
bf80: 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70  idxStr);.  }.  p
bf90: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
bfa0: 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
bfb0: 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
bfc0: 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
bfd0: 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
bfe0: 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
bff0: 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
c000: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
c010: 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
c020: 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30  TE_BIG_DBL / 2.0
c030: 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
c040: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
c050: 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  y;.  if( pIdxInf
c060: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21  o->nOrderBy && !
c070: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b  orderByUsable ){
c080: 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  .    *(int*)&pId
c090: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
c0a0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69  = 0;.  }..  (voi
c0b0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
c0c0: 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ff(pParse->db);.
c0d0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
c0e0: 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
c0f0: 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
c100: 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
c110: 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  INPUTS(pIdxInfo)
c120: 3b 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70  ;.  rc = pTab->p
c130: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
c140: 42 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e  BestIndex(pTab->
c150: 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29  pVtab, pIdxInfo)
c160: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
c170: 54 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b  TPUTS(pIdxInfo);
c180: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
c190: 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d  SafetyOn(pParse-
c1a0: 3e 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  >db);..  for(i=0
c1b0: 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
c1c0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
c1d0: 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 49 6e  .    if( !pIdxIn
c1e0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
c1f0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73  i].usable && pUs
c200: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
c210: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
c220: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c230: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
c240: 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
c250: 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
c260: 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
c270: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
c280: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
c290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
c2a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c2b0: 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
c2c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
c2d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
c2e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  ;.    }else {.  
c300: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c310: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
c320: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
c330: 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rc));.    }.  }.
c340: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
c350: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
c360: 4f 72 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75  OrderBy;..  retu
c370: 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  rn pIdxInfo->est
c380: 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65  imatedCost;.}.#e
c390: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c3a0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
c3b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20   */../*.** Find 
c3c0: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
c3d0: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
c3e0: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
c3f0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
c400: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64  er.** to the ind
c410: 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64  ex, flags that d
c420: 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20  escribe how the 
c430: 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
c440: 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d  used, the.** num
c450: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
c460: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64  constraints, and
c470: 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20   the "cost" for 
c480: 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  this index..**.*
c490: 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
c4a0: 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54  t index wins.  T
c4b0: 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
c4c0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
c4d0: 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
c4e0: 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
c4f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
c500: 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68  request using th
c510: 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  e selected index
c520: 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
c530: 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
c540: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
c550: 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
c560: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
c570: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
c580: 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
c590: 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
c5a0: 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
c5b0: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
c5c0: 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
c5d0: 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
c5e0: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
c5f0: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
c600: 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
c610: 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
c620: 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
c630: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
c640: 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  e..**.*/.static 
c650: 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78  double bestIndex
c660: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c670: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c680: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
c690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
c6a0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
c6b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
c6c0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
c6d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
c6e0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
c6f0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c700: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
c710: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
c720: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
c730: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
c740: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
c750: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
c760: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
c770: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
c780: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
c790: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70  e */.  Index **p
c7a0: 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  pIndex,         
c7b0: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e     /* Make *ppIn
c7c0: 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  dex point to the
c7d0: 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20   best index */. 
c7e0: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c800: 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69  Put flags descri
c810: 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65  bing this choice
c820: 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20   in *pFlags */. 
c830: 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20   int *pnEq      
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c850: 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Put the number o
c860: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
c870: 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29  raints here */.)
c880: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
c890: 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62  Term;.  Index *b
c8a0: 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20  estIdx = 0;     
c8b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61      /* Index tha
c8c0: 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65  t gives the lowe
c8d0: 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75  st cost */.  dou
c8e0: 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20  ble lowestCost; 
c8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c900: 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65  cost of using be
c910: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
c920: 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
c930: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
c940: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c950: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
c960: 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
c970: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
c980: 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a   value for nEq *
c990: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
c9a0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
c9b0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
c9c0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
c9d0: 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
c9e0: 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
c9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
ca00: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
ca10: 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  aluating */.  in
ca20: 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
ca30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ca40: 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
ca50: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
ca60: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ca80: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
ca90: 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20  with pProbe */. 
caa0: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cac0: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
cad0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
cae0: 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
caf0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
cb00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64  /* Mask of valid
cb10: 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
cb20: 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ors */.  double 
cb30: 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
cb40: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
cb50: 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
cb60: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
cb70: 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25  bestIndex: tbl=%
cb80: 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22  s notReady=%x\n"
cb90: 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
cba0: 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b  ame, notReady));
cbb0: 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  .  lowestCost = 
cbc0: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
cbd0: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
cbe0: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a  >pTab->pIndex;..
cbf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
cc00: 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  e has no indices
cc10: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
cc20: 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  o terms in the w
cc30: 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65  here.  ** clause
cc40: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
cc50: 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77  he ROWID, then w
cc60: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
cc70: 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20  able to do.  ** 
cc80: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
cc90: 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65  han a full table
cca0: 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61   scan on this ta
ccb0: 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61  ble.  We might a
ccc0: 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20  s.  ** well put 
ccd0: 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20  it first in the 
cce0: 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61  join order.  Tha
ccf0: 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69  t way, perhaps i
cd00: 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65  t can be.  ** re
cd10: 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65  ferenced by othe
cd20: 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  r tables in the 
cd30: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
cd40: 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20   pProbe==0 &&.  
cd50: 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c     findTerm(pWC,
cd60: 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
cd70: 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c  _EQ|WO_IN|WO_LT|
cd80: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
cd90: 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  E,0)==0 &&.     
cda0: 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  (pOrderBy==0 || 
cdb0: 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64  !sortableByRowid
cdc0: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
cdd0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20   pWC->pMaskSet, 
cde0: 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70  &rev)) ){.    *p
cdf0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a  Flags = 0;.    *
ce00: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
ce10: 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20   *pnEq = 0;.    
ce20: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a  return 0.0;.  }.
ce30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
ce40: 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  a rowid=EXPR or 
ce50: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63  rowid IN (...) c
ce60: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
ce70: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
ce80: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
ce90: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
cea0: 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69  Q|WO_IN, 0);.  i
ceb0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
cec0: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
ced0: 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20   *ppIndex = 0;. 
cee0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57     bestFlags = W
cef0: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20  HERE_ROWID_EQ;. 
cf00: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
cf10: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
cf20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ){.      /* Rowi
cf30: 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68  d== is always th
cf40: 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f  e best pick.  Lo
cf50: 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20  ok no further.  
cf60: 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20  Because only.   
cf70: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72     ** a single r
cf80: 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c  ow is generated,
cf90: 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61 79   output is alway
cfa0: 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
cfb0: 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61  r */.      *pFla
cfc0: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
cfd0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51  _EQ | WHERE_UNIQ
cfe0: 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20  UE;.      *pnEq 
cff0: 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 1;.      WHERE
d000: 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74  TRACE(("... best
d010: 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a   is rowid\n"));.
d020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30        return 0.0
d030: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d040: 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  (pExpr = pTerm->
d050: 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30  pExpr)->pList!=0
d060: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
d070: 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f  id IN (LIST): co
d080: 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72  st is NlogN wher
d090: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
d0a0: 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20  r of list.      
d0b0: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f  ** elements.  */
d0c0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
d0d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
d0e0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 6c  ->nExpr;.      l
d0f0: 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73 74  owestCost *= est
d100: 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b  Log(lowestCost);
d110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d120: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53    /* Rowid IN (S
d130: 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20  ELECT): cost is 
d140: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
d150: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d160: 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ows.      ** in 
d170: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
d180: 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20  e inner select. 
d190: 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20   We have no way 
d1a0: 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20  to estimate.    
d1b0: 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20    ** that value 
d1c0: 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67  so make a wild g
d1d0: 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c  uess. */.      l
d1e0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30 3b  owestCost = 200;
d1f0: 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
d200: 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69  TRACE(("... rowi
d210: 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c  d IN cost: %.9g\
d220: 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29  n", lowestCost))
d230: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69  ;.  }..  /* Esti
d240: 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  mate the cost of
d250: 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20   a table scan.  
d260: 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  If we do not kno
d270: 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20  w how many.  ** 
d280: 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 74  entries are in t
d290: 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20  he table, use 1 
d2a0: 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65  million as a gue
d2b0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20  ss..  */.  cost 
d2c0: 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62  = pProbe ? pProb
d2d0: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a  e->aiRowEst[0] :
d2e0: 20 31 30 30 30 30 30 30 3b 0a 20 20 57 48 45 52   1000000;.  WHER
d2f0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62  ETRACE(("... tab
d300: 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73  le scan base cos
d310: 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  t: %.9g\n", cost
d320: 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48  ));.  flags = WH
d330: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
d340: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
d350: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
d360: 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64  a range of rowid
d370: 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61  s in a table sca
d380: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20  n..  */.  pTerm 
d390: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
d3a0: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
d3b0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
d3c0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
d3d0: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
d3e0: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
d3f0: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
d400: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
d410: 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_LE, 0) ){.   
d420: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d430: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
d440: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
d450: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
d460: 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id<EXPR eliminat
d470: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72  es two-thirds or
d480: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
d490: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
d4a0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
d4b0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
d4c0: 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_GE, 0) ){.    
d4d0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d4e0: 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
d4f0: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
d500: 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
d510: 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d>EXPR eliminate
d520: 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20  s two-thirds of 
d530: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rows */.    }.  
d540: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
d550: 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72  .. rowid range r
d560: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
d570: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
d580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
d590: 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gs = 0;.  }..  /
d5a0: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73  * If the table s
d5b0: 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  can does not sat
d5c0: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
d5d0: 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61  Y clause, increa
d5e0: 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74  se.  ** the cost
d5f0: 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76   by NlogN to cov
d600: 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f  er the expense o
d610: 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  f sorting. */.  
d620: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
d630: 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
d640: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
d650: 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61  rderBy, pWC->pMa
d660: 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a  skSet, &rev) ){.
d670: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d680: 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45  HERE_ORDERBY|WHE
d690: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a  RE_ROWID_RANGE;.
d6a0: 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
d6b0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
d6c0: 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d6e0: 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b  se{.      cost +
d6f0: 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
d700: 73 74 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45  st);.      WHERE
d710: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
d720: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f  ing increases co
d730: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
d740: 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ost));.    }.  }
d750: 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65  .  if( cost<lowe
d760: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f  stCost ){.    lo
d770: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
d780: 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d  .    bestFlags =
d790: 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f   flags;.  }..  /
d7a0: 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
d7b0: 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
d7c0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
d7d0: 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
d7e0: 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
d7f0: 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
d800: 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
d810: 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
d820: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
d830: 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
d840: 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
d850: 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
d860: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
d870: 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
d880: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
d890: 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
d8a0: 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
d8b0: 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
d8c0: 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
d8d0: 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
d8e0: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
d8f0: 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  {.    eqTermMask
d900: 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
d910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54    }else{.    eqT
d920: 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
d930: 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
d940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
d950: 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20  at each index.. 
d960: 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f   */.  for(; pPro
d970: 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
d980: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
d990: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d9b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d9c0: 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74     double inMult
d9d0: 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20  iplier = 1;..   
d9e0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
d9f0: 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
da00: 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
da10: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
da20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
da30: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
da40: 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
da50: 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
da60: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
da70: 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  s or x IN (...) 
da80: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
da90: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
daa0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
dab0: 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
dac0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
dad0: 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
dae0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
daf0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
db00: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
db10: 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72   notReady, eqTer
db20: 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  mMask, pProbe);.
db30: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
db40: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
db50: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
db60: 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
db70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
db80: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
db90: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
dba0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
dbb0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c  Expr;.        fl
dbc0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
dbd0: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
dbe0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
dbf0: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
dc00: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
dc10: 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d  *= 25;.        }
dc20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
dc30: 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  pList!=0 ){.    
dc40: 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69        inMultipli
dc50: 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69  er *= pExpr->pLi
dc60: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20  st->nExpr + 1;. 
dc70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dc80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20  .    }.    cost 
dc90: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  = pProbe->aiRowE
dca0: 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70  st[i] * inMultip
dcb0: 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e  lier * estLog(in
dcc0: 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20  Multiplier);.   
dcd0: 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66   nEq = i;.    if
dce0: 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  ( pProbe->onErro
dcf0: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66  r!=OE_None && (f
dd00: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
dd10: 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20  UMN_IN)==0.     
dd20: 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f      && nEq==pPro
dd30: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
dd40: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
dd50: 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
dd60: 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  }.    WHERETRACE
dd70: 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64  (("...... nEq=%d
dd80: 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73   inMult=%.9g cos
dd90: 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e  t=%.9g\n",nEq,in
dda0: 4d 75 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74 29  Multiplier,cost)
ddb0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  );..    /* Look 
ddc0: 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  for range constr
ddd0: 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20  aints.    */.   
dde0: 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d   if( nEq<pProbe-
ddf0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
de00: 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
de10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
de20: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
de30: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
de40: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
de50: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
de60: 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
de70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
de80: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  m ){.        fla
de90: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
dea0: 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  MN_RANGE;.      
deb0: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
dec0: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
ded0: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
dee0: 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  LE, pProbe) ){. 
def0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
df00: 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
df10: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
df20: 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
df30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  }.        if( fi
df40: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
df50: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
df60: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f  O_GT|WO_GE, pPro
df70: 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
df80: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
df90: 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
dfa0: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a       cost /= 3;.
dfb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dfc0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
dfd0: 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75  ..... range redu
dfe0: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
dff0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
e000: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e010: 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69 74  /* Add the addit
e020: 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f  ional cost of so
e030: 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69 73  rting if that is
e040: 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a   a factor..    *
e050: 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
e060: 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
e070: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
e080: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a  OLUMN_IN)==0 &&.
e090: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72             isSor
e0a0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
e0b0: 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70  ,pWC->pMaskSet,p
e0c0: 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65  Probe,iCur,pOrde
e0d0: 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b  rBy,nEq,&rev) ){
e0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
e0f0: 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  gs==0 ){.       
e100: 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
e110: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
e120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e130: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
e140: 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20  ORDERBY;.       
e150: 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20   if( rev ){.    
e160: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
e170: 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
e180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73  lse{.        cos
e1a0: 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67  t += cost*estLog
e1b0: 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  (cost);.        
e1c0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
e1d0: 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72  ... orderby incr
e1e0: 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  eases cost to %.
e1f0: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
e200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e210: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e220: 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20  e if we can get 
e230: 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20  away with using 
e240: 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77  just the index w
e250: 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76  ithout.    ** ev
e260: 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74  er reading the t
e270: 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69  able.  If that i
e280: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
e290: 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a   halve the.    *
e2a0: 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69  * cost of this i
e2b0: 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
e2c0: 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 70 53   if( flags && pS
e2d0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28  rc->colUsed < ((
e2e0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
e2f0: 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42  S-1)) ){.      B
e300: 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d  itmask m = pSrc-
e310: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
e320: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
e330: 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e  (j=0; j<pProbe->
e340: 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
e350: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
e360: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
e370: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
e380: 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20  x<BMS-1 ){.     
e390: 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69       m &= ~(((Bi
e3a0: 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20  tmask)1)<<x);.  
e3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e3c0: 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29        if( m==0 )
e3d0: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
e3e0: 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
e3f0: 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  Y;.        cost 
e400: 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 57 48  /= 2;.        WH
e410: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
e420: 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63  . idx-only reduc
e430: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
e440: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
e450: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e460: 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
e470: 68 61 73 20 61 63 68 69 65 76 65 64 20 74 68 65  has achieved the
e480: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20   lowest cost so 
e490: 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74  far, then use it
e4a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e4b0: 20 66 6c 61 67 73 20 26 26 20 63 6f 73 74 20 3c   flags && cost <
e4c0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20   lowestCost ){. 
e4d0: 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20 70       bestIdx = p
e4e0: 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77  Probe;.      low
e4f0: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
e500: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
e510: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62  = flags;.      b
e520: 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  estNEq = nEq;.  
e530: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
e540: 70 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65  port the best re
e550: 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49  sult.  */.  *ppI
e560: 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a  ndex = bestIdx;.
e570: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
e580: 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c  est index is %s,
e590: 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67   cost=%.9g, flag
e5a0: 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c  s=%x, nEq=%d\n",
e5b0: 0a 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78  .        bestIdx
e5c0: 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d   ? bestIdx->zNam
e5d0: 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f  e : "(none)", lo
e5e0: 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c  westCost, bestFl
e5f0: 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a  ags, bestNEq));.
e600: 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74    *pFlags = best
e610: 46 6c 61 67 73 20 7c 20 65 71 54 65 72 6d 4d 61  Flags | eqTermMa
e620: 73 6b 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65  sk;.  *pnEq = be
e630: 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20  stNEq;.  return 
e640: 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a  lowestCost;.}...
e650: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
e660: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
e670: 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
e680: 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
e690: 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
e6a0: 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
e6b0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
e6c0: 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
e6d0: 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
e6e0: 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
e6f0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
e700: 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
e710: 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
e720: 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
e730: 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
e740: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
e750: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
e760: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
e770: 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
e780: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
e790: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e7a0: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
e7b0: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
e7c0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
e7d0: 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
e7e0: 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
e7f0: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
e800: 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
e810: 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
e820: 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
e830: 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
e840: 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
e850: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
e860: 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
e870: 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
e880: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
e890: 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
e8a0: 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
e8b0: 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
e8c0: 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
e8d0: 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
e8e0: 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
e8f0: 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
e900: 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
e910: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
e920: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
e930: 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
e940: 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
e950: 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
e960: 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
e970: 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
e980: 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
e990: 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
e9a0: 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
e9b0: 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
e9c0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
e9d0: 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
e9e0: 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
e9f0: 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
ea00: 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
ea10: 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
ea20: 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
ea30: 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
ea40: 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
ea50: 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
ea60: 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
ea70: 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
ea80: 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
ea90: 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
eaa0: 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
eab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
eac0: 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
ead0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
eae0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
eaf0: 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
eb00: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c     && (pTerm->fl
eb10: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
eb20: 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70  )==0.      && (p
eb30: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
eb40: 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
eb50: 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
eb60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
eb70: 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  )).  ){.    pTer
eb80: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
eb90: 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20  _CODED;.    if( 
eba0: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d  pTerm->iParent>=
ebb0: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
ebc0: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
ebd0: 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
ebe0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
ebf0: 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68       if( (--pOth
ec00: 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29  er->nChild)==0 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
ec20: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f  eTerm(pLevel, pO
ec30: 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ther);.      }. 
ec40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ec50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ec60: 74 68 61 74 20 62 75 69 6c 64 73 20 61 20 70 72  that builds a pr
ec70: 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  obe for an index
ec80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68  ..**.** There sh
ec90: 6f 75 6c 64 20 62 65 20 6e 43 6f 6c 75 6d 6e 20  ould be nColumn 
eca0: 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 73 74  values on the st
ecb0: 61 63 6b 2e 20 20 54 68 65 20 69 6e 64 65 78 0a  ack.  The index.
ecc0: 2a 2a 20 74 6f 20 62 65 20 70 72 6f 62 65 64 20  ** to be probed 
ecd0: 69 73 20 70 49 64 78 2e 20 20 50 6f 70 20 74 68  is pIdx.  Pop th
ece0: 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  e values from th
ecf0: 65 20 73 74 61 63 6b 20 61 6e 64 0a 2a 2a 20 72  e stack and.** r
ed00: 65 70 6c 61 63 65 20 74 68 65 6d 20 61 6c 6c 20  eplace them all 
ed10: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72 65  with a single re
ed20: 63 6f 72 64 20 74 68 61 74 20 69 73 20 74 68 65  cord that is the
ed30: 20 69 6e 64 65 78 0a 2a 2a 20 70 72 6f 62 6c 65   index.** proble
ed40: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
ed50: 64 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62  d buildIndexProb
ed60: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ed70: 73 65 2c 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se,  /* Parsing 
ed80: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
ed90: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
eda0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
edb0: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
edc0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 63 68 65  f columns to che
edd0: 63 6b 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ck for NULL */. 
ede0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
edf0: 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20 77   /* Index that w
ee00: 65 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  e will be search
ee10: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ing */.  int reg
ee20: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 6b 65  Src,     /* Take
ee30: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 69   values from thi
ee40: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
ee50: 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
ee60: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
ee70: 75 6c 74 20 69 6e 74 6f 20 74 68 69 73 20 72 65  ult into this re
ee80: 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 56  gister */.){.  V
ee90: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
eea0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
eeb0: 28 20 72 65 67 53 72 63 3e 30 20 29 3b 0a 20 20  ( regSrc>0 );.  
eec0: 61 73 73 65 72 74 28 20 72 65 67 44 65 73 74 3e  assert( regDest>
eed0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  0 );.  assert( v
eee0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
eef0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ef00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
ef10: 53 72 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  Src, nColumn, re
ef20: 67 44 65 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  gDest);.  sqlite
ef30: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
ef40: 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20 73 71  r(v, pIdx);.  sq
ef50: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
ef60: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ef70: 72 73 65 2c 20 72 65 67 53 72 63 2c 20 6e 43 6f  rse, regSrc, nCo
ef80: 6c 75 6d 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  lumn);.}.../*.**
ef90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
efa0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
efb0: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
efc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
efd0: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
efe0: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
eff0: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
f000: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
f010: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
f020: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
f030: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
f040: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
f050: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
f060: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
f070: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
f080: 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
f090: 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
f0a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
f0b0: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
f0c0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
f0d0: 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
f0e0: 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
f0f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
f100: 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
f110: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
f120: 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
f130: 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
f140: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
f150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
f160: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
f170: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
f190: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f1a0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f1b0: 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
f1c0: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
f1d0: 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
f1e0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
f1f0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68  l *pLevel, /* Wh
f200: 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  en level of the 
f210: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
f220: 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
f230: 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
f240: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
f250: 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
f260: 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
f270: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
f280: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
f290: 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
f2a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f2b0: 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2d0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
f2e0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 69   results */..  i
f2f0: 66 28 20 69 54 61 72 67 65 74 3c 3d 30 20 29 7b  f( iTarget<=0 ){
f300: 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
f310: 67 65 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  get = sqlite3Get
f320: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f330: 0a 20 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e 6f  .  }.  if( pX->o
f340: 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
f350: 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
f360: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
f370: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
f380: 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
f390: 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
f3a0: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
f3b0: 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
f3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f3d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
f3e0: 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
f3f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f400: 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
f410: 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
f420: 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
f430: 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
f440: 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
f450: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
f460: 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
f470: 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
f480: 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
f490: 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
f4a0: 70 58 2c 20 31 29 3b 0a 20 20 20 20 69 54 61 62  pX, 1);.    iTab
f4b0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
f4c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f4d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
f4e0: 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
f4f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f500: 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61   "%.*s", pX->spa
f510: 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29  n.n, pX->span.z)
f520: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
f530: 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  l->nIn==0 ){.   
f540: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d     pLevel->nxt =
f550: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
f560: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
f570: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b      pLevel->nIn+
f580: 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  +;.    pLevel->a
f590: 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  InLoop = sqlite3
f5a0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
f5b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
f5c0: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  el->aInLoop,.   
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
f600: 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
f610: 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  el->nIn);.    pI
f620: 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  n = pLevel->aInL
f630: 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
f640: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
f650: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20 31   pLevel->nIn - 1
f660: 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
f670: 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
f680: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
f690: 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
f6a0: 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64       pIn->topAdd
f6b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f6c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
f6d0: 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
f6e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f6f0: 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64       pIn->topAdd
f700: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f710: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
f720: 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65  mn, iTab, 0, iRe
f730: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
f740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f750: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
f760: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
f770: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
f780: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nIn = 0;.    }
f790: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
f7a0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
f7b0: 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75  , pTerm);.  retu
f7c0: 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
f7d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f7e0: 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
f7f0: 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e  te all == and IN
f800: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
f810: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54   an.** index.  T
f820: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
f830: 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  l constraints ar
f840: 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  e left on the st
f850: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ack..**.** For e
f860: 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
f870: 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
f880: 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
f890: 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
f8a0: 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
f8b0: 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
f8c0: 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
f8d0: 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
f8e0: 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
f8f0: 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
f900: 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
f910: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
f920: 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
f930: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
f940: 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
f950: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
f960: 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
f970: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
f980: 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
f990: 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
f9a0: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
f9b0: 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
f9c0: 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
f9d0: 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
f9e0: 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
f9f0: 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f  ill be left.** o
fa00: 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20  n the stack - a 
fa10: 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20 61  is the deepest a
fa20: 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77  nd b the shallow
fa30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  est..**.** In th
fa40: 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
fa50: 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
fa60: 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
fa70: 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
fa80: 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
fa90: 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
faa0: 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
fab0: 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
fac0: 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
fad0: 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
fae0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
faf0: 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
fb00: 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  y cell..**.** Th
fb10: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
fb20: 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
fb30: 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
fb40: 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a  cell and puts.**
fb50: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
fb60: 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
fb70: 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d   in pLevel->iMem
fb80: 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  .  The code that
fb90: 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
fba0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
fbb0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20  pLevel->iMem to 
fbc0: 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e  store the termin
fbd0: 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c  ation.** key val
fbe0: 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
fbf0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
fc00: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
fc10: 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
fc20: 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
fc30: 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
fc40: 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
fc50: 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
fc60: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  ** use..*/.stati
fc70: 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
fc80: 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
fc90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
fca0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
fcb0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
fcc0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
fcd0: 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
fce0: 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
fcf0: 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
fd00: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
fd10: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
fd20: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
fd30: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
fd40: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
fd50: 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
fd60: 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
fd70: 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
fd80: 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20 20 20  nt nExtraReg    
fd90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fda0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
fdb0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
fdc0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
fdd0: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20  pLevel->nEq;    
fde0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
fdf0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
fe00: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
fe10: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
fe20: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
fe30: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
fe40: 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
fe50: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
fe60: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
fe70: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20  = pLevel->pIdx; 
fe80: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
fe90: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
fea0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
feb0: 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
fec0: 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
fed0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
fee0: 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
fef0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
ff00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
ff10: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
ff20: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ff50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
ff60: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
ff70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
ff80: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
ff90: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
ffa0: 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
ffb0: 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
ffc0: 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
ffd0: 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61   them..  ** We a
ffe0: 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65  lways need at le
fff0: 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20  ast one used to 
10000 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74  store the loop t
10010 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76  erminator.  ** v
10020 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65 20  alue.  If there 
10030 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  are IN operators
10040 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20   we'll need one 
10050 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20  for each == or. 
10060 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   ** IN constrain
10070 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c  t..  */.  pLevel
10080 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
10090 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 72 65 67  >nMem + 1;.  reg
100a0 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
100b0 4d 65 6d 20 2b 20 32 3b 0a 20 20 70 50 61 72 73  Mem + 2;.  pPars
100c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65  e->nMem += pLeve
100d0 6c 2d 3e 6e 45 71 20 2b 20 32 20 2b 20 6e 45 78  l->nEq + 2 + nEx
100e0 74 72 61 52 65 67 3b 0a 0a 20 20 2f 2a 20 45 76  traReg;..  /* Ev
100f0 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
10100 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
10110 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10120 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45  Idx->nColumn>=nE
10130 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  q );.  for(j=0; 
10140 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
10150 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74   int r1;.    int
10160 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
10170 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72  umn[j];.    pTer
10180 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
10190 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
101a0 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ady, pLevel->fla
101b0 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  gs, pIdx);.    i
101c0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
101d0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
101e0 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
101f0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
10200 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
10210 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
10220 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
10230 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  el, regBase+j);.
10240 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
10250 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 73  ase+j ){.      s
10260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10270 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
10280 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
10290 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 65    }.    if( (pTe
102a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
102b0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
102c0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))==0 ){.      s
102d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
102e0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
102f0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
10300 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  ->brk);.    }.  
10310 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  }.  return regBa
10320 73 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  se;.}..#if defin
10330 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
10340 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
10350 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
10360 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
10370 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
10380 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
10390 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
103a0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
103b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
103c0 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
103d0 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
103e0 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
103f0 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
10400 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
10410 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
10420 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
10430 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
10440 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
10450 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
10460 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
10470 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
10480 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
10490 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
104a0 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
104b0 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
104c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
104d0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   */.../*.** Free
104e0 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
104f0 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
10500 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
10510 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ree(WhereInfo *p
10520 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57  WInfo){.  if( pW
10530 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  Info ){.    int 
10540 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10550 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
10560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
10570 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10580 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f   *pInfo = pWInfo
10590 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[i].pIdxInfo;
105a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
105b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
105c0 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  rt( pInfo->needT
105d0 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29  oFreeIdxStr==0 )
105e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
105f0 33 5f 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20  3_free(pInfo);. 
10600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57   sqlite3_free(pW
10620 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Info);.  }.}.../
10630 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
10640 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
10650 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
10660 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
10670 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
10680 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
10690 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
106a0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
106b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
106c0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
106d0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
106e0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
106f0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
10700 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
10710 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
10720 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
10730 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10740 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
10750 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
10760 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
10770 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
10780 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
10790 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
107a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
107b0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
107c0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
107d0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
107e0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
107f0 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
10800 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
10810 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
10820 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
10830 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
10840 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
10850 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
10860 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
10870 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
10880 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
10890 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
108a0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
108b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
108c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
108d0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
108e0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
108f0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
10900 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
10910 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
10920 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
10930 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
10940 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
10950 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
10960 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
10970 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
10980 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
10990 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
109a0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
109b0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
109c0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
109d0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
109e0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
109f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
10a00 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
10a10 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
10a40 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
10a50 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
10a80 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
10a90 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
10aa0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
10ab0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
10ac0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
10ad0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
10ae0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
10af0 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
10b00 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
10b10 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
10b20 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
10b30 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
10b40 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
10b50 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
10b60 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
10b70 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
10b80 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
10b90 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
10ba0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
10bb0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
10bc0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
10bd0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
10be0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
10bf0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
10c00 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
10c10 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
10c20 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
10c30 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
10c40 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
10c50 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
10c60 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
10c70 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
10c80 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
10c90 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
10ca0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
10cb0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
10cc0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
10cd0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
10ce0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
10cf0 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
10d00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10d10 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
10d20 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
10d30 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
10d40 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
10d50 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
10d60 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
10d70 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
10d80 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
10d90 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
10da0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
10db0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
10dc0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
10dd0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
10de0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
10df0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
10e00 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
10e10 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
10e20 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
10e30 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
10e40 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
10e50 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
10e60 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
10e70 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
10e80 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
10e90 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
10ea0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
10eb0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
10ec0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
10ed0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
10ee0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
10ef0 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
10f00 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
10f10 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
10f20 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
10f30 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
10f40 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
10f50 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
10f60 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
10f70 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
10f80 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
10f90 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
10fa0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
10fb0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
10fc0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
10fd0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
10fe0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
10ff0 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
11000 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
11010 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
11020 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
11030 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
11040 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
11050 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
11060 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
11070 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
11080 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
11090 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
110a0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
110b0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
110c0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
110d0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
110e0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
110f0 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
11100 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
11110 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
11120 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
11130 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
11140 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
11150 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
11160 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
11170 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
11180 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
11190 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
111a0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
111b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
111c0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
111d0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
111e0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
111f0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
11200 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
11210 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
11220 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
11230 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
11240 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
11250 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
11260 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
11270 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
11280 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
11290 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
112a0 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
112b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
112c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
112d0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
112e0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
112f0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
11300 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
11310 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
11320 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
11330 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
11340 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
11350 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
11360 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
11370 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
11380 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
11390 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
113a0 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
113b0 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
113c0 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
113d0 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
113e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
113f0 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
11400 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
11410 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
11420 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
11430 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
11440 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
11450 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
11460 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
11470 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
11480 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
11490 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
114a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
114b0 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
114c0 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
114d0 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
114e0 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
114f0 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
11500 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
11510 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
11520 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
11530 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
11540 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
11550 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
11560 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11570 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
11580 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
11590 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
115a0 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
115b0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
115c0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
115d0 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
115e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
115f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
11600 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
11610 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By, /* An ORDER 
11620 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
11630 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61 67  LL */.  u8 wflag
11640 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
11650 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
11660 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
11670 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
11680 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116b0 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
116c0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
116d0 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
116e0 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
116f0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
11700 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
11710 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11720 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
11730 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
11740 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
11750 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
11760 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
11770 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
11780 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
11790 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
117a0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
117b0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
117c0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
117d0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
117e0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
117f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11800 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
11810 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
11820 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
11830 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
11840 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
11850 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
11860 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
11870 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11880 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
11890 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
118a0 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
118b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
118c0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
118d0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
118e0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
118f0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
11900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11910 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
11920 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
11930 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
11940 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11950 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11960 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
11970 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
11980 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
11990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
119a0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
119b0 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
119c0 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
119d0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
119e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
119f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11a00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11a10 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11a20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
11a30 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
11a40 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
11a50 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
11a60 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
11a70 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
11a80 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
11a90 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
11aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11ab0 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
11ac0 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
11ad0 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
11ae0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11af0 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42 79  .  if( ppOrderBy
11b00 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
11b10 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20   = *ppOrderBy;. 
11b20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74   }..  /* Split t
11b30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11b40 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
11b50 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
11b60 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
11b70 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
11b80 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
11b90 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
11ba0 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26  .  initMaskSet(&
11bb0 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
11bc0 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c  eClauseInit(&wc,
11bd0 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65   pParse, &maskSe
11be0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
11bf0 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
11c00 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
11c10 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77 63    whereSplit(&wc
11c20 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
11c30 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c  );.    .  /* All
11c40 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
11c50 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
11c60 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
11c70 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
11c80 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
11c90 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  lue..  */.  db =
11ca0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
11cb0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
11cc0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11cd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11ce0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57          sizeof(W
11cf0 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62  hereInfo) + pTab
11d00 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f  List->nSrc*sizeo
11d10 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
11d20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11d30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
11d40 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
11d50 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  em;.  }.  pWInfo
11d60 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c  ->nLevel = pTabL
11d70 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49  ist->nSrc;.  pWI
11d80 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
11d90 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
11da0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
11db0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
11dc0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11dd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11de0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
11df0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
11e00 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
11e10 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
11e20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
11e30 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
11e40 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
11e50 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
11e60 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
11e70 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61  ( pWhere && (pTa
11e80 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c  bList->nSrc==0 |
11e90 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
11ea0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
11eb0 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
11ec0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
11ed0 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
11ee0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
11ef0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
11f00 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
11f10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11f20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
11f30 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
11f40 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
11f50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
11f60 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
11f70 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
11f80 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
11f90 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
11fa0 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
11fb0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
11fc0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
11fd0 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
11fe0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
11ff0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
12000 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
12010 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
12020 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
12030 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
12040 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
12050 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
12060 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
12070 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
12080 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
12090 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
120a0 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
120b0 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
120c0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
120d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
120e0 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
120f0 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
12100 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
12110 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
12120 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
12130 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
12140 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
12150 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
12160 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
12170 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
12180 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
12190 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
121a0 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
121b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
121c0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
121d0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74   i++){.    creat
121e0 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  eMask(&maskSet, 
121f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
12200 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
12210 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
12220 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
12230 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
12240 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
12250 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
12260 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
12270 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53  = getMask(&maskS
12280 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
12290 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
122a0 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
122b0 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
122c0 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
122d0 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
122e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
122f0 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
12300 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
12310 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
12320 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
12330 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
12340 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
12350 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
12360 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
12370 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
12380 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
12390 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
123a0 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
123b0 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
123c0 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
123d0 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
123e0 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
123f0 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
12400 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
12410 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
12420 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20  TabList, &wc);. 
12430 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12440 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
12450 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
12460 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
12470 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
12480 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
12490 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
124a0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
124b0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
124c0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
124d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
124e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
124f0 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
12500 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
12510 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
12520 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
12530 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12540 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
12550 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
12560 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
12570 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
12580 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
12590 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
125a0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
125b0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
125c0 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
125d0 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
125e0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
125f0 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
12600 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
12610 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
12620 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
12630 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
12640 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12650 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
12660 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
12670 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
12680 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
12690 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
126a0 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
126b0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
126c0 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
126d0 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
126e0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
126f0 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
12700 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
12710 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
12720 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
12730 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
12740 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
12750 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
12760 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
12770 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
12780 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
12790 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
127a0 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
127b0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
127c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
127d0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
127e0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
127f0 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
12800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12810 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64  lags asssociated
12820 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
12830 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12850 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
12860 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
12870 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  */.    double co
12880 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
12890 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66     /* The cost f
128a0 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
128b0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
128c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
128d0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
128e0 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
128f0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
12900 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
12910 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
12920 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
12930 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73     int bestFlags
12940 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
12950 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
12960 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
12970 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71  .    int bestNEq
12980 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12990 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74   /* nEq associat
129a0 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
129b0 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  .    double lowe
129c0 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
129d0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20   /* Cost of the 
129e0 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
129f0 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20   bestJ = 0;     
12a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12a10 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
12a20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a40 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
12a50 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
12a60 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
12a70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12a80 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69   /* True when fi
12a90 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65  rst table is see
12aa0 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  n */.    sqlite3
12ab0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
12ac0 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  dex; /* Current 
12ad0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f  virtual index */
12ae0 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  ..    lowestCost
12af0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
12b00 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  L;.    for(j=iFr
12b10 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
12b20 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
12b30 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
12b40 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
12b50 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f  {.      int doNo
12b60 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72  tReorder;  /* Tr
12b70 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ue if this table
12b80 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
12b90 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20  eordered */..   
12ba0 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
12bb0 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
12bc0 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
12bd0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
12be0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
12bf0 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
12c00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
12c10 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
12c20 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
12c30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
12c40 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
12c50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12c60 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
12c70 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
12c80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12c90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
12ca0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
12cb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12cc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12cd0 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
12ce0 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
12cf0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
12d00 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12d10 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
12d20 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
12d30 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
12d40 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
12d50 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
12d60 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
12d70 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
12da0 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
12db0 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
12de0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
12df0 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
12e00 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
12e10 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a        pIndex = *
12e20 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  ppIdxInfo;.     
12e30 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
12e40 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79   pIndex->orderBy
12e50 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
12e60 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
12e70 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
12e80 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   | WHERE_ORDERBY
12e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12ea0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
12eb0 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20        nEq = 0;. 
12ec0 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c 49         if( (SQLI
12ed0 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c  TE_BIG_DBL/2.0)<
12ee0 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  cost ){.        
12ef0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73    /* The cost is
12f00 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
12f10 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  be larger than S
12f20 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74  QLITE_BIG_DBL (t
12f30 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
12f40 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
12f50 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
12f60 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
12f70 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  s, then.        
12f80 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c    ** the (cost<l
12f90 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20  owestCost) test 
12fa0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72  below will never
12fb0 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20   be true and.   
12fc0 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c         ** pLevel
12fd0 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65 72  ->pBestIdx never
12fe0 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
12ff0 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  */ .          co
13000 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47  st = (SQLITE_BIG
13010 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20  _DBL/2.0);.     
13020 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
13030 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b   .#endif.      {
13040 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
13050 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
13060 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
13070 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
130a0 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
130b0 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20  erBy : 0,.      
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73     &pIdx, &flags
130e0 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  , &nEq);.       
130f0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
13100 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
13110 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
13120 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  {.        once =
13130 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   1;.        lowe
13140 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
13150 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
13160 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
13170 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
13180 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20          bestNEq 
13190 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62  = nEq;.        b
131a0 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
131b0 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49    pLevel->pBestI
131c0 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  dx = pIndex;.   
131d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
131e0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
131f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  eak;.    }.    W
13200 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
13210 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65  Optimizer choose
13220 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f   table %d for lo
13230 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c  op %d\n", bestJ,
13240 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76  .           pLev
13250 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a  el-pWInfo->a));.
13260 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c 61      if( (bestFla
13270 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
13280 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)!=0 ){.      
13290 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
132a0 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
132b0 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b  gs &= bestFlags;
132c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  .    pLevel->fla
132d0 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  gs = bestFlags;.
132e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78      pLevel->pIdx
132f0 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c   = pBest;.    pL
13300 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74  evel->nEq = best
13310 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  NEq;.    pLevel-
13320 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  >aInLoop = 0;.  
13330 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20    pLevel->nIn = 
13340 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73 74  0;.    if( pBest
13350 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
13360 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
13370 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
13380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
13390 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
133a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
133b0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
133c0 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
133d0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
133e0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
133f0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73  vel->iFrom = bes
13400 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54  tJ;.  }.  WHERET
13410 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
13420 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
13430 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  *\n"));..  /* If
13440 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
13450 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
13460 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
13470 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
13480 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
13490 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
134a0 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
134b0 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
134c0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
134d0 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
134e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
134f0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
13500 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
13510 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
13520 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
13530 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
13540 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
13550 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
13560 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
13570 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
13580 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
13590 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
135a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
135b0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
135c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
135d0 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
135e0 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
135f0 73 65 72 74 28 20 28 77 66 6c 61 67 73 20 26 20  sert( (wflags & 
13600 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
13610 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
13620 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
13630 3b 0a 20 20 69 66 28 20 28 77 66 6c 61 67 73 20  ;.  if( (wflags 
13640 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
13650 44 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28  DESIRED)!=0 && (
13660 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
13670 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20  _UNIQUE)!=0 ){. 
13680 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65     pWInfo->okOne
13690 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57  Pass = 1;.    pW
136a0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 66 6c 61 67 73  Info->a[0].flags
136b0 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
136c0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
136d0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
136e0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
136f0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
13700 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
13710 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
13720 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
13730 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
13740 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
13750 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
13760 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
13770 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72  er Goto */.  for
13780 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
13790 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
137a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
137b0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
137c0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
137d0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
137e0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
137f0 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  x;      /* Index
13800 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
13810 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f  pTab (if any) */
13820 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
13830 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13840 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
13850 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
13860 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  x */.    int iId
13870 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
13880 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66  IdxCur;..#ifndef
13890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
138a0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
138b0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
138c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
138d0 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
138e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
138f0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
13900 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
13910 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
13920 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13930 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c  (db, "TABLE %s",
13940 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
13950 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
13960 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
13970 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
13980 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
13990 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
139a0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
139b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
139c0 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
139d0 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
139e0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
139f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
13a00 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22  z WITH INDEX %s"
13a10 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61  , zMsg, pIx->zNa
13a20 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
13a30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
13a40 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
13a50 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
13a60 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
13a70 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
13a80 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
13a90 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
13aa0 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
13ab0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13ac0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13ad0 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20  ABLE.      else 
13ae0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
13af0 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  tIdx ){.        
13b00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13b10 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
13b20 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
13b30 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
13b40 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13b50 62 2c 20 22 25 7a 20 56 49 52 54 55 41 4c 20 54  b, "%z VIRTUAL T
13b60 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
13b70 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
13b90 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70  stIdx->idxNum, p
13ba0 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29  BestIdx->idxStr)
13bb0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13bc0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
13bd0 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
13be0 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
13bf0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
13c00 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
13c10 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  z ORDER BY", zMs
13c20 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
13c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c40 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
13c50 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  n, i, pLevel->iF
13c60 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  rom, 0, zMsg, P4
13c70 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
13c80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13c90 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
13ca0 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  /.    pTabItem =
13cb0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
13cc0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
13cd0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
13ce0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
13cf0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13d00 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
13d10 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13d20 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  a);.    if( pTab
13d30 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61  ->isEphem || pTa
13d40 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
13d50 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
13d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13d70 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
13d80 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13d90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
13da0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13db0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
13dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13dd0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
13de0 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54   (const char*)pT
13e10 61 62 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54  ab->pVtab, P4_VT
13e20 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  AB);.    }else.#
13e30 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
13e40 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
13e50 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
13e60 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
13e70 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
13e80 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
13e90 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
13ea0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
13eb0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
13ec0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
13ed0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
13ee0 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20   op);.      if( 
13ef0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
13f00 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
13f10 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  <(sizeof(Bitmask
13f20 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )*8) ){.        
13f30 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
13f40 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
13f50 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
13f60 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
13f70 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
13f80 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
13f90 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
13fa0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13fb0 65 6e 74 41 64 64 72 28 76 29 2d 32 2c 20 6e 29  entAddr(v)-2, n)
13fc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13fd0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
13fe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
14000 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
14010 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
14020 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
14030 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
14040 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
14050 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
14060 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
14070 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
14080 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b  x)!=0 ){.      K
14090 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
140a0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
140b0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
140c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140d0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
140e0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
140f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14100 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
14110 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 49  umColumns, 0, pI
14120 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20  x->nColumn+1);. 
14130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14140 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
14150 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
14160 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
14190 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
141a0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
141b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
141c0 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
141d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
141e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
141f0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
14200 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
14210 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
14220 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14230 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
14240 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
14250 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
14260 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
14270 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
14280 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
14290 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
142a0 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
142b0 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
142c0 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
142d0 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
142e0 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
142f0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
14300 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
14310 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
14320 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a  el++){.    int j
14330 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d  ;.    int iCur =
14340 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
14350 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45  or;  /* The VDBE
14360 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
14370 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64  table */.    Ind
14380 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
14390 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
143a0 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
143b0 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20 20  .    int nxt;   
143c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
143d0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
143e0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
143f0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
14400 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
14410 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
14420 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
14430 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
14440 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
14450 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
14460 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
14470 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76   */.    int bRev
14480 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
14490 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
144a0 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
144b0 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70   order */..    p
144c0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
144d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
144e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20  From];.    iCur 
144f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
14500 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  sor;.    pIdx = 
14510 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20  pLevel->pIdx;.  
14520 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
14530 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
14540 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
14550 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
14560 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20  EVERSE)!=0;.    
14570 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
14580 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
14590 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b  RE_IDX_ONLY)!=0;
145a0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
145b0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
145c0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
145d0 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
145e0 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ns.    ** for th
145f0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
14600 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20   Jump to brk to 
14610 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
14620 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70  oop..    ** Jump
14630 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
14640 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
14650 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
14660 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   of the.    ** l
14670 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop..    **.    
14680 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
14690 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
146a0 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
146b0 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  "nxt" label that
146c0 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  .    ** means to
146d0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
146e0 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
146f0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
14700 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  hen.    ** there
14710 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
14720 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
14730 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e 78  traints, the "nx
14740 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a 20  t" label.    ** 
14750 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
14760 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  brk"..    */.   
14770 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
14780 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74  rk = pLevel->nxt
14790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
147a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
147b0 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63  cont = pLevel->c
147c0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
147d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
147e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
147f0 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
14800 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
14810 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
14820 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74   and.    ** init
14830 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
14840 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
14850 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
14860 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20  matches any.    
14870 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
14880 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
14890 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  join..    */.   
148a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
148b0 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
148c0 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
148d0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
148e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65       pLevel->iLe
148f0 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
14900 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
14910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14920 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14930 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
14940 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
14950 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
14960 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
14970 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
14980 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
14990 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
149a0 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70  LTABLE.    if( p
149b0 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20  Level->pBestIdx 
149c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
149d0 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   0:  The table i
149e0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
149f0 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
14a00 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
14a10 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
14a20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
14a30 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ta..      */.   
14a40 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
14a50 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
14a60 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
14a70 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  Filter */.      
14a80 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14a90 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
14aa0 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
14ab0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  .      int nCons
14ac0 74 72 61 69 6e 74 20 3d 20 70 42 65 73 74 49 64  traint = pBestId
14ad0 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->nConstraint;.
14ae0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 71 6c        struct sql
14af0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14b00 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
14b10 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
14b50 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
14b60 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ge;.      const 
14b70 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14b80 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
14b90 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20  *aConstraint =. 
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73   pBestIdx->aCons
14be0 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 69  traint;..      i
14bf0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
14c00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
14c10 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
14c20 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ;.      for(j=1;
14c30 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   j<=nConstraint;
14c40 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
14c50 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt k;.        fo
14c60 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
14c70 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
14c80 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
14c90 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
14ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14cb0 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
14cc0 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
14cd0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
14ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
14cf0 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61  ode(pParse, wc.a
14d00 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70  [iTerm].pExpr->p
14d10 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29  Right, iReg+j+1)
14d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14d30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14d40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d50 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
14d60 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
14d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14d80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14d90 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42  , OP_Integer, pB
14da0 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
14db0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  iReg);.      sql
14dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14dd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
14de0 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
14df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e00 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
14e10 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69 52  r, iCur, brk, iR
14e20 65 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64  eg, pBestIdx->id
14e30 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
14e50 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  estIdx->needToFr
14e60 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
14e70 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
14e80 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
14e90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
14ea0 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
14eb0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
14ec0 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
14ed0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
14ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
14ef0 6a 3d 30 3b 20 6a 3c 70 42 65 73 74 49 64 78 2d  j=0; j<pBestIdx-
14f00 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  >nConstraint; j+
14f10 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
14f20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29  aUsage[j].omit )
14f30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
14f40 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
14f50 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  int[j].iTermOffs
14f60 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69  et;.          di
14f70 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
14f80 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29 3b  , &wc.a[iTerm]);
14f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14fa0 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
14fb0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
14fc0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
14fd0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
14fe0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
14ff0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15000 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  dr(v);.    }else
15010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15020 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15030 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  BLE */..    if( 
15040 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
15050 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
15060 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
15070 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
15080 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
15090 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
150a0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   an.      **    
150b0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
150c0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
150d0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
150e0 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20  d.  Or.      ** 
150f0 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
15100 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
15110 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
15120 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
15130 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
15140 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20  onstruct..      
15150 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  */.      int r1;
15160 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
15170 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
15180 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
15190 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
151a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
151b0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
151c0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
151d0 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
151e0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
151f0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
15200 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ur );.      asse
15210 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
15220 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 63   );.      r1 = c
15230 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
15240 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
15250 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20  Level, 0);.     
15260 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nxt = pLevel->n
15270 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
15280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15290 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
152a0 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   nxt);.      sql
152b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
152c0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
152d0 69 43 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a  iCur, nxt, r1);.
152e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
152f0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
15300 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
15310 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
15320 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
15330 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
15340 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
15350 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
15360 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
15370 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
15380 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
15390 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  D field..      *
153a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74  /.      int test
153b0 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
153c0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
153d0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
153e0 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
153f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
15400 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
15410 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
15420 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
15430 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15440 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
15450 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e        pEnd = fin
15460 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
15470 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15480 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
15490 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
154a0 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
154b0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
154c0 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
154d0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20  .        pEnd = 
154e0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
154f0 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
15500 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
15510 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
15520 20 72 31 2c 20 72 65 67 46 72 65 65 31 3b 0a 20   r1, regFree1;. 
15530 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61         pX = pSta
15540 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
15550 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
15560 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
15570 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
15580 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
15590 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
155a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
155b0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
155c0 67 68 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  ght, &regFree1);
155d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
155e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
155f0 5f 46 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20 62  _ForceInt, r1, b
15600 72 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rk, .           
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20    pX->op==TK_LE 
15630 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
15640 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15650 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15660 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74  bRev ? OP_MoveLt
15670 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43   : OP_MoveGe, iC
15680 75 72 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20  ur, brk, r1);.  
15690 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
156a0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
156b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
156c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
156d0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
156e0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
156f0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
15700 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
15710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15720 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
15730 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
15740 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
15750 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
15760 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
15770 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
15780 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
15790 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
157a0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
157b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
157c0 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43  ert( pEnd->leftC
157d0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
157e0 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
157f0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
15800 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
15810 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15820 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
15830 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b  , pLevel->iMem);
15840 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d  .        if( pX-
15850 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
15860 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
15870 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
15880 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
15890 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20   OP_Ge;.        
158a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
158b0 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
158c0 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
158d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
158e0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
158f0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
15900 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
15910 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15920 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15930 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
15940 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
15950 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
15960 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
15970 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
15980 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
15990 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
159a0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
159b0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
159c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
159d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
159e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
159f0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
15a00 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ur, r1);.       
15a10 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41   /* sqlite3VdbeA
15a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
15a30 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  y, pLevel->iMem,
15a40 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20   0); */.        
15a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a60 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c 65  3(v, testOp, pLe
15a70 76 65 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c 20  vel->iMem, brk, 
15a80 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
15a90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15aa0 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
15ab0 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
15ac0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
15ad0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15ae0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15af0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
15b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
15b10 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
15b20 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
15b30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
15b40 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
15b50 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
15b60 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
15b70 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
15b80 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
15b90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
15ba0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
15bb0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
15bc0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15bd0 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
15be0 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
15bf0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
15c00 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
15c10 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
15c20 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
15c30 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
15c40 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
15c50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15c60 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
15c70 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
15c80 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
15c90 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
15ca0 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
15cb0 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
15cc0 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
15cd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
15ce0 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
15cf0 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
15d00 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
15d10 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
15d20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
15d30 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
15d40 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
15d50 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
15d60 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15d70 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
15d80 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
15d90 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
15da0 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
15db0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
15dc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
15dd0 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
15de0 20 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b      int topEq=0;
15df0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15e00 69 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65  if top limit use
15e10 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73  s ==. False is s
15e20 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20  trictly < */.   
15e30 20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20     int btmEq=0; 
15e40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15e50 66 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73  f btm limit uses
15e60 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74   ==. False if st
15e70 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20  rictly > */.    
15e80 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d    int topOp, btm
15e90 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f  Op;   /* Operato
15ea0 72 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61  rs for the top a
15eb0 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68  nd bottom search
15ec0 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20   bounds */.     
15ed0 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20   int testOp;.   
15ee0 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20     int topLimit 
15ef0 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
15f00 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
15f10 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e  IT)!=0;.      in
15f20 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c  t btmLimit = (pL
15f30 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
15f40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
15f50 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  0;.      int isM
15f60 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
15f70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15f80 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
15f90 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 20 2a  ECT min(x) ... *
15fa0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 42  /.      int regB
15fb0 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ase;        /* B
15fc0 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
15fd0 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
15fe0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
15ff0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
16000 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
16010 73 74 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  ster */..      /
16020 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16030 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
16040 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
16050 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
16060 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76        ** and lev
16070 65 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  el the values of
16080 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20   those terms on 
16090 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20  the stack..     
160a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 67 42 61 73   */.      regBas
160b0 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
160c0 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
160d0 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f   pLevel, &wc, no
160e0 74 52 65 61 64 79 2c 20 32 29 3b 0a 0a 20 20 20  tReady, 2);..   
160f0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
16100 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e   what comparison
16110 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73   operators to us
16120 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f  e for top and bo
16130 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73  ttom .      ** s
16140 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f  earch bounds. Fo
16150 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  r an ascending i
16160 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d  ndex, the bottom
16170 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72   bound is a > or
16180 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65   >=.      ** ope
16190 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f  rator and the to
161a0 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f  p bound is a < o
161b0 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20  r <= operator.  
161c0 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67  For a descending
161d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  .      ** index 
161e0 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
161f0 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20  e reversed..    
16200 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16210 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
16220 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
16230 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ASC ){.        t
16240 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  opOp = WO_LT|WO_
16250 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f  LE;.        btmO
16260 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b  p = WO_GT|WO_GE;
16270 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16280 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f        topOp = WO
16290 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20  _GT|WO_GE;.     
162a0 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54     btmOp = WO_LT
162b0 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
162c0 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d  SWAP(int, topLim
162d0 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20  it, btmLimit);. 
162e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
162f0 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
16300 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
16310 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
16320 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
16330 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
16340 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
16350 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
16360 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
16370 20 2e 2e 2e 22 20 0a 20 20 20 20 20 20 2a 2a 20   ..." .      ** 
16380 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20  query, then the 
16390 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79  caller will only
163a0 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20   allow the loop 
163b0 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 20  to run for.     
163c0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
163d0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
163e0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
163f0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
16400 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e       ** should n
16410 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
16420 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
16430 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
16440 27 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ' is.      ** th
16450 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65  e first one afte
16460 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69  r the nEq equali
16470 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ty constraints i
16480 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20  n the index,.   
16490 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
164a0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
164b0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
164c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 77   */.      if( (w
164d0 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  flags&WHERE_ORDE
164e0 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
164f0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66     && (pLevel->f
16500 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
16510 42 59 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  BY).       && (p
16520 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71  Idx->nColumn>nEq
16530 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 4f 72  ).       && (pOr
16540 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
16550 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
16560 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
16570 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
16580 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
16590 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
165a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
165b0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79   termination key
165c0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
165d0 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20  ey value that.  
165e0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20      ** will end 
165f0 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65  the search.  The
16600 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61  re is no termina
16610 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72  tion key if ther
16620 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e  e.      ** are n
16630 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  o equality terms
16640 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20   and no "X<..." 
16650 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  term..      **. 
16660 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63       ** 2002-Dec
16670 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73  -04: On a revers
16680 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68  e-order scan, th
16690 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72  e so-called "ter
166a0 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20  mination".      
166b0 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20  ** key computed 
166c0 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73  here really ends
166d0 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73 74   up being the st
166e0 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a  art key..      *
166f0 2f 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c  /.      nxt = pL
16700 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20  evel->nxt;.     
16710 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b   if( topLimit ){
16720 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
16730 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  X;.        int k
16740 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
16750 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  n[nEq];.        
16760 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
16770 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
16780 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20  otReady, topOp, 
16790 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
167a0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
167b0 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
167c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
167d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
167e0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
167f0 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
16800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16810 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16820 70 58 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42  pX->pRight, regB
16830 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
16840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16850 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
16860 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e  , regBase+nEq, n
16870 78 74 29 3b 0a 20 20 20 20 20 20 20 20 74 6f 70  xt);.        top
16880 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Eq = pTerm->eOpe
16890 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
168a0 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64  O_GE);.        d
168b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
168c0 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  l, pTerm);.     
168d0 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49     testOp = OP_I
168e0 64 78 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dxGE;.      }els
168f0 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
16900 70 20 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49  p = nEq>0 ? OP_I
16910 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a  dxGE : OP_Noop;.
16920 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20          topEq = 
16930 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
16940 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
16950 4e 6f 6f 70 20 7c 7c 20 28 69 73 4d 69 6e 51 75  Noop || (isMinQu
16960 65 72 79 26 26 62 52 65 76 29 20 29 7b 0a 20 20  ery&&bRev) ){.  
16970 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
16980 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b   nEq + topLimit;
16990 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
169a0 69 6e 51 75 65 72 79 20 26 26 20 62 52 65 76 20  inQuery && bRev 
169b0 26 26 20 21 74 6f 70 4c 69 6d 69 74 20 29 7b 0a  && !topLimit ){.
169c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
169d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
169e0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
169f0 73 65 2b 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  se+nCol);.      
16a00 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
16a10 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 30 3b        topEq = 0;
16a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16a30 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
16a40 62 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  be(pParse, nCol,
16a50 20 70 49 64 78 2c 20 72 65 67 42 61 73 65 2c 20   pIdx, regBase, 
16a60 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20  pLevel->iMem);. 
16a70 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
16a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
16a90 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50   op = topEq ? OP
16aa0 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveLe : OP_Mov
16ab0 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eLt;.          s
16ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16ad0 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
16ae0 20 6e 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d   nxt, pLevel->iM
16af0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  em);.        }. 
16b00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
16b10 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Rev ){.        s
16b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b30 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64  (v, OP_Last, iId
16b40 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
16b50 20 20 7d 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a    }.   .      /*
16b60 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 74   Generate the st
16b70 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69  art key.  This i
16b80 73 20 74 68 65 20 6b 65 79 20 74 68 61 74 20 64  s the key that d
16b90 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72  efines the lower
16ba0 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20  .      ** bound 
16bb0 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  on the search.  
16bc0 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72  There is no star
16bd0 74 20 6b 65 79 20 69 66 20 74 68 65 72 65 20 61  t key if there a
16be0 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65  re no.      ** e
16bf0 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e  quality terms an
16c00 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  d if there is no
16c10 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20   "X>..." term.  
16c20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  In.      ** that
16c30 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20   case, generate 
16c40 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72  a "Rewind" instr
16c50 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20  uction in place 
16c60 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
16c70 73 74 61 72 74 20 6b 65 79 20 73 65 61 72 63 68  start key search
16c80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16c90 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
16ca0 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
16cb0 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  a reverse-order 
16cc0 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63  search, the so-c
16cd0 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22  alled.      ** "
16ce0 73 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c  start" key reall
16cf0 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
16d00 75 73 65 64 20 61 73 20 74 68 65 20 74 65 72 6d  used as the term
16d10 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20  ination key..   
16d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16d30 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
16d40 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
16d50 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
16d60 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
16d70 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
16d80 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
16d90 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
16da0 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29  dy, btmOp, pIdx)
16db0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16dc0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
16dd0 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
16de0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
16df0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
16e00 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
16e10 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
16e20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16e30 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
16e40 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
16e50 45 71 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Eq);.        sql
16e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16e70 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
16e80 42 61 73 65 2b 6e 45 71 2c 20 6e 78 74 29 3b 0a  Base+nEq, nxt);.
16e90 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20          btmEq = 
16ea0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
16eb0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
16ec0 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
16ed0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
16ee0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
16ef0 65 7b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71  e{.        btmEq
16f00 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
16f10 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c      if( nEq>0 ||
16f20 20 62 74 6d 4c 69 6d 69 74 20 7c 7c 20 28 69 73   btmLimit || (is
16f30 4d 69 6e 51 75 65 72 79 26 26 21 62 52 65 76 29  MinQuery&&!bRev)
16f40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
16f50 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d  nCol = nEq + btm
16f60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
16f70 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 26 26  f( isMinQuery &&
16f80 20 21 62 52 65 76 20 26 26 20 21 62 74 6d 4c 69   !bRev && !btmLi
16f90 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
16fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16fb0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16fc0 2c 20 72 65 67 42 61 73 65 2b 6e 43 6f 6c 29 3b  , regBase+nCol);
16fd0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b  .          nCol+
16fe0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 6d  +;.          btm
16ff0 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Eq = 0;.        
17000 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52  }.        if( bR
17010 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
17020 72 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  r1 = pLevel->iMe
17030 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  m;.          tes
17040 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a  tOp = OP_IdxLT;.
17050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17060 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
17070 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17080 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17090 20 7d 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64   }.        build
170a0 49 6e 64 65 78 50 72 6f 62 65 28 70 50 61 72 73  IndexProbe(pPars
170b0 65 2c 20 6e 43 6f 6c 2c 20 70 49 64 78 2c 20 72  e, nCol, pIdx, r
170c0 65 67 42 61 73 65 2c 20 72 31 29 3b 0a 20 20 20  egBase, r1);.   
170d0 20 20 20 20 20 69 66 28 20 21 62 52 65 76 20 29       if( !bRev )
170e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
170f0 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f  op = btmEq ? OP_
17100 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
17110 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
17120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17130 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
17140 6e 78 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nxt, r1);.      
17150 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17160 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17170 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
17180 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17190 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
171a0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
171b0 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
171c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
171d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
171e0 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c  Rewind, iIdxCur,
171f0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a   brk);.      }..
17200 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
17210 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66  e the the top of
17220 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74   the loop.  If t
17230 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e  here is a termin
17240 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b  ation.      ** k
17250 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74 65  ey we have to te
17260 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20  st for that key 
17270 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68 65  and abort at the
17280 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20   top of the.    
17290 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20    ** loop..     
172a0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20   */.      start 
172b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
172c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
172d0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
172e0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
172f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17300 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 69  Op3(v, testOp, i
17310 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 70 4c 65  IdxCur, nxt, pLe
17320 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  vel->iMem);.    
17330 20 20 20 20 69 66 28 20 28 74 6f 70 45 71 20 26      if( (topEq &
17340 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62 74  & !bRev) || (!bt
17350 6d 45 71 20 26 26 20 62 52 65 76 29 20 29 7b 0a  mEq && bRev) ){.
17360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17370 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17380 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
17390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 31 20       }.      r1 
173a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
173b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
173c0 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20     if( topLimit 
173d0 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  | btmLimit ){.  
173e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
173f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
17400 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
17410 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  Eq, r1);.       
17420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17430 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
17440 20 72 31 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20   r1, cont);.    
17450 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6f    }.      if( !o
17460 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
17470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
17490 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72  owid, iIdxCur, r
174a0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
174b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
174c0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
174d0 2c 20 30 2c 20 72 31 29 3b 20 20 2f 2a 20 44 65  , 0, r1);  /* De
174e0 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
174f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17500 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17510 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
17520 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  .      /* Record
17530 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
17540 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
17550 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  te the loop..   
17560 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76     */.      pLev
17570 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
17580 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
17590 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
175a0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
175b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
175c0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
175d0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
175e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
175f0 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  UMN_EQ ){.      
17600 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65 72  /* Case 4:  Ther
17610 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e  e is an index an
17620 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  d all terms of t
17630 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17640 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  that.      **   
17650 20 20 20 20 20 20 20 72 65 66 65 72 20 74 6f 20         refer to 
17660 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20  the index using 
17670 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22  the "==" or "IN"
17680 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20   operators..    
17690 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73    */.      int s
176a0 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  tart;.      int 
176b0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
176c0 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  q;.      int isM
176d0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
176e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
176f0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
17700 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 20 2a  ECT min(x) ... *
17710 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 42  /.      int regB
17720 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
17730 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
17740 72 20 6f 66 20 61 72 72 61 79 20 68 6f 6c 64 69  r of array holdi
17750 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ng constraints *
17760 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  /.      int r1;.
17770 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
17780 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
17790 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
177a0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
177b0 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a  = or IN.      **
177c0 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 76   and leave the v
177d0 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
177e0 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63  erms on the stac
177f0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
17800 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
17810 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
17820 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
17830 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20   &wc, notReady, 
17840 31 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20  1);.      nxt = 
17850 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20  pLevel->nxt;..  
17860 20 20 20 20 69 66 28 20 28 77 66 6c 61 67 73 26      if( (wflags&
17870 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
17880 4e 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  N)!=0.       && 
17890 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 26 57  (pLevel->flags&W
178a0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 20 0a 20  HERE_ORDERBY) . 
178b0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e        && (pIdx->
178c0 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20  nColumn>nEq).   
178d0 20 20 20 20 26 26 20 28 70 4f 72 64 65 72 42 79      && (pOrderBy
178e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
178f0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
17900 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 0a 20 20 20 20  olumn[nEq]).    
17910 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 4d    ){.        isM
17920 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
17930 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
17940 72 6f 62 65 28 70 50 61 72 73 65 2c 20 6e 45 71  robe(pParse, nEq
17950 2c 20 70 49 64 78 2c 20 72 65 67 42 61 73 65 2c  , pIdx, regBase,
17960 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a   pLevel->iMem);.
17970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17990 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
179a0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 72  +nEq);.        r
179b0 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
179c0 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c  em;.        buil
179d0 64 49 6e 64 65 78 50 72 6f 62 65 28 70 50 61 72  dIndexProbe(pPar
179e0 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64 78 2c  se, nEq+1, pIdx,
179f0 20 72 65 67 42 61 73 65 2c 20 72 31 29 3b 0a 20   regBase, r1);. 
17a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17a10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17a20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61  a single key tha
17a30 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
17a40 6f 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64  o both start and
17a50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72   .        ** ter
17a60 6d 69 6e 61 74 65 20 74 68 65 20 73 65 61 72 63  minate the searc
17a70 68 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  h.        */.   
17a80 20 20 20 20 20 72 31 20 3d 20 70 4c 65 76 65 6c       r1 = pLevel
17a90 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
17aa0 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
17ab0 70 50 61 72 73 65 2c 20 6e 45 71 2c 20 70 49 64  pParse, nEq, pId
17ac0 78 2c 20 72 65 67 42 61 73 65 2c 20 72 31 29 3b  x, regBase, r1);
17ad0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17ae0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17af0 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20   (1) to move to 
17b00 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
17b10 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
17b20 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  e table..      *
17b30 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * Then generate 
17b40 63 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a 75  code (2) that ju
17b50 6d 70 73 20 74 6f 20 22 6e 78 74 22 20 61 66 74  mps to "nxt" aft
17b60 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  er the cursor is
17b70 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74   past.      ** t
17b80 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67  he last matching
17b90 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
17ba0 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65  table.  The code
17bb0 20 28 31 29 20 69 73 20 65 78 65 63 75 74 65 64   (1) is executed
17bc0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74  .      ** once t
17bd0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
17be0 20 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64   search, the cod
17bf0 65 20 28 32 29 20 69 73 20 65 78 65 63 75 74 65  e (2) is execute
17c00 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20  d before each.  
17c10 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e      ** iteration
17c20 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20   of the scan to 
17c30 73 65 65 20 69 66 20 74 68 65 20 73 63 61 6e 20  see if the scan 
17c40 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f  has finished. */
17c50 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
17c60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63  ){.        /* Sc
17c70 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
17c80 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  der */.        i
17c90 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  nt op;.        i
17ca0 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b  f( isMinQuery ){
17cb0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
17cc0 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20  OP_MoveLt;.     
17cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17ce0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 6f 76 65      op = OP_Move
17cf0 4c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Le;.        }.  
17d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17d10 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
17d20 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 72 31 29  IdxCur, nxt, r1)
17d30 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
17d40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17d50 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c  Op3(v, OP_IdxLT,
17d60 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 70   iIdxCur, nxt, p
17d70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20  Level->iMem);.  
17d80 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
17d90 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
17da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17db0 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
17dc0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
17dd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  .        int op;
17de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
17df0 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
17e00 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 6f 76       op = OP_Mov
17e10 65 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eGt;.        }el
17e20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70  se{.          op
17e30 20 3d 20 4f 50 5f 4d 6f 76 65 47 65 3b 0a 20 20   = OP_MoveGe;.  
17e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e60 33 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  3(v, op, iIdxCur
17e70 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20 20 20 20  , nxt, r1);.    
17e80 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
17e90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17ea0 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43   OP_IdxGE, iIdxC
17eb0 75 72 2c 20 6e 78 74 2c 20 70 4c 65 76 65 6c 2d  ur, nxt, pLevel-
17ec0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  >iMem);.        
17ed0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17ee0 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
17ef0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
17f00 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  OP_Next;.      }
17f10 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74  .      if( !omit
17f20 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
17f30 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17f40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17f60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f70 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
17f80 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ur, r1);.       
17f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17fa0 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  p3(v, OP_MoveGe,
17fb0 20 69 43 75 72 2c 20 30 2c 20 72 31 29 3b 20 20   iCur, 0, r1);  
17fc0 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
17fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
17fe0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17ff0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
18010 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
18020 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
18030 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
18040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
18050 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
18060 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
18070 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
18080 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
18090 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
180a0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
180b0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
180c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
180d0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
180e0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
180f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
18100 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
18110 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
18120 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
18130 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
18140 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
18150 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
18160 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  d, iCur, brk);. 
18170 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
18180 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d  y &= ~getMask(&m
18190 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a  askSet, iCur);..
181a0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f      /* Insert co
181b0 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
181c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
181d0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
181e0 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d  etely.    ** com
181f0 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
18200 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
18210 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ables..    */.  
18220 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
18230 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e  , j=wc.nTerm; j>
18240 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
18250 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
18260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
18270 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
18280 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
18290 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
182a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
182b0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
182c0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
182d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
182e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
182f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18300 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  E!=0 );.      if
18310 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
18320 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
18330 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
18340 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
18350 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18360 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18370 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
18380 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c  Parse, pE, cont,
18390 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
183a0 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
183b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
183c0 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20  CODED;.    }..  
183d0 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
183e0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
183f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
18400 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
18410 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
18420 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
18430 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
18440 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
18450 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
18460 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
18470 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
18480 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  in ){.      pLev
18490 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65  el->top = sqlite
184a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
184b0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
184c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
184d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
184e0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
184f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
18500 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
18510 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
18520 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18530 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43  ExprClearColumnC
18540 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65  ache(pParse, pLe
18550 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
18560 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18570 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65  ClearColumnCache
18580 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d  (pParse, pLevel-
18590 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
185a0 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
185b0 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d   j=0; j<wc.nTerm
185c0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
185d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
185e0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
185f0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
18600 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
18610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
18620 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
18630 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
18640 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
18650 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
18660 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
18670 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18680 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
18690 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74  erm->pExpr, cont
186a0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
186b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ULL);.        pT
186c0 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
186d0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
186e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  }.    }.  }..#if
186f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
18700 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
18710 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
18720 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
18730 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
18740 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
18750 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
18760 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
18770 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
18780 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
18790 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
187a0 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
187b0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
187c0 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
187d0 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
187e0 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
187f0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
18800 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
18810 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
18820 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
18830 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
18840 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
18850 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
18860 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
18870 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
18880 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
18890 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
188a0 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
188b0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
188c0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
188d0 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
188e0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
188f0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
18900 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
18910 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  me;.    n = strl
18920 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  en(z);.    if( n
18930 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
18940 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
18950 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
18960 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
18970 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
18980 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
18990 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
189a0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
189b0 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
189c0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
189d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
189e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
189f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18a00 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
18a10 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
18a20 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
18a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
18a40 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
18a50 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
18a60 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
18a70 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
18a80 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
18a90 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
18aa0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
18ab0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
18ac0 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b  Plan], "* ", 2);
18ad0 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
18ae0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
18af0 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d  ( pLevel->pIdx==
18b00 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
18b10 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
18b20 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
18b30 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  {} ", 3);.      
18b40 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20  nQPlan += 3;.   
18b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
18b60 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d  = strlen(pLevel-
18b70 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pIdx->zName);. 
18b80 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61       if( n+nQPla
18b90 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
18ba0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32  e3_query_plan)-2
18bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
18bc0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
18bd0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
18be0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
18bf0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
18c00 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
18c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
18c20 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
18c30 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
18c40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
18c50 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
18c60 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
18c70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
18c80 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
18c90 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
18ca0 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
18cb0 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
18cc0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
18cd0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
18ce0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18cf0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
18d00 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
18d10 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
18d20 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
18d30 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
18d40 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
18d50 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
18d60 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
18d70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
18d80 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
18d90 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
18da0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
18db0 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
18dc0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
18dd0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
18de0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
18df0 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
18e00 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
18e10 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  wc);.  whereInfo
18e20 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
18e30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18e40 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
18e50 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
18e60 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
18e70 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
18e80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
18e90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18ea0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
18eb0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
18ec0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
18ed0 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
18ee0 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
18ef0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
18f00 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
18f10 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
18f20 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
18f30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
18f40 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
18f50 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
18f60 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
18f70 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
18f80 6f 6c 75 6d 6e 43 61 63 68 65 28 70 57 49 6e 66  olumnCache(pWInf
18f90 6f 2d 3e 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a  o->pParse, -1);.
18fa0 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74    for(i=pTabList
18fb0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20  ->nSrc-1; i>=0; 
18fc0 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
18fd0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
18fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18ff0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
19000 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a   pLevel->cont);.
19010 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
19020 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
19030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19040 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c  AddOp2(v, pLevel
19050 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
19060 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
19070 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
19080 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20  vel->nIn ){.    
19090 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
190a0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
190b0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
190c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
190d0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29  (v, pLevel->nxt)
190e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
190f0 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26  evel->nIn, pIn=&
19100 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
19110 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
19120 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
19130 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19140 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41  ere(v, pIn->topA
19150 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ddr+1);.        
19160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19170 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49  2(v, OP_Next, pI
19180 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f  n->iCur, pIn->to
19190 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  pAddr);.        
191a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
191b0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41  ere(v, pIn->topA
191c0 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ddr-1);.      }.
191d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
191e0 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f  ee(pLevel->aInLo
191f0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
19200 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19210 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
19220 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  ->brk);.    if( 
19230 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
19240 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
19250 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
19260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19270 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
19280 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
19290 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
192a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
192b0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
192c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
192d0 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
192e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
192f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
19300 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19310 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
19320 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
19330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19350 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
19360 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20  Level->top);.   
19370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
19380 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
19390 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
193a0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
193b0 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
193c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
193d0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
193e0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
193f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
19400 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19410 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
19420 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
19430 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
19440 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
19450 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
19460 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Begin..  */.  fo
19470 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
19480 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
19490 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
194a0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73  pLevel++){.    s
194b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
194c0 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
194d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
194e0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
194f0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
19500 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
19510 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
19520 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
19530 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54  b->isEphem || pT
19540 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
19550 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
19560 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
19570 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66  ss && (pLevel->f
19580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
19590 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
195a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
195b0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
195c0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
195d0 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
195e0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
195f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
19600 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19610 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76  , OP_Close, pLev
19620 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
19630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19640 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
19650 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64   index, make cod
19660 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
19670 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
19680 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
19690 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65  ex in preference
196a0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53   to the table. S
196b0 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d  ometimes, this m
196c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  eans.    ** the 
196d0 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72  table need never
196e0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54   be read from. T
196f0 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d  his is a perform
19700 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20  ance boost,.    
19710 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c  ** as the vdbe l
19720 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c  evel waits until
19730 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65   the table is re
19740 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ad before actual
19750 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e  ly.    ** seekin
19760 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  g the table curs
19770 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  or to the record
19780 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
19790 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
197a0 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e    ** position in
197b0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
197c0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
197d0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
197e0 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
197f0 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
19800 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
19810 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
19820 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
19830 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
19840 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
19850 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
19860 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
19870 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
19880 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
19890 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
198a0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
198b0 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
198c0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
198d0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
198e0 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
198f0 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
19900 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20  f( pLevel->pIdx 
19910 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
19920 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
19930 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
19940 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
19950 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20  pLevel->pIdx;.  
19960 20 20 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78      int useIndex
19970 4f 6e 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 66  Only = pLevel->f
19980 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
19990 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73  _ONLY;..      as
199a0 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
199b0 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
199c0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
199d0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
199e0 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
199f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19a00 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
19a10 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
19a20 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
19a30 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
19a40 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
19a50 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
19a60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
19a70 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
19a80 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
19a90 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
19aa0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
19ab0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
19ac0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
19ad0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
19ae0 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
19af0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
19b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
19b10 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
19b20 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
19b30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19b40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19b60 20 20 20 61 73 73 65 72 74 28 21 75 73 65 49 6e     assert(!useIn
19b70 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64  dexOnly || j<pId
19b80 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  x->nColumn);.   
19b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
19ba0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
19bb0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
19bc0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
19bd0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
19be0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
19bf0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
19c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
19c10 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
19c20 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75  =OP_NullRow && u
19c30 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20  seIndexOnly ){. 
19c40 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
19c50 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
19c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19c80 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
19c90 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f    */.  whereInfo
19ca0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
19cb0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.