/ Hex Artifact Content
Login

Artifact ad88aefac0e6469b3899477a81ef81b6bdc82913:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 30 36   where.c,v 1.306
0340: 20 32 30 30 38 2f 30 35 2f 32 39 20 30 35 3a 32   2008/05/29 05:2
0350: 33 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a 2a  3:42 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 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
77b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
77c0: 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45 78  keOrGlob(db, pEx
77d0: 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26  pr, &nPattern, &
77e0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
77f0: 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72  ase) ){.    Expr
7800: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
7810: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  ;.    Expr *pStr
7820: 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45  1, *pStr2;.    E
7830: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20  xpr *pNewExpr1, 
7840: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
7850: 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78  int idxNew1, idx
7860: 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74  New2;..    pLeft
7870: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
7880: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
7890: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
78a0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
78b0: 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20  pr;.    pStr1 = 
78c0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
78d0: 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  rse, TK_STRING, 
78e0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
78f0: 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20  ( pStr1 ){.     
7900: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
7910: 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f  y(db, &pStr1->to
7920: 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  ken, &pRight->to
7930: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ken);.      pStr
7940: 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61  1->token.n = nPa
7950: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70 53 74  ttern;.      pSt
7960: 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44  r1->flags = EP_D
7970: 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20  equoted;.    }. 
7980: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
7990: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
79a0: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 21 64  tr1);.    if( !d
79b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
79c0: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
79d0: 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pC;.      assert
79e0: 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64  ( pStr2->token.d
79f0: 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43 20 3d  yn );.      pC =
7a00: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f   (u8*)&pStr2->to
7a10: 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31  ken.z[nPattern-1
7a20: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
7a30: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
7a40: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  se ){.        if
7a50: 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43 6f 6d  ( c=='@' ) isCom
7a60: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
7a70: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
7a80: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
7a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
7aa0: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
7ab0: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
7ac0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7ad0: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c 69  rse, TK_GE, sqli
7ae0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
7af0: 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b  eft), pStr1, 0);
7b00: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
7b10: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
7b20: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
7b30: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
7b40: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
7b50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
7b60: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
7b70: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
7b80: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7b90: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20 73 71  Parse, TK_LT, sq
7ba0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7bb0: 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30  pLeft), pStr2, 0
7bc0: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
7bd0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
7be0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
7bf0: 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
7c00: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
7c10: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
7c20: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
7c30: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
7c40: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7c50: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
7c60: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57  lete ){.      pW
7c70: 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50  C->a[idxNew1].iP
7c80: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
7c90: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
7ca0: 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew2].iParent =
7cb0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
7cc0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
7cd0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  2;.    }.  }.#en
7ce0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7cf0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
7d00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
7d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7d20: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41  TUALTABLE.  /* A
7d30: 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75  dd a WO_MATCH au
7d40: 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20  xiliary term to 
7d50: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  the constraint s
7d60: 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  et if the.  ** c
7d70: 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  urrent expressio
7d80: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
7d90: 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  :  column MATCH 
7da0: 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20  expr..  ** This 
7db0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
7dc0: 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
7dd0: 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
7de0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
7df0: 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
7e00: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
7e10: 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
7e20: 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
7e30: 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
7e40: 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
7e50: 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f  /.  if( isMatchO
7e60: 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29  fColumn(pExpr) )
7e70: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  {.    int idxNew
7e80: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
7e90: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  ht, *pLeft;.    
7ea0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
7eb0: 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  erm;.    Bitmask
7ec0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70   prereqColumn, p
7ed0: 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20  rereqExpr;..    
7ee0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
7ef0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
7f00: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
7f10: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
7f20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
7f30: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
7f40: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7f50: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
7f60: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
7f70: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7f80: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
7f90: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
7fa0: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
7fb0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
7fc0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
7fd0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
7fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
7ff0: 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20 73 71   TK_MATCH, 0, sq
8000: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8010: 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a 20 20   pRight), 0);.  
8020: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
8030: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
8040: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
8050: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
8060: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8070: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
8080: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
8090: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
80a0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
80b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
80c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
80d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
80e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
80f0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  ->leftColumn = p
8100: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
8110: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
8120: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
8130: 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
8140: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
8150: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
8160: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
8170: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
8180: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
8190: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  .      pTerm->fl
81a0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
81b0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
81c0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
81d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
81e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
81f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8200: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
8210: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
8220: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
8230: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
8240: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
8250: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
8260: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
8270: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
8280: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
8290: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
82a0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
82b0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
82c0: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f  rn TRUE if any o
82d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
82e0: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46  s in pList->a[iF
82f0: 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e  irst...] contain
8300: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
8310: 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68  to any table oth
8320: 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73  er than the iBas
8330: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
8340: 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65  ic int reference
8350: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20  sOtherTables(.  
8360: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
8380: 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  rch expressions 
8390: 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20  in ths list */. 
83a0: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
83b0: 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20 4d 61  askSet,    /* Ma
83c0: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
83d0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
83e0: 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
8400: 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68  e searching with
8410: 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65   the iFirst-th e
8420: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
8430: 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20  nt iBase        
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
8450: 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
8460: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
8470: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f  {.  Bitmask allo
8480: 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70  wed = ~getMask(p
8490: 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b  MaskSet, iBase);
84a0: 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74  .  while( iFirst
84b0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  <pList->nExpr ){
84c0: 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61  .    if( (exprTa
84d0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
84e0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  t, pList->a[iFir
84f0: 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c  st++].pExpr)&all
8500: 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  owed)!=0 ){.    
8510: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8520: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
8530: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
8540: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
8550: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
8560: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
8570: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
8580: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
8590: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
85a0: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
85b0: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
85c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
85d0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
85e0: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
85f0: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
8600: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
8610: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
8620: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
8630: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
8640: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
8650: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
8660: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
8670: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
8680: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
8690: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
86a0: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
86b0: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
86c0: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
86d0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
86e0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
86f0: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
8700: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
8710: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
8720: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
8730: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
8740: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
8750: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
8760: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
8770: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
8780: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
8790: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
87a0: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
87b0: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
87c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
87d0: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
87e0: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
87f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
8800: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
8810: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
8820: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
8830: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
8840: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
8850: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
8860: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
8870: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8880: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
8890: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
88a0: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
88b0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
88c0: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
88d0: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
88e0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
88f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8900: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8910: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
8920: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a  t *pMaskSet,  /*
8930: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
8940: 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62  ble indices to b
8950: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65  itmaps */.  Inde
8960: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
8970: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
8980: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20   we are testing 
8990: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
89c0: 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  r the table to b
89d0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
89e0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
89f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
8a00: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
8a10: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20    int nEqCol,   
8a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8a30: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
8a40: 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e  umns with == con
8a50: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
8a60: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
8a70: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
8a80: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
8a90: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
8aa0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ac0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
8ad0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
8ae0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
8af0: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
8b00: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
8b10: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
8b20: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b50: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
8b60: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
8b70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
8b80: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
8b90: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8ba0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
8bb0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8bc0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
8bd0: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
8be0: 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
8bf0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
8c00: 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
8c10: 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d  .  /* Match term
8c20: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
8c30: 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74  Y clause against
8c40: 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a   columns of.  **
8c50: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
8c60: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8c70: 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49 64  indices have pId
8c80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c  x->nColumn regul
8c90: 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a  ar columns plus.
8ca0: 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f    ** one additio
8cb0: 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  nal column conta
8cc0: 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e  ining the rowid.
8cd0: 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75    The rowid colu
8ce0: 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69  mn.  ** of the i
8cf0: 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c  ndex is also all
8d00: 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67  owed to match ag
8d10: 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20  ainst the ORDER 
8d20: 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  BY.  ** clause..
8d30: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30    */.  for(i=j=0
8d40: 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79  , pTerm=pOrderBy
8d50: 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20  ->a; j<nTerm && 
8d60: 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i<=pIdx->nColumn
8d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8d80: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f   *pExpr;       /
8d90: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
8da0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8db0: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f   pTerm */.    Co
8dc0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
8dd0: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e   /* The collatin
8de0: 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45  g sequence of pE
8df0: 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  xpr */.    int t
8e00: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a  ermSortOrder; /*
8e10: 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   Sort order for 
8e20: 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
8e30: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
8e40: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
8e50: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
8e60: 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77  dex.  -1 for row
8e70: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  id */.    int iS
8e80: 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20  ortOrder;    /* 
8e90: 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f  1 for DESC, 0 fo
8ea0: 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74  r ASC on the i-t
8eb0: 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  h index term */.
8ec0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8ed0: 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f  zColl; /* Name o
8ee0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  f the collating 
8ef0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74  sequence for i-t
8f00: 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a  h index term */.
8f10: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65  .    pExpr = pTe
8f20: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  rm->pExpr;.    i
8f30: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
8f40: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
8f50: 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29  ->iTable!=base )
8f60: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e  {.      /* Can n
8f70: 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
8f80: 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67  sort on anything
8f90: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63   that is not a c
8fa0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20  olumn in the.   
8fb0: 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20     ** left-most 
8fc0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f  table of the FRO
8fd0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
8fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8ff0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9000: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9010: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
9020: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
9030: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
9040: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
9050: 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
9060: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
9070: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
9080: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
9090: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
90a0: 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
90b0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
90c0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
90d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
90e0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
90f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
9100: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
9110: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
9120: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9130: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
9140: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
9150: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  = 0;.      zColl
9160: 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
9170: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9180: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
9190: 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65  Column || sqlite
91a0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
91b0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
91c0: 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a  .      /* Term j
91d0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
91e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
91f0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20   match column i 
9200: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
9210: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43        if( i<nEqC
9220: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
9230: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
9240: 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73  umn that is cons
9250: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61  trained by == fa
9260: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a  ils to match an.
9270: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
9280: 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69   BY term, that i
9290: 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f  s OK.  Just igno
92a0: 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f  re that column o
92b0: 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
92c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
92d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
92e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
92f0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
9300: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
9310: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
9320: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
9330: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
9340: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
9350: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
9360: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
9370: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9380: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
9390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
93a0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
93b0: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
93c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
93d0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  m->sortOrder==0 
93e0: 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  || pTerm->sortOr
93f0: 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  der==1 );.    as
9400: 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72  sert( iSortOrder
9410: 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65  ==0 || iSortOrde
9420: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d  r==1 );.    term
9430: 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72  SortOrder = iSor
9440: 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e  tOrder ^ pTerm->
9450: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  sortOrder;.    i
9460: 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i>nEqCol ){. 
9470: 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72       if( termSor
9480: 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65  tOrder!=sortOrde
9490: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
94a0: 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79  Indices can only
94b0: 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20   be used if all 
94c0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70  ORDER BY terms p
94d0: 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  ast the.        
94e0: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
94f0: 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20  traints are all 
9500: 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41  either DESC or A
9510: 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  SC. */.        r
9520: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
9530: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9540: 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65    sortOrder = te
9550: 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  rmSortOrder;.   
9560: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20   }.    j++;.    
9570: 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28  pTerm++;.    if(
9580: 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72   iColumn<0 && !r
9590: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
95a0: 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70  bles(pOrderBy, p
95b0: 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65  MaskSet, j, base
95c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
95d0: 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c   the indexed col
95e0: 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61  umn is the prima
95f0: 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79  ry key and every
9600: 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20  thing matches.  
9610: 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e      ** so far an
9620: 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  d none of the OR
9630: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
9640: 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65  the right refere
9650: 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20  nce other.      
9660: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
9670: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61   join, then we a
9680: 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20  re assured that 
9690: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  the index can be
96a0: 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20   used .      ** 
96b0: 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20  to sort because 
96c0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
96d0: 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f  is unique and so
96e0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68   none of the oth
96f0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  er.      ** colu
9700: 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e  mns will make an
9710: 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20  y difference.   
9720: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20     */.      j = 
9730: 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTerm;.    }.  }
9740: 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72  ..  *pbRev = sor
9750: 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28  tOrder!=0;.  if(
9760: 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20   j>=nTerm ){.   
9770: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
9780: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9790: 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64  ause are covered
97a0: 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73   by this index s
97b0: 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e  o.    ** this in
97c0: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
97d0: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a  for sorting. */.
97e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
97f0: 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
9800: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
9810: 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i==pIdx->nColu
9820: 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66  mn.      && !ref
9830: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
9840: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
9850: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
9860: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65  ){.    /* All te
9870: 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65  rms of this inde
9880: 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65  x match some pre
9890: 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52  fix of the ORDER
98a0: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
98b0: 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
98c0: 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f  is UNIQUE and no
98d0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61   terms on the ta
98e0: 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  il of the ORDER 
98f0: 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  BY.    ** clause
9900: 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72   reference other
9910: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
9920: 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
9930: 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20  ll true then.   
9940: 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79   ** the order by
9950: 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72   clause is super
9960: 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72  fluous. */.    r
9970: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
9980: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9990: 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f  * Check table to
99a0: 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45   see if the ORDE
99b0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
99c0: 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73  OrderBy can be s
99d0: 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73  atisfied.** by s
99e0: 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  orting in order 
99f0: 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72  of ROWID.  Retur
9a00: 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64  n true if so and
9a10: 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62   set *pbRev to b
9a20: 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65  e.** true for re
9a30: 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20  verse ROWID and 
9a40: 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72  false for forwar
9a50: 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a  d ROWID order..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
9a70: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20  tableByRowid(.  
9a80: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9aa0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
9ab0: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
9ac0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9ad0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
9ae0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
9af0: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  use */.  ExprMas
9b00: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
9b10: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
9b20: 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61   tables to bitma
9b30: 70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ps */.  int *pbR
9b40: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
9b50: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
9b60: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
9b70: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
9b80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
9b90: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
9ba0: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
9bb0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20  Expr>0 );.  p = 
9bc0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
9bd0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  Expr;.  if( p->o
9be0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
9bf0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 20  p->iTable==base 
9c00: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  && p->iColumn==-
9c10: 31 0a 20 20 20 20 26 26 20 21 72 65 66 65 72 65  1.    && !refere
9c20: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
9c30: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
9c40: 65 74 2c 20 31 2c 20 62 61 73 65 29 20 29 7b 0a  et, 1, base) ){.
9c50: 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f 72      *pbRev = pOr
9c60: 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
9c70: 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75 72  Order;.    retur
9c80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
9c90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
9ca0: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
9cb0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
9cc0: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
9cd0: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
9ce0: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
9cf0: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
9d00: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
9d10: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
9d20: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
9d30: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
9d40: 6f 70 65 72 61 74 69 6e 67 73 20 77 69 74 68 20  operatings with 
9d50: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
9d60: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
9d70: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
9d80: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
9d90: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
9da0: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
9db0: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
9dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
9dd0: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
9de0: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
9df0: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
9e00: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
9e10: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
9e20: 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
9e30: 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
9e40: 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
9e50: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
9e60: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
9e70: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
9e80: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
9e90: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
9ea0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
9eb0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
9ec0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
9ed0: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
9ee0: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
9ef0: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
9f00: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
9f10: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
9f20: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
9f30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9f40: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
9f50: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
9f60: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
9f70: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
9f80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
9f90: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
9fa0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
9fb0: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
9fc0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
9fd0: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
9fe0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
9ff0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
a000: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
a010: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
a020: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
a030: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
a040: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
a050: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
a060: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
a070: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
a080: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
a090: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
a0a0: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
a0b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
a0c0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
a0d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
a0e0: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
a0f0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
a100: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
a110: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
a120: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
a130: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
a140: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
a150: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
a160: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
a170: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
a180: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
a190: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
a1a0: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
a1b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
a1c0: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
a1d0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
a1e0: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
a1f0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
a200: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
a210: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
a220: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
a230: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
a240: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
a250: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
a260: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
a270: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
a280: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
a290: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
a2a0: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
a2b0: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
a2c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a2d0: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
a2e0: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
a2f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
a300: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
a310: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
a320: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
a330: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
a340: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
a350: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
a360: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
a370: 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
a380: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
a390: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
a3a0: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
a3b0: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
a3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a3d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
a3e0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
a3f0: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
a400: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
a410: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
a420: 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
a430: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
a440: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
a450: 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
a460: 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
a470: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
a480: 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
a490: 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
a4a0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
a4b0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
a4c0: 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
a4d0: 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
a4e0: 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
a4f0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
a500: 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
a510: 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
a520: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
a530: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
a540: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
a550: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
a560: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a570: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
a580: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
a590: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
a5a0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
a5b0: 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
a5c0: 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
a5d0: 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
a5e0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
a5f0: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
a600: 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
a610: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
a620: 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
a630: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
a640: 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
a650: 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
a660: 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
a670: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
a680: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a690: 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
a6a0: 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
a6b0: 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
a6c0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
a6d0: 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
a6e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a6f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a700: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
a710: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
a720: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a740: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
a750: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
a760: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
a770: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
a780: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
a790: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
a7a0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
a7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
a7c0: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
a7d0: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
a7e0: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
a7f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
a800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a810: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
a820: 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79  */.  int orderBy
a830: 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
a840: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
a850: 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20  e can potential 
a860: 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sort */.  sqlite
a870: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
a880: 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65  pIdxInfo /* Inde
a890: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
a8a0: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
a8b0: 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ex */.){.  Table
a8c0: 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70   *pTab = pSrc->p
a8d0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Tab;.  sqlite3_i
a8e0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
a8f0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
a900: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
a910: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
a920: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
a930: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
a940: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
a950: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
a960: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
a970: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
a980: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a990: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
a9a0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
a9b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
a9c0: 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
a9d0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
a9e0: 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
a9f0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
aa00: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
aa10: 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74  nitialized for t
aa20: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
aa30: 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  e, then allocate
aa40: 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  .  ** and initia
aa50: 6c 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f  lize it now.  */
aa60: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
aa70: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
aa80: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
aa90: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
aaa0: 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65  erm;.    int nTe
aab0: 72 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  rm;.    WHERETRA
aac0: 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
aad0: 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
aae0: 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e  %s...\n", pTab->
aaf0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
ab00: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
ab10: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
ab20: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
ab30: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
ab40: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
ab50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
ab60: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  .    for(i=nTerm
ab70: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
ab80: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
ab90: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
aba0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
abb0: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
abc0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
abd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
abe0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
abf0: 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
ac00: 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
ac10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ac20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ac30: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==WO_IN );.     
ac40: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
ac50: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
ac60: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
ac70: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
ac80: 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
ac90: 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
aca0: 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d  nue;.      nTerm
acb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
acc0: 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
acd0: 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  Y clause contain
ace0: 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69  s only columns i
acf0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  n the current . 
ad00: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61     ** virtual ta
ad10: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
ad20: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
ad30: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
ad40: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  .    ** the sqli
ad50: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
ad60: 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
ad70: 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
ad80: 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  0;.    if( pOrde
ad90: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rBy ){.      for
ada0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
adb0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
adc0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
add0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
ade0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
adf0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
ae00: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
ae10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53  Expr->iTable!=pS
ae20: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72  rc->iCursor ) br
ae30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ae40: 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72     if( i==pOrder
ae50: 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
ae60: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
ae70: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
ae80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ae90: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
aea0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
aeb0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
aec0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
aed0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
aee0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
aef0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
af00: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
af30: 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
af40: 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
af50: 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
af80: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
af90: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
afa0: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
afb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
afc0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
afd0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20   memory");.     
afe0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20   return 0.0;.   
aff0: 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66   }.    *ppIdxInf
b000: 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  o = pIdxInfo;.. 
b010: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
b020: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
b030: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
b040: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
b050: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  e contains.    *
b060: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
b070: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
b080: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
b090: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
b0a0: 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69  om.    ** changi
b0b0: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
b0c0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
b0d0: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
b0e0: 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  der to.    ** in
b0f0: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
b100: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
b110: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
b120: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
b130: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
b140: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20  pIdxInfo[1];.   
b150: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
b160: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
b170: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
b180: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
b190: 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74      pUsage = (st
b1a0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
b1b0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
b1c0: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
b1d0: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20  y[nOrderBy];.   
b1e0: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
b1f0: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
b200: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e   nTerm;.    *(in
b210: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
b220: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
b230: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
b240: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
b250: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
b260: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
b270: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
b280: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
b290: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
b2a0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
b2b0: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
b2c0: 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75  erBy;.    *(stru
b2d0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b2e0: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
b2f0: 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
b300: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
b310: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
b360: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70      for(i=j=0, p
b370: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
b380: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
b390: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
b3a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
b3b0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
b3c0: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
b3d0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
b3e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
b3f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b400: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
b410: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
b420: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
b430: 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
b440: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
b450: 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c  erator==WO_ISNUL
b460: 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  L );.      if( p
b470: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b480: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
b490: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
b4a0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
b4b0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
b4c0: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  m->leftColumn;. 
b4d0: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
b4e0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
b4f0: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
b500: 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e  [j].op = pTerm->
b510: 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20  eOperator;.     
b520: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
b530: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
b540: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
b550: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
b560: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
b570: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
b580: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b590: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
b5a0: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
b5b0: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
b5c0: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
b5d0: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
b5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b5f0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
b600: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
b610: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b620: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
b630: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b640: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
b650: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
b660: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b670: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
b680: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
b690: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
b6a0: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
b6b0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
b6c0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
b6d0: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
b6e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
b6f0: 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
b700: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
b710: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73  ATCH );.      as
b720: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
b730: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
b740: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
b750: 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
b760: 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ) );.      j++;.
b770: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
b780: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
b790: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b7a0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
b7b0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
b7c0: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
b7d0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
b7e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
b7f0: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
b800: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
b810: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
b820: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
b830: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
b840: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
b850: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
b860: 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
b870: 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
b880: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
b890: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
b8a0: 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
b8b0: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
b8c0: 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
b8d0: 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
b8e0: 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
b8f0: 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
b900: 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
b910: 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
b920: 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
b930: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
b940: 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
b950: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
b960: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
b970: 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
b980: 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
b990: 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
b9a0: 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
b9b0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
b9c0: 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
b9d0: 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
b9e0: 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
b9f0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
ba00: 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
ba10: 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
ba20: 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
ba30: 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
ba40: 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
ba50: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
ba60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
ba70: 2d 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30  ->pVtab );.#if 0
ba80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74  .  if( pTab->pVt
ba90: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
baa0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bab0: 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20  rse, "undefined 
bac0: 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61  module %s for ta
bad0: 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ble %s",.       
bae0: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
baf0: 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61  rg[0], pTab->zNa
bb00: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
bb10: 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0.0;.  }.#endif.
bb20: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
bb30: 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
bb40: 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
bb50: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
bb60: 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
bb70: 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  les to zero..  *
bb80: 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69  *.  ** aConstrai
bb90: 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74  nt[].usable is t
bba0: 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  rue for constrai
bbb0: 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69  nts where the ri
bbc0: 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69  ght-hand.  ** si
bbd0: 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
bbe0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
bbf0: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
bc00: 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
bc10: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e  .  ** table.  In
bc20: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
bc30: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
bc40: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
bc50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
bc60: 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70      column = exp
bc70: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  r.  **.  ** and 
bc80: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
bc90: 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  g a join, then t
bca0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  he constraint on
bcb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a   column is .  **
bcc0: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
bcd0: 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  ll tables refere
bce0: 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63  nced in expr occ
bcf0: 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ur to the left. 
bd00: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
bd10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
bd20: 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  mn..  **.  ** Th
bd30: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
bd40: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
bd50: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
bd60: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
bd70: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
bd80: 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
bd90: 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
bda0: 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
bdb0: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
bdc0: 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74  h we might try t
bdd0: 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20  o pick the best 
bde0: 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74  index multiple t
bdf0: 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  imes..  ** For e
be00: 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70  ach attempt at p
be10: 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c  icking an index,
be20: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61   the order of ta
be30: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
be40: 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64   join might be d
be50: 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68  ifferent so we h
be60: 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  ave to recompute
be70: 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
be80: 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e  .  ** each time.
be90: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
bea0: 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
beb0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
bec0: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
bed0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
bee0: 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
bef0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
bf00: 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sage;.  for(i=0;
bf10: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
bf20: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
bf30: 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
bf40: 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
bf50: 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  ermOffset;.    p
bf60: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
bf70: 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
bf80: 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72  >usable =  (pTer
bf90: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
bfa0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20   notReady)==0;. 
bfb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61   }.  memset(pUsa
bfc0: 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
bfd0: 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
bfe0: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
bff0: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
c000: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
c010: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c020: 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
c030: 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70  idxStr);.  }.  p
c040: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
c050: 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
c060: 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
c070: 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
c080: 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
c090: 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
c0a0: 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
c0b0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
c0c0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
c0d0: 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30  TE_BIG_DBL / 2.0
c0e0: 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
c0f0: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
c100: 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  y;.  if( pIdxInf
c110: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21  o->nOrderBy && !
c120: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b  orderByUsable ){
c130: 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  .    *(int*)&pId
c140: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
c150: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69  = 0;.  }..  (voi
c160: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
c170: 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ff(pParse->db);.
c180: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
c190: 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
c1a0: 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
c1b0: 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
c1c0: 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  INPUTS(pIdxInfo)
c1d0: 3b 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70  ;.  rc = pTab->p
c1e0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
c1f0: 42 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e  BestIndex(pTab->
c200: 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29  pVtab, pIdxInfo)
c210: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
c220: 54 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b  TPUTS(pIdxInfo);
c230: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
c240: 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d  SafetyOn(pParse-
c250: 3e 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  >db);..  for(i=0
c260: 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
c270: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
c280: 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 49 6e  .    if( !pIdxIn
c290: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
c2a0: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73  i].usable && pUs
c2b0: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
c2c0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
c2d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c2e0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
c2f0: 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
c300: 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
c310: 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
c320: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
c330: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
c340: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
c350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c360: 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
c370: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
c380: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
c390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c3a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  ;.    }else {.  
c3b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c3c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
c3d0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
c3e0: 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rc));.    }.  }.
c3f0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
c400: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
c410: 4f 72 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75  OrderBy;..  retu
c420: 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  rn pIdxInfo->est
c430: 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65  imatedCost;.}.#e
c440: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c450: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
c460: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20   */../*.** Find 
c470: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
c480: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
c490: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
c4a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
c4b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64  er.** to the ind
c4c0: 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64  ex, flags that d
c4d0: 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20  escribe how the 
c4e0: 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
c4f0: 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d  used, the.** num
c500: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
c510: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64  constraints, and
c520: 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20   the "cost" for 
c530: 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  this index..**.*
c540: 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
c550: 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54  t index wins.  T
c560: 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
c570: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
c580: 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
c590: 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
c5a0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
c5b0: 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68  request using th
c5c0: 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  e selected index
c5d0: 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
c5e0: 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
c5f0: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
c600: 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
c610: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
c620: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
c630: 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
c640: 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
c650: 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
c660: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
c670: 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
c680: 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
c690: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
c6a0: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
c6b0: 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
c6c0: 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
c6d0: 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
c6e0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
c6f0: 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  e..**.*/.static 
c700: 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78  double bestIndex
c710: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c720: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c730: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
c740: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
c750: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
c760: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
c770: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
c780: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
c790: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
c7a0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c7b0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
c7c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
c7d0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
c7e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
c7f0: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
c800: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
c810: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
c820: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
c830: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
c840: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70  e */.  Index **p
c850: 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  pIndex,         
c860: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e     /* Make *ppIn
c870: 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  dex point to the
c880: 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20   best index */. 
c890: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c8b0: 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69  Put flags descri
c8c0: 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65  bing this choice
c8d0: 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20   in *pFlags */. 
c8e0: 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20   int *pnEq      
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c900: 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Put the number o
c910: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
c920: 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29  raints here */.)
c930: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
c940: 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62  Term;.  Index *b
c950: 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20  estIdx = 0;     
c960: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61      /* Index tha
c970: 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65  t gives the lowe
c980: 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75  st cost */.  dou
c990: 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20  ble lowestCost; 
c9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c9b0: 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65  cost of using be
c9c0: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
c9d0: 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
c9e0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
c9f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ca00: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
ca10: 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
ca20: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
ca30: 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a   value for nEq *
ca40: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
ca50: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
ca60: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
ca70: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
ca80: 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
ca90: 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
caa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
cab0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
cac0: 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  aluating */.  in
cad0: 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
cae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
caf0: 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
cb00: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
cb10: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cb30: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
cb40: 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20  with pProbe */. 
cb50: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb70: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
cb80: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
cb90: 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
cba0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
cbb0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64  /* Mask of valid
cbc0: 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
cbd0: 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ors */.  double 
cbe0: 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
cbf0: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
cc00: 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
cc10: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
cc20: 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25  bestIndex: tbl=%
cc30: 73 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c  s notReady=%llx\
cc40: 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  n", pSrc->pTab->
cc50: 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29  zName, notReady)
cc60: 29 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20  );.  lowestCost 
cc70: 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
cc80: 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72  ;.  pProbe = pSr
cc90: 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
cca0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
ccb0: 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  ble has no indic
ccc0: 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
ccd0: 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65   no terms in the
cce0: 20 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75   where.  ** clau
ccf0: 73 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  se that refer to
cd00: 20 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e   the ROWID, then
cd10: 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62   we will never b
cd20: 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a  e able to do.  *
cd30: 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  * anything other
cd40: 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62   than a full tab
cd50: 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20  le scan on this 
cd60: 74 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74  table.  We might
cd70: 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75   as.  ** well pu
cd80: 74 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68  t it first in th
cd90: 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54  e join order.  T
cda0: 68 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73  hat way, perhaps
cdb0: 20 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20   it can be.  ** 
cdc0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74  referenced by ot
cdd0: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68  her tables in th
cde0: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
cdf0: 66 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a  f( pProbe==0 &&.
ce00: 20 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57       findTerm(pW
ce10: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
ce20: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c  WO_EQ|WO_IN|WO_L
ce30: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
ce40: 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20  _GE,0)==0 &&.   
ce50: 20 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c    (pOrderBy==0 |
ce60: 7c 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77  | !sortableByRow
ce70: 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42  id(iCur, pOrderB
ce80: 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  y, pWC->pMaskSet
ce90: 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20  , &rev)) ){.    
cea0: 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  *pFlags = 0;.   
ceb0: 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20   *ppIndex = 0;. 
cec0: 20 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20     *pnEq = 0;.  
ced0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
cee0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
cef0: 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f  r a rowid=EXPR o
cf00: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
cf10: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
cf20: 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  /.  pTerm = find
cf30: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
cf40: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
cf50: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
cf60: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
cf70: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
cf80: 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b     *ppIndex = 0;
cf90: 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d  .    bestFlags =
cfa0: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b   WHERE_ROWID_EQ;
cfb0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
cfc0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
cfd0: 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  Q ){.      /* Ro
cfe0: 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20  wid== is always 
cff0: 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20  the best pick.  
d000: 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e  Look no further.
d010: 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20    Because only. 
d020: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
d030: 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65   row is generate
d040: 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77  d, output is alw
d050: 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ays in sorted or
d060: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46  der */.      *pF
d070: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
d080: 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e  ID_EQ | WHERE_UN
d090: 49 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45  IQUE;.      *pnE
d0a0: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45  q = 1;.      WHE
d0b0: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65  RETRACE(("... be
d0c0: 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29  st is rowid\n"))
d0d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d0e0: 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .0;.    }else if
d0f0: 28 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d  ( (pExpr = pTerm
d100: 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21  ->pExpr)->pList!
d110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52  =0 ){.      /* R
d120: 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20  owid IN (LIST): 
d130: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
d140: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
d150: 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20  ber of list.    
d160: 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20    ** elements.  
d170: 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  */.      lowestC
d180: 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ost = pExpr->pLi
d190: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
d1a0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65   lowestCost *= e
d1b0: 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74  stLog(lowestCost
d1c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d1d0: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
d1e0: 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69  (SELECT): cost i
d1f0: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
d200: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d210: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69   rows.      ** i
d220: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
d230: 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74  the inner select
d240: 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61  .  We have no wa
d250: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20  y to estimate.  
d260: 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75      ** that valu
d270: 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64  e so make a wild
d280: 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20   guess. */.     
d290: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30   lowestCost = 20
d2a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45  0;.    }.    WHE
d2b0: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f  RETRACE(("... ro
d2c0: 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39  wid IN cost: %.9
d2d0: 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74  g\n", lowestCost
d2e0: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73  ));.  }..  /* Es
d2f0: 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20  timate the cost 
d300: 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  of a table scan.
d310: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b    If we do not k
d320: 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a  now how many.  *
d330: 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e  * entries are in
d340: 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20   the table, use 
d350: 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67  1 million as a g
d360: 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73  uess..  */.  cos
d370: 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72  t = pProbe ? pPr
d380: 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
d390: 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 57 48   : 1000000;.  WH
d3a0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74  ERETRACE(("... t
d3b0: 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63  able scan base c
d3c0: 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  ost: %.9g\n", co
d3d0: 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20  st));.  flags = 
d3e0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
d3f0: 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  E;..  /* Check f
d400: 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
d410: 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  n a range of row
d420: 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ids in a table s
d430: 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  can..  */.  pTer
d440: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
d450: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
d460: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
d470: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  E|WO_GT|WO_GE, 0
d480: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
d490: 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65  {.    if( findTe
d4a0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
d4b0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
d4c0: 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20  T|WO_LE, 0) ){. 
d4d0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
d4e0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
d4f0: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20       cost /= 3; 
d500: 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
d510: 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e  owid<EXPR elimin
d520: 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
d530: 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d  or rows */.    }
d540: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
d550: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
d560: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
d570: 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_GE, 0) ){.  
d580: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
d590: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
d5a0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20      cost /= 3;  
d5b0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
d5c0: 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid>EXPR elimina
d5d0: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
d5e0: 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  f rows */.    }.
d5f0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
d600: 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65  "... rowid range
d610: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
d620: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
d630: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
d640: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lags = 0;.  }.. 
d650: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
d660: 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73   scan does not s
d670: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
d680: 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72   BY clause, incr
d690: 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ease.  ** the co
d6a0: 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63  st by NlogN to c
d6b0: 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65  over the expense
d6c0: 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a   of sorting. */.
d6d0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
d6e0: 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62  {.    if( sortab
d6f0: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
d700: 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70  pOrderBy, pWC->p
d710: 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29  MaskSet, &rev) )
d720: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
d730: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57   WHERE_ORDERBY|W
d740: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
d750: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20  ;.      if( rev 
d760: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
d770: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
d780: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
d790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74  else{.      cost
d7a0: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
d7b0: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 57 48 45  cost);.      WHE
d7c0: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f  RETRACE(("... so
d7d0: 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20  rting increases 
d7e0: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
d7f0: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   cost));.    }. 
d800: 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f   }.  if( cost<lo
d810: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
d820: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
d830: 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73  t;.    bestFlags
d840: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
d850: 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
d860: 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
d870: 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
d880: 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
d890: 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
d8a0: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
d8b0: 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
d8c0: 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
d8d0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
d8e0: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
d8f0: 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
d900: 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
d910: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
d920: 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
d930: 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
d940: 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
d950: 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
d960: 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
d970: 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
d980: 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  f( (pSrc->jointy
d990: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
d9a0: 20 29 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61   ){.    eqTermMa
d9b0: 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
d9c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
d9d0: 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
d9e0: 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
d9f0: 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  L;.  }..  /* Loo
da00: 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e  k at each index.
da10: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50  .  */.  for(; pP
da20: 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
da30: 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  obe->pNext){.   
da40: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
da60: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
da70: 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75  .    double inMu
da80: 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20  ltiplier = 1;.. 
da90: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
daa0: 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22  ... index %s:\n"
dab0: 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29  , pProbe->zName)
dac0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74  );..    /* Count
dad0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
dae0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
daf0: 64 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74  dex that are sat
db00: 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79  isfied.    ** by
db10: 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69   x=EXPR constrai
db20: 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  nts or x IN (...
db30: 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  ) constraints.. 
db40: 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20     */.    flags 
db50: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
db60: 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  ; i<pProbe->nCol
db70: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
db80: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
db90: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
dba0: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
dbb0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
dbc0: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54  j, notReady, eqT
dbd0: 65 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29  ermMask, pProbe)
dbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
dbf0: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
dc00: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
dc10: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
dc20: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
dc30: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
dc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
dc50: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
dc60: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
dc70: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
dc80: 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
dc90: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
dca0: 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  lect!=0 ){.     
dcb0: 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65       inMultiplie
dcc0: 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  r *= 25;.       
dcd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
dce0: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
dcf0: 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70          inMultip
dd00: 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70  lier *= pExpr->p
dd10: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b  List->nExpr + 1;
dd20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dd30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73   }.    }.    cos
dd40: 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
dd50: 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74  wEst[i] * inMult
dd60: 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28  iplier * estLog(
dd70: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20  inMultiplier);. 
dd80: 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20     nEq = i;.    
dd90: 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72  if( pProbe->onEr
dda0: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
ddb0: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
ddc0: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20  OLUMN_IN)==0.   
ddd0: 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50        && nEq==pP
dde0: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
ddf0: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
de00: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
de10: 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41    }.    WHERETRA
de20: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d  CE(("...... nEq=
de30: 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63  %d inMult=%.9g c
de40: 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c  ost=%.9g\n",nEq,
de50: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 63 6f 73  inMultiplier,cos
de60: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  t));..    /* Loo
de70: 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73  k for range cons
de80: 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20  traints.    */. 
de90: 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62     if( nEq<pProb
dea0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
deb0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
dec0: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
ded0: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
dee0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
def0: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
df00: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
df10: 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
df20: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
df30: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66  erm ){.        f
df40: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
df50: 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
df60: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
df70: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
df80: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
df90: 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_LE, pProbe) ){
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
dfb0: 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
dfc0: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
dfd0: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
dfe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
dff0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
e000: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
e010: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50   WO_GT|WO_GE, pP
e020: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
e030: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
e040: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
e050: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
e060: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e070: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
e080: 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65  "...... range re
e090: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
e0a0: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
e0b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e0c0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64    /* Add the add
e0d0: 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20  itional cost of 
e0e0: 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20  sorting if that 
e0f0: 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20  is a factor..   
e100: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
e110: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
e120: 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
e130: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26  _COLUMN_IN)==0 &
e140: 26 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53  &.           isS
e150: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
e160: 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  se,pWC->pMaskSet
e170: 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72  ,pProbe,iCur,pOr
e180: 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20  derBy,nEq,&rev) 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
e1a0: 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
e1b0: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45       flags = WHE
e1c0: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
e1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e1e0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
e1f0: 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
e200: 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
e210: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
e220: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
e230: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e250: 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
e260: 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
e270: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
e280: 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e  ..... orderby in
e290: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
e2a0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
e2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e2c0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
e2d0: 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65  see if we can ge
e2e0: 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e  t away with usin
e2f0: 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
e300: 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
e310: 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  ever reading the
e320: 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74   table.  If that
e330: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
e340: 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20  en halve the.   
e350: 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73   ** cost of this
e360: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
e370: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20     if( flags && 
e380: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20  pSrc->colUsed < 
e390: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
e3a0: 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20  BMS-1)) ){.     
e3b0: 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
e3c0: 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
e3d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
e3e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65  or(j=0; j<pProbe
e3f0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
e400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
e410: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
e420: 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
e430: 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
e440: 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
e450: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
e460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e470: 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
e480: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
e490: 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
e4a0: 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73  NLY;.        cos
e4b0: 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  t /= 2;.        
e4c0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
e4d0: 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64  ... idx-only red
e4e0: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
e4f0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
e500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e510: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65   /* If this inde
e520: 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20 74  x has achieved t
e530: 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73  he lowest cost s
e540: 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20  o far, then use 
e550: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
e560: 66 28 20 66 6c 61 67 73 20 26 26 20 63 6f 73 74  f( flags && cost
e570: 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b   < lowestCost ){
e580: 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d  .      bestIdx =
e590: 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c   pProbe;.      l
e5a0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
e5b0: 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c 61 67  ;.      bestFlag
e5c0: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  s = flags;.     
e5d0: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
e5e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e5f0: 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20  Report the best 
e600: 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70  result.  */.  *p
e610: 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78  pIndex = bestIdx
e620: 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
e630: 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25  "best index is %
e640: 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c  s, cost=%.9g, fl
e650: 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e  ags=%x, nEq=%d\n
e660: 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73 74 49  ",.        bestI
e670: 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e  dx ? bestIdx->zN
e680: 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20  ame : "(none)", 
e690: 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74  lowestCost, best
e6a0: 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29  Flags, bestNEq))
e6b0: 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65  ;.  *pFlags = be
e6c0: 73 74 46 6c 61 67 73 20 7c 20 65 71 54 65 72 6d  stFlags | eqTerm
e6d0: 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71 20 3d 20  Mask;.  *pnEq = 
e6e0: 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72  bestNEq;.  retur
e6f0: 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a  n lowestCost;.}.
e700: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
e710: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
e720: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
e730: 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
e740: 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
e750: 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
e760: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e770: 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
e780: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
e790: 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
e7a0: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
e7b0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
e7c0: 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
e7d0: 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
e7e0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
e7f0: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
e800: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
e810: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
e820: 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
e830: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
e840: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
e850: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
e860: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
e870: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
e880: 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
e890: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
e8a0: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
e8b0: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
e8c0: 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
e8d0: 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
e8e0: 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
e8f0: 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
e900: 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
e910: 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
e920: 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
e930: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
e940: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
e950: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
e960: 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
e970: 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
e980: 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
e990: 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
e9a0: 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
e9b0: 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
e9c0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
e9d0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
e9e0: 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
e9f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
ea00: 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
ea10: 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
ea20: 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
ea30: 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
ea40: 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
ea50: 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
ea60: 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
ea70: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
ea80: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
ea90: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
eaa0: 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
eab0: 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
eac0: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
ead0: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
eae0: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
eaf0: 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
eb00: 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
eb10: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
eb20: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
eb30: 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
eb40: 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
eb50: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
eb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
eb70: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
eb80: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
eb90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
eba0: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
ebb0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
ebc0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
ebd0: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
ebe0: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
ebf0: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
ec00: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
ec10: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
ec20: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
ec30: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
ec40: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
ec50: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
ec60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
ec70: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
ec80: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
ec90: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
eca0: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
ecb0: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
ecc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
ecd0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
ece0: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
ecf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ed00: 0a 2a 2a 20 41 70 70 6c 79 20 74 68 65 20 61 66  .** Apply the af
ed10: 66 69 6e 69 74 69 65 73 20 61 73 73 6f 63 69 61  finities associa
ed20: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
ed30: 73 74 20 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  st n columns of 
ed40: 69 6e 64 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f  index.** pIdx to
ed50: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74   the values in t
ed60: 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
ed70: 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
ed80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ed90: 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
eda0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
edb0: 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
edc0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
edd0: 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
ede0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
edf0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 61 73  e->pVdbe;.    as
ee00: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
ee10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee20: 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
ee30: 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
ee40: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
ee50: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
ee60: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  x);.    sqlite3E
ee70: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
ee80: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
ee90: 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
eea0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
eeb0: 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
eec0: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
eed0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
eee0: 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
eef0: 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
ef00: 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
ef10: 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
ef20: 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
ef30: 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
ef40: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
ef50: 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
ef60: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
ef70: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
ef80: 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
ef90: 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
efa0: 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
efb0: 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
efc0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
efd0: 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
efe0: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
eff0: 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
f000: 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
f010: 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
f020: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
f030: 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
f040: 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
f050: 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
f060: 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
f070: 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
f080: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
f090: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
f0a0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
f0b0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
f0c0: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
f0d0: 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
f0e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
f0f0: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
f100: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
f110: 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
f120: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
f130: 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
f140: 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   on */.  int iTa
f150: 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
f160: 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
f170: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
f180: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
f190: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
f1a0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
f1b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f1c0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
f1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f1e0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
f1f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
f200: 2f 0a 0a 20 20 69 66 28 20 69 54 61 72 67 65 74  /..  if( iTarget
f210: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 67 20  <=0 ){.    iReg 
f220: 3d 20 69 54 61 72 67 65 74 20 3d 20 73 71 6c 69  = iTarget = sqli
f230: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f240: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  arse);.  }.  if(
f250: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
f260: 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
f270: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
f280: 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
f290: 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
f2a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
f2b0: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
f2c0: 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
f2d0: 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
f2e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f2f0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
f300: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f310: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
f320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f330: 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
f340: 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
f350: 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20  InLoop *pIn;..  
f360: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
f370: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
f380: 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
f390: 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
f3a0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
f3b0: 61 72 73 65 2c 20 70 58 2c 20 31 29 3b 0a 20 20  arse, pX, 1);.  
f3c0: 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
f3d0: 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
f3e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f3f0: 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
f400: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
f410: 6e 74 28 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70  nt((v, "%.*s", p
f420: 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73  X->span.n, pX->s
f430: 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 69 66 28  pan.z));.    if(
f440: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20   pLevel->nIn==0 
f450: 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
f460: 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  >nxt = sqlite3Vd
f470: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f480: 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
f490: 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  ->nIn++;.    pLe
f4a0: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73  vel->aInLoop = s
f4b0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
f4c0: 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
f4d0: 2c 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  , pLevel->aInLoo
f4e0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
f510: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d  evel->aInLoop[0]
f520: 29 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a  )*pLevel->nIn);.
f530: 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
f540: 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  ->aInLoop;.    i
f550: 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
f560: 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  pIn += pLevel->n
f570: 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
f580: 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
f590: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
f5a0: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
f5b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
f5c0: 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
f5d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f5e0: 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
f5f0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
f600: 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
f610: 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
f620: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f630: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
f640: 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
f650: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f660: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f670: 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20  IsNull, iReg);. 
f680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f690: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
f6a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f6b0: 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
f6c0: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
f6d0: 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
f6e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f6f0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f700: 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
f710: 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
f720: 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
f730: 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  ex.  The values 
f740: 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
f750: 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20  nts are left on 
f760: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
f770: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
f780: 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
f790: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
f7a0: 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
f7b0: 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
f7c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
f7d0: 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
f7e0: 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
f7f0: 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
f800: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
f810: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
f820: 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
f830: 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
f840: 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
f850: 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
f860: 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
f870: 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
f880: 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
f890: 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
f8a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f8b0: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
f8c0: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
f8d0: 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
f8e0: 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
f8f0: 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
f900: 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66  nd b will be lef
f910: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
f920: 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64 65 65  k - a is the dee
f930: 70 65 73 74 20 61 6e 64 20 62 20 74 68 65 20 73  pest and b the s
f940: 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a  hallowest..**.**
f950: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
f960: 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
f970: 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
f980: 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
f990: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
f9a0: 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
f9b0: 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
f9c0: 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
f9d0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
f9e0: 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
f9f0: 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
fa00: 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
fa10: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a   memory cell..**
fa20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fa30: 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
fa40: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
fa50: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70  emory cell and p
fa60: 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65  uts.** the addre
fa70: 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ss of that memor
fa80: 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c  y cell in pLevel
fa90: 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64  ->iMem.  The cod
faa0: 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
fab0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
fac0: 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  l use pLevel->iM
fad0: 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  em to store the 
fae0: 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
faf0: 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
fb00: 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
fb10: 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
fb20: 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
fb30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
fb40: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
fb50: 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
fb60: 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
fb70: 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  ernal.** use..*/
fb80: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
fb90: 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
fba0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
fbb0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
fbc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
fbd0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
fbe0: 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
fbf0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
fc00: 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
fc10: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
fc20: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
fc30: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
fc40: 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
fc50: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
fc60: 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
fc70: 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
fc80: 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
fc90: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
fca0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg         /* Nu
fcb0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
fcc0: 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
fcd0: 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
fce0: 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
fcf0: 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
fd00: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
fd10: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
fd20: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
fd30: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
fd40: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
fd50: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
fd60: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
fd70: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
fd80: 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
fd90: 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
fda0: 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
fdb0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
fdc0: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
fdd0: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
fde0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
fdf0: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
fe00: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
fe10: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
fe20: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
fe30: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
fe40: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe60: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
fe70: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
fea0: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r */..  /* Figur
feb0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
fec0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
fed0: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
fee0: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
fef0: 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
ff00: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
ff10: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
ff20: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
ff30: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
ff40: 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
ff50: 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
ff60: 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
ff70: 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
ff80: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
ff90: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
ffa0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
ffb0: 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
ffc0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 32 3b 0a 20  rse->nMem + 2;. 
ffd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
ffe0: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 2b 20 32   pLevel->nEq + 2
fff0: 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 0a 20   + nExtraReg;.. 
10000 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
10010 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
10020 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
10030 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
10040 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
10050 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
10060 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
10070 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
10080 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
10090 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
100a0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
100b0 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
100c0 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78 29 3b  l->flags, pIdx);
100d0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  .    if( pTerm==
100e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  0 ) break;.    a
100f0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
10100 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
10110 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20  D)==0 );.    r1 
10120 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
10130 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
10140 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
10150 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
10160 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
10170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10180 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
10190 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
101a0 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  j);.    }.    te
101b0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
101c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
101d0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
101e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
101f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
10200 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
10210 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
10220 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
10230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10240 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10250 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
10260 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
10270 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  brk);.    }.  }.
10280 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
10290 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
102a0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
102b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
102c0 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
102d0 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
102e0 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
102f0 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
10300 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
10310 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
10320 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
10330 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
10340 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
10350 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
10360 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
10370 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
10380 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
10390 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
103a0 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
103b0 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
103c0 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
103d0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
103e0 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
103f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10400 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
10410 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
10420 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
10430 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
10440 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  /.../*.** Free a
10450 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
10460 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
10470 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
10480 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  e(WhereInfo *pWI
10490 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e  nfo){.  if( pWIn
104a0 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  fo ){.    int i;
104b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
104c0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
104d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
104e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
104f0 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e  pInfo = pWInfo->
10500 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[i].pIdxInfo;. 
10510 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29       if( pInfo )
10520 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10530 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
10540 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a  reeIdxStr==0 );.
10550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10560 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20  free(pInfo);.   
10570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
10580 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 49 6e  qlite3_free(pWIn
10590 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  fo);.  }.}.../*.
105a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
105b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
105c0 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
105d0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
105e0 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
105f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
10600 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
10610 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
10620 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
10630 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
10640 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
10650 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
10660 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
10670 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
10680 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
10690 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
106a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
106b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
106c0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
106d0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
106e0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
106f0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
10700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10710 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
10720 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
10730 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
10740 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
10750 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
10760 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
10770 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
10780 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
10790 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
107a0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
107b0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
107c0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
107d0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
107e0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
107f0 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
10800 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
10810 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
10820 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
10830 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
10840 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
10850 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
10860 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
10870 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
10880 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
10890 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
108a0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
108b0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
108c0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
108d0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
108e0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
108f0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
10900 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
10910 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
10920 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
10930 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
10940 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
10950 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
10960 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
10970 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
10980 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
109b0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
109c0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
109f0 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
10a00 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
10a10 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
10a20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
10a30 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
10a40 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
10a50 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
10a60 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
10a70 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
10a80 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
10a90 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
10aa0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
10ab0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
10ac0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
10ad0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
10ae0 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
10af0 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
10b00 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
10b10 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
10b20 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10b30 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
10b40 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
10b50 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
10b60 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
10b70 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
10b80 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
10b90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
10ba0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
10bb0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
10bc0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
10bd0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
10be0 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
10bf0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
10c00 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
10c10 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
10c20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
10c30 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
10c40 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
10c50 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
10c60 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
10c70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10c80 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
10c90 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
10ca0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
10cb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
10cc0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
10cd0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
10ce0 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
10cf0 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
10d00 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
10d10 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
10d20 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
10d30 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
10d40 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
10d50 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
10d60 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
10d70 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
10d80 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
10d90 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
10da0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
10db0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
10dc0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
10dd0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
10de0 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
10df0 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
10e00 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
10e10 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
10e20 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
10e30 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
10e40 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
10e50 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
10e60 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
10e70 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
10e80 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
10e90 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
10ea0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
10eb0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
10ec0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
10ed0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
10ee0 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
10ef0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
10f00 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
10f10 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
10f20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10f30 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
10f40 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
10f50 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
10f60 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
10f70 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
10f80 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
10f90 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
10fa0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** 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 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
10fd0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
10fe0 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
10ff0 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
11000 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
11010 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
11020 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
11030 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
11040 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
11050 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
11060 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
11070 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
11080 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
11090 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
110a0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
110b0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
110c0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
110d0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
110e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
110f0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
11100 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
11110 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
11120 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
11130 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
11140 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
11150 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
11160 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
11170 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
11180 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
11190 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
111a0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
111b0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
111c0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
111d0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
111e0 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
111f0 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
11200 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
11210 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
11220 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
11230 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
11240 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
11250 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
11260 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
11270 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
11280 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
11290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
112a0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
112b0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
112c0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
112d0 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
112e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
112f0 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
11300 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
11310 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
11320 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
11330 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
11340 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
11350 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
11360 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
11370 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
11380 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
11390 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
113a0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
113b0 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
113c0 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
113d0 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
113e0 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
113f0 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
11400 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
11410 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
11420 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
11430 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
11440 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
11450 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
11460 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
11470 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
11480 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
11490 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
114a0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
114b0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
114c0 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
114d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
114e0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
114f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
11500 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
11510 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
11520 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
11530 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
11540 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
11550 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11560 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11570 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
11580 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  , /* An ORDER BY
11590 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
115a0 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61 67 73 20   */.  u8 wflags 
115b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
115c0 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
115d0 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
115e0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
115f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
11620 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  r */.  WhereInfo
11630 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
11640 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
11650 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11660 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
11670 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
11680 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11690 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
116a0 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
116b0 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20  e */.  int brk, 
116c0 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  cont = 0;       
116d0 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75    /* Addresses u
116e0 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20  sed during code 
116f0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
11700 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
11710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
11720 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
11730 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
11740 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  d */.  WhereTerm
11750 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
11760 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
11770 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
11780 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11790 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b  MaskSet maskSet;
117a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
117b0 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
117c0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
117d0 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
117e0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
117f0 6c 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64  lause is divided
11800 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d   into these term
11810 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
11820 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
11830 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67  Item;  /* A sing
11840 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54  le entry from pT
11850 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
11860 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
11870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11880 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
11890 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74   the pWInfo list
118a0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b   */.  int iFrom;
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
118d0 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
118e0 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
118f0 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
11900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
11910 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
11920 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c  of all wc.a[].fl
11930 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
11940 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
11950 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11960 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
11970 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
11980 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  By = 0;..  /* Th
11990 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
119a0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
119b0 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
119c0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
119d0 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
119e0 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
119f0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
11a00 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
11a10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11a20 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
11a30 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
11a40 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
11a50 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
11a60 20 69 66 28 20 70 70 4f 72 64 65 72 42 79 20 29   if( ppOrderBy )
11a70 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
11a80 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   *ppOrderBy;.  }
11a90 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
11aa0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
11ab0 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
11ac0 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
11ad0 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
11ae0 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
11af0 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
11b00 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
11b10 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61   initMaskSet(&ma
11b20 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
11b30 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70  lauseInit(&wc, p
11b40 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74 29  Parse, &maskSet)
11b50 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11b60 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
11b70 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
11b80 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20  whereSplit(&wc, 
11b90 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
11ba0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .    .  /* Alloc
11bb0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
11bc0 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
11bd0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
11be0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
11bf0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
11c00 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  e..  */.  db = p
11c10 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 49  Parse->db;.  pWI
11c20 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
11c30 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 20 0a  allocZero(db,  .
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
11c60 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69  reInfo) + pTabLi
11c70 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28  st->nSrc*sizeof(
11c80 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
11c90 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11ca0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
11cb0 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d   whereBeginNoMem
11cc0 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
11cd0 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73  nLevel = pTabLis
11ce0 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66  t->nSrc;.  pWInf
11cf0 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
11d00 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
11d10 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
11d20 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
11d30 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
11d40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
11d50 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
11d60 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
11d70 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
11d80 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
11d90 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
11da0 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
11db0 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
11dc0 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
11dd0 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
11de0 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c  pWhere && (pTabL
11df0 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20  ist->nSrc==0 || 
11e00 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
11e10 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68  stantNotJoin(pWh
11e20 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
11e30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
11e40 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
11e50 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
11e60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
11e70 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  L);.    pWhere =
11e80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73   0;.  }..  /* As
11e90 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
11ea0 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
11eb0 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
11ec0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
11ed0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73  **.  ** When ass
11ee0 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76  igning bitmask v
11ef0 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c  alues to FROM cl
11f00 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74  ause cursors, it
11f10 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68   must be.  ** th
11f20 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58  e case that if X
11f30 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
11f40 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f  for the N-th FRO
11f50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  M clause term th
11f60 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d  en.  ** the bitm
11f70 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ask for all FROM
11f80 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f   clause terms to
11f90 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
11fa0 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20   N-th term.  ** 
11fb0 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65  is (X-1).   An e
11fc0 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
11fd0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
11fe0 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  a LEFT JOIN can 
11ff0 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70  use.  ** its Exp
12000 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
12010 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20  e value to find 
12020 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74  the bitmask of t
12030 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
12040 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e   ** of the join.
12050 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e    Subtracting on
12060 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74  e from the right
12070 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67   table bitmask g
12080 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d  ives a.  ** bitm
12090 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  ask for all tabl
120a0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
120b0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f  f the join.  Kno
120c0 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b  wing the bitmask
120d0 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61  .  ** for all ta
120e0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
120f0 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
12100 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  is important.  T
12110 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a  icket #3015..  *
12120 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
12130 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
12140 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
12150 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
12160 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
12170 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
12180 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
12190 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
121a0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
121b0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
121c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
121d0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
121e0 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
121f0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
12200 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
12210 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
12220 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
12230 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
12240 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
12250 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
12260 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
12270 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
12280 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
12290 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
122a0 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
122b0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
122c0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
122d0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
122e0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
122f0 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
12300 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
12310 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
12320 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
12330 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
12340 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
12350 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
12360 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
12370 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
12380 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
12390 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20 69  bList, &wc);.  i
123a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
123b0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
123c0 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
123d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
123e0 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
123f0 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
12400 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
12410 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
12420 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
12430 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
12440 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
12450 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
12460 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
12470 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
12480 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
12490 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
124a0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66     pWInfo->a[].f
124b0 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78  lags     WHERE_x
124c0 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
124d0 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
124e0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
124f0 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
12500 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
12510 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
12520 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
12530 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e  ].iFrom     When
12540 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
12550 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
12560 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
12570 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
12580 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
12590 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
125a0 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
125b0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
125c0 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
125d0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
125e0 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a   index.  **.  **
125f0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
12600 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
12610 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
12620 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
12630 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
12640 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
12650 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
12660 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
12670 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
12680 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
12690 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
126a0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
126b0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
126c0 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
126d0 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
126e0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
126f0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
12700 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
12710 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
12720 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
12730 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
12740 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
12750 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
12760 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
12770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12780 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77  gs asssociated w
12790 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  ith pIdx */.    
127a0 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
127b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
127c0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
127d0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
127e0 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
127f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12800 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72   /* The cost for
12810 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
12820 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
12830 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
12840 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
12850 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
12860 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
12870 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
12880 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65  he best index se
12890 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
128a0 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
128b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
128c0 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
128d0 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
128e0 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d     int bestNEq =
128f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
12900 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64  * nEq associated
12910 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
12920 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74     double lowest
12930 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
12940 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42  * Cost of the pB
12950 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
12960 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20  estJ = 0;       
12970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
12980 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
12990 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
129a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
129b0 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
129c0 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
129d0 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b     int once = 0;
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
129f0 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73  * True when firs
12a00 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20  t table is seen 
12a10 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
12a20 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 64 65  ndex_info *pInde
12a30 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 69  x; /* Current vi
12a40 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a  rtual index */..
12a50 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
12a60 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
12a70 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
12a80 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
12a90 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
12aa0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
12ab0 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
12ac0 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52        int doNotR
12ad0 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65  eorder;  /* True
12ae0 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73   if this table s
12af0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f  hould not be reo
12b00 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20 20  rdered */..     
12b10 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20   doNotReorder = 
12b20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e   (pTabItem->join
12b30 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
12b40 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20  JT_CROSS))!=0;. 
12b50 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26       if( once &&
12b60 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
12b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d  break;.      m =
12b80 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
12b90 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
12ba0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
12bb0 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d   (m & notReady)=
12bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
12bd0 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
12be0 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  om++;.        co
12bf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
12c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
12c10 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
12c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12c40 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
12c50 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
12c60 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
12c70 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12c80 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d  fo **ppIdxInfo =
12c90 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70   &pWInfo->a[j].p
12ca0 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12cb0 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72 74   cost = bestVirt
12cc0 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
12cd0 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
12ce0 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65            ppOrde
12d10 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79  rBy ? *ppOrderBy
12d20 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20   : 0, i==0,.    
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 70 70 49 64              ppId
12d50 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  xInfo);.        
12d60 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  flags = WHERE_VI
12d70 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20  RTUALTABLE;.    
12d80 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a 70 70      pIndex = *pp
12d90 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12da0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12db0 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79 43 6f  Index->orderByCo
12dc0 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20  nsumed ){.      
12dd0 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
12de0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c  E_VIRTUALTABLE |
12df0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
12e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e10 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
12e20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20      nEq = 0;.   
12e30 20 20 20 20 20 69 66 28 20 28 53 51 4c 49 54 45       if( (SQLITE
12e40 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c 63 6f  _BIG_DBL/2.0)<co
12e50 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
12e60 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
12e70 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
12e80 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
12e90 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
12ea0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
12eb0 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
12ec0 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
12ed0 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
12ee0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
12ef0 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77  ** the (cost<low
12f00 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
12f10 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
12f20 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 20  e true and.     
12f30 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c 2d 3e       ** pLevel->
12f40 70 42 65 73 74 49 64 78 20 6e 65 76 65 72 20 73  pBestIdx never s
12f50 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  et..          */
12f60 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74   .          cost
12f70 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
12f80 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20 20 20  BL/2.0);.       
12f90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a   }.      }else .
12fa0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
12fb0 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
12fc0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
12fd0 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  &wc, pTabItem, n
12fe0 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64    (i==0 && ppOrd
13010 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72  erBy) ? *ppOrder
13020 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  By : 0,.        
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20   &pIdx, &flags, 
13050 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70  &nEq);.        p
13060 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
13070 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73   }.      if( cos
13080 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  t<lowestCost ){.
13090 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31          once = 1
130a0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74  ;.        lowest
130b0 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
130c0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
130d0 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46  x;.        bestF
130e0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
130f0 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20        bestNEq = 
13100 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73  nEq;.        bes
13110 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
13120 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13130 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
13140 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 4e   }.      if( doN
13150 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61  otReorder ) brea
13160 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45  k;.    }.    WHE
13170 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
13180 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74  timizer choose t
13190 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70  able %d for loop
131a0 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20   %d\n", bestJ,. 
131b0 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
131c0 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20  -pWInfo->a));.  
131d0 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73    if( (bestFlags
131e0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
131f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  )!=0 ){.      *p
13200 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
13210 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
13220 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20   &= bestFlags;. 
13230 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73     pLevel->flags
13240 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
13250 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d    pLevel->pIdx =
13260 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76   pBest;.    pLev
13270 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45  el->nEq = bestNE
13280 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  q;.    pLevel->a
13290 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  InLoop = 0;.    
132a0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
132b0 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29  .    if( pBest )
132c0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
132d0 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
132e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
132f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
13300 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
13310 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
13320 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
13330 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
13340 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
13350 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
13360 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
13370 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  ;.  }.  WHERETRA
13380 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
13390 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
133a0 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n"));..  /* If t
133b0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
133c0 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
133d0 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
133e0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
133f0 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
13400 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
13410 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
13420 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
13430 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  & ppOrderBy ){. 
13440 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
13450 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
13460 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
13470 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
13480 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
13490 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
134a0 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
134b0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
134c0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
134d0 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
134e0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
134f0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
13500 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
13510 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
13520 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74  nstraints.  ** t
13530 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
13540 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20  update a single 
13550 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  row..  */.  asse
13560 72 74 28 20 28 77 66 6c 61 67 73 20 26 20 57 48  rt( (wflags & WH
13570 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
13580 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
13590 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
135a0 20 20 69 66 28 20 28 77 66 6c 61 67 73 20 26 20    if( (wflags & 
135b0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
135c0 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e  SIRED)!=0 && (an
135d0 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  dFlags & WHERE_U
135e0 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
135f0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
13600 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e  ss = 1;.    pWIn
13610 66 6f 2d 3e 61 5b 30 5d 2e 66 6c 61 67 73 20 26  fo->a[0].flags &
13620 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
13630 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
13640 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
13650 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
13660 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
13670 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
13680 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
13690 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
136a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
136b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
136c0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
136d0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
136e0 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
136f0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
13700 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
13710 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
13720 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
13730 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
13740 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
13750 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b  .    Index *pIx;
13760 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
13770 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54  sed to access pT
13780 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  ab (if any) */. 
13790 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
137a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
137b0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
137c0 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
137d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
137e0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
137f0 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53  xCur;..#ifndef S
13800 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
13810 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  IN.    if( pPars
13820 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
13830 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
13840 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  g;.      struct 
13850 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
13860 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
13870 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
13880 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ];.      zMsg = 
13890 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
138a0 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70  b, "TABLE %s", p
138b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
138c0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
138d0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
138e0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
138f0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 41  Printf(db, "%z A
13900 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
13910 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
13920 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
13930 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
13940 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
13950 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
13960 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
13970 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20  WITH INDEX %s", 
13980 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  zMsg, pIx->zName
13990 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
139a0 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
139b0 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
139c0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
139d0 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ANGE) ){.       
139e0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
139f0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 55  Printf(db, "%z U
13a00 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
13a10 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
13a20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13a30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13a40 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  LE.      else if
13a50 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  ( pLevel->pBestI
13a60 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
13a70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13a80 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
13a90 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
13aa0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
13ab0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13ac0 20 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42   "%z VIRTUAL TAB
13ad0 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
13ae0 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
13af0 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13b00 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65  Idx->idxNum, pBe
13b10 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  stIdx->idxStr);.
13b20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13b30 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
13b40 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  >flags & WHERE_O
13b50 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
13b60 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
13b70 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
13b80 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29  ORDER BY", zMsg)
13b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13bb0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
13bc0 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
13bd0 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  m, 0, zMsg, P4_D
13be0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
13bf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13c00 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
13c10 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
13c20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
13c30 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
13c40 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
13c50 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
13c60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13c70 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13c80 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13c90 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
13ca0 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
13cb0 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
13cc0 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
13cd0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13ce0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c  TABLE.    if( pL
13cf0 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29  evel->pBestIdx )
13d00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  {.      int iCur
13d10 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
13d20 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
13d30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13d40 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
13d50 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13d70 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62  const char*)pTab
13d80 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42  ->pVtab, P4_VTAB
13d90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
13da0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
13db0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13dc0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
13dd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
13de0 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
13df0 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
13e00 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
13e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13e20 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
13e30 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
13e40 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
13e50 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  p);.      if( !p
13e60 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
13e70 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28   && pTab->nCol<(
13e80 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
13e90 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  8) ){.        Bi
13ea0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
13eb0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
13ec0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
13ed0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
13ee0 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
13ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13f00 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73  dbeChangeP2(v, s
13f10 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13f20 74 41 64 64 72 28 76 29 2d 32 2c 20 6e 29 3b 0a  tAddr(v)-2, n);.
13f30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13f40 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
13f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13f60 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
13f70 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
13f80 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
13f90 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
13fa0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
13fb0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
13fc0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
13fd0 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78  or;.    if( (pIx
13fe0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29   = pLevel->pIdx)
13ff0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  !=0 ){.      Key
14000 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
14010 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
14020 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
14030 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
14040 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
14050 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
14060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14070 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  Op2(v, OP_SetNum
14080 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 49 78 2d  Columns, 0, pIx-
14090 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20  >nColumn+1);.   
140a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
140b0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
140c0 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49  ead, iIdxCur, pI
140d0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
14100 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
14110 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
14120 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
14130 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
14140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14150 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
14160 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
14170 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
14180 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
14190 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
141a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
141b0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
141c0 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
141d0 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
141e0 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
141f0 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
14200 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
14210 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
14220 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
14230 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
14240 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
14250 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  sk)0;.  for(i=0,
14260 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
14270 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
14280 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
14290 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
142a0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
142b0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
142c0 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63  ;  /* The VDBE c
142d0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
142e0 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ble */.    Index
142f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a   *pIdx;       /*
14300 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
14310 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
14320 20 20 20 69 6e 74 20 6e 78 74 3b 20 20 20 20 20     int nxt;     
14330 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
14340 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
14350 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
14360 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20   IN case */.    
14370 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
14380 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
14390 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
143a0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  dex */.    int o
143b0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a  mitTable;     /*
143c0 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
143d0 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
143e0 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20  /.    int bRev; 
143f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14400 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
14410 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
14420 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61  rder */..    pTa
14430 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
14440 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
14450 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  om];.    iCur = 
14460 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
14470 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  r;.    pIdx = pL
14480 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
14490 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
144a0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62  ->iIdxCur;.    b
144b0 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  Rev = (pLevel->f
144c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
144d0 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d  ERSE)!=0;.    om
144e0 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
144f0 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
14500 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a  _IDX_ONLY)!=0;..
14510 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
14520 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
14530 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
14540 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
14550 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
14560 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
14570 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72  ump to brk to br
14580 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
14590 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74  p..    ** Jump t
145a0 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
145b0 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
145c0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
145d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  f the.    ** loo
145e0 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p..    **.    **
145f0 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
14600 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
14610 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 6e  e also have a "n
14620 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
14630 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63     ** means to c
14640 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
14650 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
14660 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
14670 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61  n.    ** there a
14680 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
14690 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
146a0 61 69 6e 74 73 2c 20 74 68 65 20 22 6e 78 74 22  aints, the "nxt"
146b0 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a 20 69 73   label.    ** is
146c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 62 72   the same as "br
146d0 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62  k"..    */.    b
146e0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b  rk = pLevel->brk
146f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d   = pLevel->nxt =
14700 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14710 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f  Label(v);.    co
14720 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
14730 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14740 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
14750 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14760 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
14770 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
14780 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
14790 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  nd.    ** initia
147a0 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
147b0 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
147c0 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
147d0 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a  tches any.    **
147e0 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
147f0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
14800 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
14810 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
14820 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
14830 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
14840 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
14850 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
14860 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
14870 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
14880 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14890 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
148a0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
148b0 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  in);.      VdbeC
148c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
148d0 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
148e0 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  tch flag"));.   
148f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14900 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14910 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65  ABLE.    if( pLe
14920 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b  vel->pBestIdx ){
14930 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 30  .      /* Case 0
14940 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
14950 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
14960 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
14970 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
14980 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
14990 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
149a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
149b0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
149c0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
149d0 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
149e0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  lter */.      sq
149f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14a00 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
14a10 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
14a20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72       int nConstr
14a30 61 69 6e 74 20 3d 20 70 42 65 73 74 49 64 78 2d  aint = pBestIdx-
14a40 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
14a50 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
14a60 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14a70 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
14a80 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
14ac0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14ad0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74  ;.      const st
14ae0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14af0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61  ex_constraint *a
14b00 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20  Constraint =.   
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14b40 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72  BestIdx->aConstr
14b50 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 69 52 65  aint;..      iRe
14b60 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
14b70 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
14b80 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
14b90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
14ba0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
14bb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
14bc0 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
14bd0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
14be0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
14bf0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
14c00 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
14c10 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
14c20 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20  k].argvIndex==j 
14c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14c40 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
14c50 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f  traint[k].iTermO
14c60 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
14c70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
14c80 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
14c90 68 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  he );.          
14ca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14cb0 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b 69  e(pParse, wc.a[i
14cc0 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69  Term].pExpr->pRi
14cd0 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a  ght, iReg+j+1);.
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14cf0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
14d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14d10 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61   if( k==nConstra
14d20 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  int ) break;.   
14d30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
14d40 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
14d50 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20 20  leColCache );.  
14d60 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
14d70 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
14d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14da0 65 67 65 72 2c 20 70 42 65 73 74 49 64 78 2d 3e  eger, pBestIdx->
14db0 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
14dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14de0 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b  eger, j-1, iReg+
14df0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14e00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14e10 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
14e20 20 62 72 6b 2c 20 69 52 65 67 2c 20 70 42 65 73   brk, iReg, pBes
14e30 74 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  tIdx->idxStr,.  
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
14e60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
14e70 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
14e80 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
14e90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14ea0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
14eb0 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
14ec0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 70 42  int+2);.      pB
14ed0 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  estIdx->needToFr
14ee0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
14ef0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
14f00 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
14f10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
14f20 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
14f30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
14f40 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
14f50 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[j].iTermOffset
14f60 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 61  ;.          disa
14f70 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
14f80 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20  &wc.a[iTerm]);. 
14f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14fa0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
14fb0 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
14fc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
14fd0 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
14fe0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
14ff0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15000 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  (v);.    }else.#
15010 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15020 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15030 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4c  E */..    if( pL
15040 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
15050 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
15060 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
15070 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
15080 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
15090 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
150a0 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  n.      **      
150b0 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
150c0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
150d0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
150e0 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20    Or.      **   
150f0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
15100 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
15110 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
15120 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20   IN (...)".     
15130 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
15140 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f  struct..      */
15150 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
15160 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
15170 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
15180 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15190 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
151a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
151b0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  erm!=0 );.      
151c0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
151d0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
151e0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
151f0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
15200 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15210 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
15220 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 63 6f 64  ;.      r1 = cod
15230 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
15240 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
15250 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e  vel, 0);.      n
15260 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74  xt = pLevel->nxt
15270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15280 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15290 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 6e  MustBeInt, r1, n
152a0 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
152b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
152c0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
152d0 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20 20  ur, nxt, r1);.  
152e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
152f0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
15300 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
15310 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
15320 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
15330 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
15340 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  D_RANGE ){.     
15350 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
15360 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
15370 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
15380 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
15390 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
153a0 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
153b0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
153c0 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
153d0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
153e0 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
153f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
15400 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
15410 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
15420 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
15430 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
15440 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
15450 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
15460 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
15470 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
15480 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
15490 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
154a0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
154b0 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  pStart;.        
154c0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
154d0 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54         pEnd = pT
154e0 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
154f0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
15500 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15510 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  X;.        int r
15520 31 2c 20 72 65 67 46 72 65 65 31 3b 0a 20 20 20  1, regFree1;.   
15530 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74       pX = pStart
15540 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
15550 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
15560 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15570 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
15580 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
15590 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
155a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
155b0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
155c0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
155d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
155e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
155f0 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20 62 72 6b  orceInt, r1, brk
15600 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pX->op==TK_LE ||
15630 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b   pX->op==TK_GT);
15640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15650 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62 52  VdbeAddOp3(v, bR
15660 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a  ev ? OP_MoveLt :
15670 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
15680 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20  , brk, r1);.    
15690 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
156a0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
156b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
156c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
156d0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20  , regFree1);.   
156e0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
156f0 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29  (pLevel, pStart)
15700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15720 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
15730 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
15740 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
15750 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
15760 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
15770 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
15780 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e          pX = pEn
15790 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
157a0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
157b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
157c0 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  t( pEnd->leftCur
157d0 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
157e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
157f0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
15800 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  em;.        sqli
15810 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15820 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
15830 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20  pLevel->iMem);. 
15840 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f         if( pX->o
15850 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
15860 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
15870 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15880 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
15890 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  P_Ge;.        }e
158a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74  lse{.          t
158b0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
158c0 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
158d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
158e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
158f0 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20  el, pEnd);.     
15900 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d   }.      start =
15910 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15920 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15930 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
15940 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
15950 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
15960 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
15970 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
15980 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
15990 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
159a0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
159b0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
159c0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
159d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
159e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
159f0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
15a00 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  , r1);.        /
15a10 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
15a20 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
15a30 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
15a40 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ); */.        sq
15a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15a60 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c 65 76 65  v, testOp, pLeve
15a70 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c 20 72 31  l->iMem, brk, r1
15a80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15a90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15aa0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
15ab0 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
15ac0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
15ad0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15ae0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15af0 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
15b00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
15b10 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
15b20 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
15b30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
15b40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
15b50 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 3: A scan usin
15b60 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
15b70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
15b80 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
15b90 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
15ba0 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
15bb0 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 20 20  equality .      
15bc0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
15bd0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
15be0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
15bf0 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
15c00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
15c10 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
15c20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
15c30 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
15c40 69 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  in.      **     
15c50 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
15c60 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
15c70 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
15c80 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 20  he indexed.     
15c90 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
15ca0 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  mn that immediat
15cb0 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ely follows the 
15cc0 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e  N equalities. On
15cd0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ly .      **    
15ce0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
15cf0 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
15d00 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
15d10 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
15d20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15d30 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
15d40 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
15d50 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
15d60 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
15d70 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
15d80 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
15d90 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
15da0 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
15db0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15dc0 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
15dd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
15de0 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
15df0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15e00 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
15e10 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15e20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a     x=5 AND y<10.
15e30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15e40 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
15e50 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 20 20 2a  AND y<10.      *
15e60 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15e70 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
15e80 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  10.      **.    
15e90 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
15ea0 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
15eb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
15ec0 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
15ed0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15ee0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
15ef0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15f00 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15f10 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 20 20   AND z<10.      
15f20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
15f30 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
15f40 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
15f50 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
15f60 61 69 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  aints..      ** 
15f70 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
15f80 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
15f90 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
15fa0 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
15fb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
15fc0 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 20 20 2a  ast one..      *
15fd0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
15fe0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
15ff0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
16000 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
16010 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a  E clause.      *
16020 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
16030 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
16040 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
16050 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
16060 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16070 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
16080 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
16090 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
160a0 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 20 20  R BY..      */  
160b0 0a 20 20 20 20 20 20 69 6e 74 20 61 53 74 61 72  .      int aStar
160c0 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
160d0 20 20 30 2c 0a 20 20 20 20 20 20 20 20 30 2c 0a    0,.        0,.
160e0 20 20 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e          OP_Rewin
160f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
16100 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
16110 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
16120 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
16130 20 20 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c          OP_Last,
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
16160 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
16170 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
16180 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65 47          OP_MoveG
16190 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
161a0 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  4: (start_constr
161b0 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
161c0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
161d0 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65 4c          OP_MoveL
161e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
161f0 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
16200 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
16210 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
16220 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65 47          OP_MoveG
16230 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
16240 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
16250 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
16260 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
16270 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76 65 4c          OP_MoveL
16280 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
16290 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
162a0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
162b0 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
162c0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
162d0 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  nt aEndOp[] = {.
162e0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c          OP_Noop,
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16300 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
16310 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 20  ints) */.       
16320 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
16330 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
16340 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
16350 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
16360 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
16370 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
16380 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
16390 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
163a0 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  };.      int nEq
163b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a   = pLevel->nEq;.
163c0 20 20 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51        int isMinQ
163d0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
163e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
163f0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
16400 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
16410 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61  .      int regBa
16420 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
16430 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
16440 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
16450 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
16460 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 20  /.      int r1; 
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
16490 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 57  ister */.      W
164a0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
164b0 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
164c0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
164d0 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
164e0 61 72 74 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  art */.      Whe
164f0 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
16500 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
16510 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16520 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
16530 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
16540 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
16550 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16560 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
16570 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
16580 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 45  /.      int endE
16590 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
165a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
165b0 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
165c0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
165d0 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63       int start_c
165e0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
165f0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
16600 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
16610 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ed */.      int 
16620 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
16630 6d 6e 5b 6e 45 71 5d 3b 20 2f 2a 20 43 6f 6c 75  mn[nEq]; /* Colu
16640 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74  mn for inequalit
16650 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
16660 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  .      int nCons
16670 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
16680 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16690 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
166a0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  s */.      int o
166b0 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  p;..      /* Gen
166c0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
166d0 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
166e0 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
166f0 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20  g == or IN.     
16700 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
16710 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
16720 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
16730 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
16740 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 69  .      ** starti
16750 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
16760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
16770 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
16780 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
16790 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63  rse, pLevel, &wc
167a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32 29 3b 0a  , notReady, 2);.
167b0 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76        nxt = pLev
167c0 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20 20 20 20  el->nxt;..      
167d0 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
167e0 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
167f0 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
16800 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
16810 20 20 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73        ** was pas
16820 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
16830 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tion to implemen
16840 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  t a "SELECT min(
16850 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 20 20 2a  x) ..." .      *
16860 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
16870 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
16880 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
16890 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
168a0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
168b0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
168c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
168d0 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
168e0 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
168f0 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c   not have a NULL
16900 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
16910 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20   'x'. If column 
16920 27 78 27 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  'x' is.      ** 
16930 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
16940 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
16950 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16960 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
16970 20 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71       ** this req
16980 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
16990 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
169a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
169b0 28 77 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  (wflags&WHERE_OR
169c0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
169d0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
169e0 3e 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  >flags&WHERE_ORD
169f0 45 52 42 59 29 0a 20 20 20 20 20 20 20 26 26 20  ERBY).       && 
16a00 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
16a10 45 71 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  Eq).       && (p
16a20 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
16a30 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
16a40 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
16a50 5d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ]).      ){.    
16a60 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
16a70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
16a80 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
16a90 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
16aa0 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
16ab0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
16ac0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68   .      ** of th
16ad0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 20 20  e range. .      
16ae0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  */.      if( pLe
16af0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
16b00 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
16b10 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e          pRangeEn
16b20 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  d = findTerm(&wc
16b30 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
16b40 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  ady, (WO_LT|WO_L
16b50 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
16b60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
16b70 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
16b80 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
16b90 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 53 74          pRangeSt
16ba0 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  art = findTerm(&
16bb0 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  wc, iCur, k, not
16bc0 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f  Ready, (WO_GT|WO
16bd0 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _GE), pIdx);.   
16be0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
16bf0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
16c00 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
16c10 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
16c20 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
16c30 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
16c40 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
16c50 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
16c60 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
16c70 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  he .      ** sta
16c80 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
16c90 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
16ca0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
16cb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16cc0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
16cd0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
16ce0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b  QLITE_SO_ASC) ){
16cf0 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
16d00 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
16d10 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
16d20 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
16d30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
16d40 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
16d50 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
16d60 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
16d70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
16d80 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
16d90 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
16da0 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
16db0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16dc0 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
16dd0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
16de0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
16df0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
16e00 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
16e10 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
16e20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  WO_GE );.      s
16e30 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
16e40 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
16e50 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
16e60 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
16e70 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 20  .      endEq =  
16e80 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
16e90 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
16ea0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
16eb0 47 45 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74  GE);.      start
16ec0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
16ed0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
16ee0 71 3e 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  q>0;..      /* S
16ef0 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
16f00 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
16f10 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
16f20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  */.      nConstr
16f30 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
16f40 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
16f50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
16f60 20 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   dcc = pParse->d
16f70 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b 0a  isableColCache;.
16f80 20 20 20 20 20 20 20 20 69 66 28 20 70 52 61 6e          if( pRan
16f90 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  geEnd ){.       
16fa0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
16fb0 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
16fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16fd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
16fe0 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65 53 74  pParse, pRangeSt
16ff0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
17000 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
17010 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
17020 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17030 65 20 3d 20 64 63 63 3b 0a 20 20 20 20 20 20 20  e = dcc;.       
17040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17050 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
17060 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78   regBase+nEq, nx
17070 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e  t);.        nCon
17080 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
17090 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
170a0 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 20  Query ){.       
170b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
170c0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
170d0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
170e0 20 20 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61          nConstra
170f0 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  int++;.        s
17100 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
17110 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
17120 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  aints = 1;.     
17130 20 7d 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70   }.      codeApp
17140 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
17150 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
17160 73 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a  straint, pIdx);.
17170 20 20 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72        op = aStar
17180 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
17190 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
171a0 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
171b0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
171c0 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   op!=0 );.      
171d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
171e0 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 20  _Rewind );.     
171f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17200 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  P_Last );.      
17210 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17220 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20  _MoveGt );.     
17230 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17240 50 5f 4d 6f 76 65 47 65 20 29 3b 0a 20 20 20 20  P_MoveGe );.    
17250 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17260 4f 50 5f 4d 6f 76 65 4c 65 20 29 3b 0a 20 20 20  OP_MoveLe );.   
17270 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17280 3d 4f 50 5f 4d 6f 76 65 4c 74 20 29 3b 0a 20 20  =OP_MoveLt );.  
17290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
172a0 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64  ddOp4(v, op, iId
172b0 78 43 75 72 2c 20 6e 78 74 2c 20 72 65 67 42 61  xCur, nxt, regBa
172c0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
172e0 61 72 2a 29 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  ar*)nConstraint,
172f0 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a 20 20 20   P4_INT32);..   
17300 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
17310 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
17320 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17330 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
17340 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
17350 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
17360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f      */.      nCo
17370 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
17380 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
17390 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  End ){.        s
173a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
173b0 50 61 72 73 65 2c 20 70 52 61 6e 67 65 45 6e 64  Parse, pRangeEnd
173c0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
173d0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
173e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
173f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17400 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
17410 45 71 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20  Eq, nxt);.      
17420 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
17430 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
17440 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64 78  ase, nEq+1, pIdx
17450 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  );.        nCons
17460 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
17470 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  }..      /* Top 
17480 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
17490 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
174a0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
174b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
174c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
174d0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
174e0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
174f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
17500 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 6f 70 20  ge. */.      op 
17510 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
17520 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
17530 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 20   + bRev)];.     
17540 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17550 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 20 20  P_Noop );.      
17560 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17570 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20  _IdxGE );.      
17580 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17590 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20  _IdxLT );.      
175a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
175b0 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  4(v, op, iIdxCur
175c0 2c 20 6e 78 74 2c 20 72 65 67 42 61 73 65 2c 0a  , nxt, regBase,.
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6e          (char*)n
175f0 43 6f 6e 73 74 72 61 69 6e 74 2c 20 50 34 5f 49  Constraint, P4_I
17600 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  NT32);.      sql
17610 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17620 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 29  (v, endEq!=bRev)
17630 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
17640 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
17650 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
17660 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
17670 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
17680 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
17690 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
176a0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
176b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
176c0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
176d0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
176e0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
176f0 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a  he loop..      *
17700 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
17710 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17720 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
17730 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
17740 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  flags & WHERE_BT
17750 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  M_LIMIT );.     
17760 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
17770 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
17780 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _TOP_LIMIT );.  
17790 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
177a0 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  flags & (WHERE_B
177b0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
177c0 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
177d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
177e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
177f0 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
17800 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  q, r1);.        
17810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17820 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
17830 72 31 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  r1, cont);.     
17840 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 65   }..      /* See
17850 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
17860 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
17870 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  */.      if( !om
17880 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
17890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
178a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
178b0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 31  wid, iIdxCur, r1
178c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
178d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
178e0 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
178f0 20 30 2c 20 72 31 29 3b 20 20 2f 2a 20 44 65 66   0, r1);  /* Def
17900 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
17910 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17920 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17930 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
17940 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20        /* Record 
17950 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
17960 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
17970 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
17980 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 57 48  ble .      ** WH
17990 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
179a0 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
179b0 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
179c0 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 20 20 2a  ge scan..      *
179d0 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  /.      pLevel->
179e0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
179f0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
17a00 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
17a10 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
17a20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
17a30 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
17a40 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
17a50 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
17a60 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 7d 65 6c  ngeEnd);.    }el
17a70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
17a80 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 4:  There is n
17a90 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
17aa0 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
17ab0 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
17ac0 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
17ad0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
17ae0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
17af0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
17b00 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
17b10 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
17b20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
17b30 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
17b40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
17b50 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
17b60 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
17b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17b80 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
17b90 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d  Cur, brk);.    }
17ba0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
17bb0 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
17bc0 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20  et, iCur);..    
17bd0 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
17be0 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
17bf0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
17c00 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
17c10 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  y.    ** compute
17c20 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
17c30 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
17c40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
17c50 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d  r(pTerm=wc.a, j=
17c60 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  wc.nTerm; j>0; j
17c70 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
17c80 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
17c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
17ca0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
17cb0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
17cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
17cd0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
17ce0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
17cf0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
17d00 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
17d10 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
17d20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
17d30 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
17d40 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
17d50 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
17d60 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
17d70 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
17d80 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
17d90 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
17da0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
17db0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17dc0 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
17dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
17de0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
17df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17e00 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
17e10 45 2c 20 63 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  E, cont, SQLITE_
17e20 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
17e30 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
17e40 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
17e50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
17e60 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
17e70 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
17e80 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
17e90 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
17ea0 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
17eb0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
17ec0 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
17ed0 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
17ee0 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
17ef0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17f00 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
17f10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
17f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17f30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17f60 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
17f70 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
17f80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17f90 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
17fa0 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20  IN hit"));.     
17fb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61   sqlite3ExprClea
17fc0 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  rColumnCache(pPa
17fd0 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  rse, pLevel->iTa
17fe0 62 43 75 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  bCur);.      sql
17ff0 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
18000 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
18010 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
18020 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  );.      for(pTe
18030 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c  rm=wc.a, j=0; j<
18040 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  wc.nTerm; j++, p
18050 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
18060 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
18070 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  ->flags & TERM_V
18080 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
18090 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
180a0 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
180b0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20  CODED );.       
180c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
180d0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
180e0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
180f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
18100 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
18110 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
18120 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
18130 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
18140 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
18150 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18160 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
18170 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
18180 70 72 2c 20 63 6f 6e 74 2c 20 53 51 4c 49 54 45  pr, cont, SQLITE
18190 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
181a0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
181b0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
181c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
181d0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
181e0 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20  TE_TEST  /* For 
181f0 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
18200 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
18210 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e  /.  /* Record in
18220 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
18230 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
18240 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  t the current ta
18250 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ble.  ** and the
18260 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   index used to a
18270 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79  ccess it (if any
18280 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  ).  If the table
18290 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20   itself.  ** is 
182a0 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61  not used, its na
182b0 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e  me is just '{}'.
182c0 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73    If no index is
182d0 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69   used.  ** the i
182e0 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61  ndex is listed a
182f0 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20  s "{}".  If the 
18300 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
18310 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  sed the.  ** ind
18320 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a  ex name is '*'..
18330 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18340 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
18350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
18360 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a   *z;.    int n;.
18370 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
18380 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
18390 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
183a0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
183b0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20  iFrom];.    z = 
183c0 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pTabItem->zAlias
183d0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
183e0 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70   z = pTabItem->p
183f0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
18400 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
18410 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
18420 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
18430 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20  _query_plan)-10 
18440 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  ){.      if( pLe
18450 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
18460 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20  RE_IDX_ONLY ){. 
18470 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
18480 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18490 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c  n[nQPlan], "{}",
184a0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   2);.        nQP
184b0 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  lan += 2;.      
184c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
184d0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
184e0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
184f0 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ], z, n);.      
18500 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
18510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
18520 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
18530 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
18540 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
18550 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ase( pLevel->fla
18560 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
18570 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
18580 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ase( pLevel->fla
18590 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
185a0 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
185b0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
185c0 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
185d0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
185e0 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  NGE) ){.      me
185f0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
18600 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
18610 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20  , "* ", 2);.    
18620 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20    nQPlan += 2;. 
18630 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
18640 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a  vel->pIdx==0 ){.
18650 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
18660 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
18670 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c  [nQPlan], "{} ",
18680 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   3);.      nQPla
18690 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  n += 3;.    }els
186a0 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  e{.      n = str
186b0 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78  len(pLevel->pIdx
186c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
186d0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
186e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
186f0 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
18700 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
18710 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18720 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
18730 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  l->pIdx->zName, 
18740 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
18750 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
18760 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
18770 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
18780 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
18790 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
187a0 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69  nQPlan>0 && sqli
187b0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
187c0 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b  QPlan-1]==' ' ){
187d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65  .    sqlite3_que
187e0 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e  ry_plan[--nQPlan
187f0 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  ] = 0;.  }.  sql
18800 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
18810 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e  nQPlan] = 0;.  n
18820 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69  QPlan = 0;.#endi
18830 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
18840 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20   // Testing and 
18850 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
18860 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  ly */..  /* Reco
18870 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  rd the continuat
18880 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74  ion address in t
18890 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
188a0 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20  ucture.  Then.  
188b0 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** clean up and 
188c0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70  return..  */.  p
188d0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
188e0 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65   = cont;.  where
188f0 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63 29  ClauseClear(&wc)
18900 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
18910 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
18920 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
18930 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
18940 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c  NoMem:.  whereCl
18950 61 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a  auseClear(&wc);.
18960 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
18970 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
18980 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
18990 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
189a0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
189b0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
189c0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
189d0 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
189e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
189f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
18a00 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
18a10 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
18a20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
18a30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70  WInfo->pParse->p
18a40 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
18a50 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
18a60 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  vel;.  SrcList *
18a70 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
18a80 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20  o->pTabList;..  
18a90 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
18aa0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
18ab0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
18ac0 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e  3ExprClearColumn
18ad0 43 61 63 68 65 28 70 57 49 6e 66 6f 2d 3e 70 50  Cache(pWInfo->pP
18ae0 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20 66 6f 72  arse, -1);.  for
18af0 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (i=pTabList->nSr
18b00 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
18b10 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
18b20 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
18b30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18b40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
18b50 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69  el->cont);.    i
18b60 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
18b70 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
18b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18b90 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
18ba0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
18bb0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  vel->p2);.    }.
18bc0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
18bd0 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 73 74 72  nIn ){.      str
18be0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
18bf0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
18c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18c10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
18c20 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a 20 20 20  Level->nxt);.   
18c30 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
18c40 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  >nIn, pIn=&pLeve
18c50 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  l->aInLoop[j-1];
18c60 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
18c70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c80 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18c90 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2b 31  , pIn->topAddr+1
18ca0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18cb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18cc0 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43  OP_Next, pIn->iC
18cd0 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72  ur, pIn->topAddr
18ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18cf0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18d00 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2d 31  , pIn->topAddr-1
18d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18d20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
18d30 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a  evel->aInLoop);.
18d40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18d50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18d60 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b  l(v, pLevel->brk
18d70 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
18d80 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
18d90 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
18da0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
18db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18dc0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
18dd0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
18de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18df0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
18e00 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
18e10 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
18e20 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
18e30 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a  ->iIdxCur>=0 ){.
18e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18e50 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18e60 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
18e70 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
18e80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
18e90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18ea0 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
18eb0 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  ->top);.      sq
18ec0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18ed0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
18ee0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
18ef0 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
18f00 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
18f10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18f20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
18f30 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
18f40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18f50 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
18f60 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
18f70 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
18f80 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
18f90 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
18fa0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
18fb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
18fc0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
18fd0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
18fe0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
18ff0 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  l++){.    struct
19000 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19010 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
19020 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
19030 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
19040 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
19050 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
19060 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
19070 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
19080 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70  Ephem || pTab->p
19090 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
190a0 65 3b 0a 20 20 20 20 69 66 28 20 21 70 57 49 6e  e;.    if( !pWIn
190b0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
190c0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
190d0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
190e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
190f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19100 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
19110 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
19120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19130 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29  Level->pIdx!=0 )
19140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19150 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19160 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
19170 49 64 78 43 75 72 29 3b 0a 20 20 20 20 7d 0a 0a  IdxCur);.    }..
19180 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
19190 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
191a0 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
191b0 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
191c0 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
191d0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
191e0 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
191f0 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
19200 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
19210 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
19220 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
19230 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
19240 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
19250 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
19260 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
19270 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
19280 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
19290 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
192a0 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
192b0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
192c0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
192d0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
192e0 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
192f0 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
19300 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
19310 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
19320 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
19330 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
19340 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
19350 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
19360 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
19370 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
19380 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
19390 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
193a0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
193b0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
193c0 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
193d0 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
193e0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
193f0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
19400 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
19410 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
19420 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
19430 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
19440 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
19450 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b 0a 20 20  evel->pIdx ){.  
19460 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
19470 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
19480 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
19490 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
194a0 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 20 20 69  l->pIdx;.      i
194b0 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  nt useIndexOnly 
194c0 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  = pLevel->flags 
194d0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
194e0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
194f0 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
19500 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
19510 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
19520 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
19530 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
19540 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19550 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
19560 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
19570 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
19580 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
19590 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
195a0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
195b0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
195c0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
195d0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
195e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
195f0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
19600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
19610 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
19620 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
19630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
19640 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
19650 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
19660 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
19670 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
19680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
196a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
196b0 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f 6e  sert(!useIndexOn
196c0 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43  ly || j<pIdx->nC
196d0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
196e0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
196f0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
19700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
19710 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
19720 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
19730 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
19740 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
19750 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
19760 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
19770 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e 64  ullRow && useInd
19780 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  exOnly ){.      
19790 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
197a0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
197b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
197c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
197d0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
197e0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
197f0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
19800 6e 3b 0a 7d 0a                                   n;.}.