/ Hex Artifact Content
Login

Artifact 312ca128cb6cc7abffb1cd40295b7e871bd79102:


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 31 38 32   where.c,v 1.182
0340: 20 32 30 30 35 2f 31 31 2f 32 31 20 31 32 3a 34   2005/11/21 12:4
0350: 36 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a 2a  6:27 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 44 65 74 65 72 6d 69  )../*.** Determi
03f0: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
0400: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0410: 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  array..*/.#defin
0420: 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20 20  e ARRAYSIZE(X)  
0430: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
0440: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
0450: 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63  Trace output mac
0460: 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ros.*/.#if defin
0470: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
0480: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0490: 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71 6c  E_DEBUG).int sql
04a0: 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65  ite3_where_trace
04b0: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 54   = 0;.# define T
04c0: 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c 69  RACE(X)  if(sqli
04d0: 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29  te3_where_trace)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  ntf X.#else.# de
0500: 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65  fine TRACE(X).#e
0510: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 61  ndif../*.** A la
0520: 72 67 65 20 76 61 6c 75 65 20 77 68 69 63 68 20  rge value which 
0530: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63  is the maximum c
0540: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
0550: 69 6e 64 65 78 2e 0a 2a 2a 20 42 79 20 64 65 66  index..** By def
0560: 61 75 6c 74 20 74 68 69 73 20 69 73 20 61 20 6c  ault this is a l
0570: 61 72 67 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f  arge floating po
0580: 69 6e 74 20 76 61 6c 75 65 2e 20 20 57 68 65 6e  int value.  When
0590: 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 53 51   compiling.** SQ
05a0: 4c 69 74 65 20 66 6f 72 20 61 20 70 72 6f 63 65  Lite for a proce
05b0: 73 73 6f 72 20 74 68 61 74 20 6c 61 63 6b 73 20  ssor that lacks 
05c0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73  floating point s
05d0: 75 70 70 6f 72 74 2c 20 73 69 6d 70 6c 79 0a 2a  upport, simply.*
05e0: 2a 20 72 65 64 65 66 69 6e 65 20 74 68 69 73 20  * redefine this 
05f0: 63 6f 6e 73 74 61 6e 74 20 74 6f 20 61 20 6c 61  constant to a la
0600: 72 67 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  rge integer..*/.
0610: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
0620: 49 47 5f 44 42 4c 0a 23 20 64 65 66 69 6e 65 20  IG_DBL.# define 
0630: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
0640: 31 2e 30 65 2b 39 39 29 0a 23 65 6e 64 69 66 0a  1.0e+99).#endif.
0650: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0660: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
0670: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
0680: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
0690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
06a0: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
06b0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
06c0: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
06d0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
06e0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
06f0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
0700: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
0710: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
0720: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0730: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0740: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0750: 20 6f 74 68 65 72 73 20 62 79 20 61 6e 20 41 4e   others by an AN
0760: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  D operator..**.*
0770: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
0780: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
0790: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
07a0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
07b0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
07c0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
07d0: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
07e0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
07f0: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
0800: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
0810: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
0820: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
0830: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
0840: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
0850: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
0860: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
0870: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
0880: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
0890: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
08a0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
08b0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
08c0: 65 72 6d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72  erm.leftColumn r
08d0: 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75 72  ecord the.** cur
08e0: 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  sor number and c
08f0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72  olumn number for
0900: 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e 6f   X.  WhereTerm.o
0910: 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a  perator records.
0920: 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e  ** the <op> usin
0930: 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  g a bitmask enco
0940: 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20  ding defined by 
0950: 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54  WO_xxx below.  T
0960: 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62  he.** use of a b
0970: 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20  itmask encoding 
0980: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
0990: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65   allows us to se
09a0: 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20  arch.** quickly 
09b0: 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d  for terms that m
09c0: 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65  atch any of seve
09d0: 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70  ral different op
09e0: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70  erators..**.** p
09f0: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
0a00: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
0a10: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
0a20: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
0a30: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
0a40: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
0a50: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
0a60: 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65 73  cture translates
0a70: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
0a80: 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64 20  r into bits and 
0a90: 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20 62  the translated b
0aa0: 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
0ab0: 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66 69  the prereq.** fi
0ac0: 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e 73  elds.  The trans
0ad0: 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  lation is used i
0ae0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69 6d  n order to maxim
0af0: 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ize the number o
0b00: 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20 77  f.** bits that w
0b10: 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69 74  ill fit in a Bit
0b20: 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45 20  mask.  The VDBE 
0b30: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
0b40: 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65 61  ight be.** sprea
0b50: 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20 6e  d out over the n
0b60: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
0b70: 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  gers.  For examp
0b80: 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  le, the cursor.*
0b90: 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  * numbers might 
0ba0: 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20  be 3, 8, 9, 10, 
0bb0: 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64 20  20, 23, 41, and 
0bc0: 34 35 2e 20 20 54 68 65 20 45 78 70 72 4d 61 73  45.  The ExprMas
0bd0: 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  kSet.** translat
0be0: 65 73 20 74 68 65 73 65 20 73 70 61 72 73 65 20  es these sparse 
0bf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
0c00: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
0c10: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69  integers.** begi
0c20: 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20  nning with 0 in 
0c30: 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68  order to make th
0c40: 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  e best possible 
0c50: 75 73 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c  use of the avail
0c60: 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20  able.** bits in 
0c70: 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f  the Bitmask.  So
0c80: 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  , in the example
0c90: 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73   above, the curs
0ca0: 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f  or numbers.** wo
0cb0: 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e  uld be mapped in
0cc0: 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20 74 68  to integers 0 th
0cd0: 72 6f 75 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65  rough 7..*/.type
0ce0: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0cf0: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0d00: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0d10: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0d30: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0d40: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
0d50: 20 20 69 31 36 20 69 50 61 72 65 6e 74 3b 20 20    i16 iParent;  
0d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
0d70: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
0d80: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
0d90: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
0da0: 20 20 69 31 36 20 6c 65 66 74 43 75 72 73 6f 72    i16 leftCursor
0db0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
0dc0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
0dd0: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0de0: 3e 22 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74  >" */.  i16 left
0df0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
0e00: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
0e10: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
0e20: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31   <expr>" */.  u1
0e30: 36 20 6f 70 65 72 61 74 6f 72 3b 20 20 20 20 20  6 operator;     
0e40: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
0e50: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
0e60: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66  g <op> */.  u8 f
0e70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
0e80: 20 20 20 20 2f 2a 20 42 69 74 20 66 6c 61 67 73      /* Bit flags
0e90: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
0ea0: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
0eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0ec0: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
0ed0: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
0ee0: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
0ef0: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
0f00: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
0f10: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
0f20: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
0f30: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
0f40: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0f50: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
0f60: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
0f70: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
0f80: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
0f90: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
0fa0: 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ed by p */.};../
0fb0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0fc0: 75 65 73 20 6f 66 20 57 68 65 72 65 54 65 72 6d  ues of WhereTerm
0fd0: 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  .flags.*/.#defin
0fe0: 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20  e TERM_DYNAMIC  
0ff0: 20 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64    0x01   /* Need
1000: 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1010: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
1020: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1030: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1040: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1050: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1060: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1070: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1080: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
1090: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
10a0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
10b0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
10c0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
10d0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
10e0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
10f0: 4f 4b 20 20 20 20 20 20 30 78 31 30 20 20 20 2f  OK      0x10   /
1100: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
1110: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
1120: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ng */../*.** An 
1130: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1140: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1150: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
1160: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1170: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
1180: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
1190: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
11a0: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
11b0: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
11c0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
11d0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
11e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
11f0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1200: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ext */.  int nTe
1210: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1220: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1230: 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  erms */.  int nS
1240: 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  lot;            
1250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1260: 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a  entries in a[] *
1270: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  /.  WhereTerm *a
1280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1290: 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62  Each a[] describ
12a0: 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
12b0: 20 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f   WHERE cluase */
12c0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74  .  WhereTerm aSt
12d0: 61 74 69 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49  atic[10];   /* I
12e0: 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70  nitial static sp
12f0: 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d  ace for a[] */.}
1300: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
1310: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1320: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1330: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61  keeps track of a
1340: 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77   mapping.** betw
1350: 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20  een VDBE cursor 
1360: 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73  numbers and bits
1370: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73   of the bitmasks
1380: 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a   in WhereTerm..*
1390: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75  *.** The VDBE cu
13a0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
13b0: 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20   small integers 
13c0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a  contained in .**
13d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43   SrcList_item.iC
13e0: 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69  ursor and Expr.i
13f0: 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46  Table fields.  F
1400: 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45  or any given WHE
1410: 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74  RE .** clause, t
1420: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1430: 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69  s might not begi
1440: 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74 68 65  n with 0 and the
1450: 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61  y might.** conta
1460: 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e  in gaps in the n
1470: 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63  umbering sequenc
1480: 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20  e.  But we want 
1490: 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a  to make maximum.
14a0: 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62 69  ** use of the bi
14b0: 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73  ts in our bitmas
14c0: 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  ks.  This struct
14d0: 75 72 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d  ure provides a m
14e0: 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74  apping.** from t
14f0: 68 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  he sparse cursor
1500: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
1510: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
1520: 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  rs beginning.** 
1530: 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  with 0..**.** If
1540: 20 45 78 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b   ExprMaskSet.ix[
1550: 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74  A]==B it means t
1560: 68 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74  hat The A-th bit
1570: 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a   of a Bitmask.**
1580: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42   corresponds VDB
1590: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
15a0: 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74  B.  The A-th bit
15b0: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73   of a bitmask is
15c0: 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   1<<A..**.** For
15d0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
15e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
15f0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68  pression used th
1600: 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73  ese VDBE.** curs
1610: 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32  ors:  4, 5, 8, 2
1620: 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e  9, 57, 73.  Then
1630: 20 74 68 65 20 20 45 78 70 72 4d 61 73 6b 53 65   the  ExprMaskSe
1640: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
1650: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
1660: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1670: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
1680: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
1690: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
16a0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
16b0: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
16c0: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
16d0: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
16e0: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
16f0: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
1700: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
1710: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
1720: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
1730: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
1740: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
1750: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
1760: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
1770: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
1780: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
1790: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
17a0: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
17b0: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
17c0: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
17d0: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
17e0: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
17f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1800: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 45 78 70   ExprMaskSet Exp
1810: 72 4d 61 73 6b 53 65 74 3b 0a 73 74 72 75 63 74  rMaskSet;.struct
1820: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20   ExprMaskSet {. 
1830: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1850: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
1860: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
1870: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73  es */.  int ix[s
1880: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
1890: 5d 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ];    /* Cursor 
18a0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
18b0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a   bit */.};.../*.
18c0: 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20  ** Bitmasks for 
18d0: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
18e0: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61  at indices are a
18f0: 62 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20  ble to exploit. 
1900: 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d   An.** OR-ed com
1910: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73  bination of thes
1920: 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20  e values can be 
1930: 75 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68  used when search
1940: 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73  ing for.** terms
1950: 20 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c   in the where cl
1960: 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ause..*/.#define
1970: 20 57 4f 5f 49 4e 20 20 20 20 20 31 0a 23 64 65   WO_IN     1.#de
1980: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 32  fine WO_EQ     2
1990: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20  .#define WO_LT  
19a0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
19b0: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
19c0: 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f  e WO_LE     (WO_
19d0: 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51  EQ<<(TK_LE-TK_EQ
19e0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54  )).#define WO_GT
19f0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
1a00: 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GT-TK_EQ)).#def
1a10: 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57  ine WO_GE     (W
1a20: 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f  O_EQ<<(TK_GE-TK_
1a30: 45 51 29 29 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  EQ))../*.** Valu
1a40: 65 20 66 6f 72 20 66 6c 61 67 73 20 72 65 74 75  e for flags retu
1a50: 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64 65  rned by bestInde
1a60: 78 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  x().*/.#define W
1a70: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20  HERE_ROWID_EQ   
1a80: 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20      0x0001   /* 
1a90: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
1aa0: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  wid IN (...) */.
1ab0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
1ac0: 57 49 44 5f 52 41 4e 47 45 20 20 20 20 30 78 30  WID_RANGE    0x0
1ad0: 30 30 32 20 20 20 2f 2a 20 72 6f 77 69 64 3c 45  002   /* rowid<E
1ae0: 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64  XPR and/or rowid
1af0: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
1b00: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1b10: 20 20 20 20 20 20 30 78 30 30 31 30 20 20 20 2f        0x0010   /
1b20: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
1b30: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1b40: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  e WHERE_COLUMN_R
1b50: 41 4e 47 45 20 20 20 30 78 30 30 32 30 20 20 20  ANGE   0x0020   
1b60: 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72  /* x<EXPR and/or
1b70: 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x>EXPR */.#defi
1b80: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
1b90: 49 4e 20 20 20 20 20 20 30 78 30 30 34 30 20 20  IN      0x0040  
1ba0: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
1bb0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1bc0: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 20 20 30  TOP_LIMIT      0
1bd0: 78 30 31 30 30 20 20 20 2f 2a 20 78 3c 45 58 50  x0100   /* x<EXP
1be0: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
1bf0: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
1c00: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
1c10: 49 54 20 20 20 20 20 20 30 78 30 32 30 30 20 20  IT      0x0200  
1c20: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
1c30: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
1c40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1c50: 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 20  E_IDX_ONLY      
1c60: 20 30 78 30 38 30 30 20 20 20 2f 2a 20 55 73 65   0x0800   /* Use
1c70: 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d   index only - om
1c80: 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  it table */.#def
1c90: 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45 52 42  ine WHERE_ORDERB
1ca0: 59 20 20 20 20 20 20 20 20 30 78 31 30 30 30 20  Y        0x1000 
1cb0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c    /* Output will
1cc0: 20 61 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65   appear in corre
1cd0: 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  ct order */.#def
1ce0: 69 6e 65 20 57 48 45 52 45 5f 52 45 56 45 52 53  ine WHERE_REVERS
1cf0: 45 20 20 20 20 20 20 20 20 30 78 32 30 30 30 20  E        0x2000 
1d00: 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76    /* Scan in rev
1d10: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64  erse order */.#d
1d20: 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51  efine WHERE_UNIQ
1d30: 55 45 20 20 20 20 20 20 20 20 20 30 78 34 30 30  UE         0x400
1d40: 30 20 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  0   /* Selects n
1d50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
1d60: 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  row */../*.** In
1d70: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
1d80: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
1d90: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
1da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
1db0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 57 68  ereClauseInit(Wh
1dc0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1dd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1de0: 20 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20    pWC->pParse = 
1df0: 70 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 6e  pParse;.  pWC->n
1e00: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
1e10: 3e 6e 53 6c 6f 74 20 3d 20 41 52 52 41 59 53 49  >nSlot = ARRAYSI
1e20: 5a 45 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ZE(pWC->aStatic)
1e30: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
1e40: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
1e50: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
1e60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1e70: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
1e80: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1e90: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
1ea0: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
1eb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
1ec0: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
1ed0: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
1ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
1ef0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
1f00: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
1f10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
1f20: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66 6f 72 28  eTerm *a;.  for(
1f30: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
1f40: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
1f50: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
1f60: 66 28 20 61 2d 3e 66 6c 61 67 73 20 26 20 54 45  f( a->flags & TE
1f70: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1f80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1f90: 65 6c 65 74 65 28 61 2d 3e 70 45 78 70 72 29 3b  elete(a->pExpr);
1fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1fb0: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
1fc0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
1fd0: 69 74 65 46 72 65 65 28 70 57 43 2d 3e 61 29 3b  iteFree(pWC->a);
1fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
1ff0: 64 20 61 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d a new entries 
2000: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
2010: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  se structure.  I
2020: 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
2030: 63 61 74 65 64 0a 2a 2a 20 73 70 61 63 65 20 61  cated.** space a
2040: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
2050: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
2060: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2070: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
2080: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
2090: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
20a0: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
20b0: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
20c0: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 65  ould be invalide
20d0: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
20e0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
20f0: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
2100: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
2110: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
2120: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
2130: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
2140: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
2150: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
2160: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
2170: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
2180: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
2190: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
21a0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72  .  if( pWC->nTer
21b0: 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b  m>=pWC->nSlot ){
21c0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
21d0: 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20  pOld = pWC->a;. 
21e0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
21f0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2200: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
2210: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
2220: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 20  if( pWC->a==0 ) 
2230: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65  return 0;.    me
2240: 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c  mcpy(pWC->a, pOl
2250: 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  d, sizeof(pWC->a
2260: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29  [0])*pWC->nTerm)
2270: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
2280: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
2290: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
22a0: 28 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pOld);.    }.  
22b0: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 2a 3d 20    pWC->nSlot *= 
22c0: 32 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  2;.  }.  pTerm =
22d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
22e0: 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 57  WC->nTerm];.  pW
22f0: 43 2d 3e 6e 54 65 72 6d 2b 2b 3b 0a 20 20 70 54  C->nTerm++;.  pT
2300: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a  erm->pExpr = p;.
2310: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 3d    pTerm->flags =
2320: 20 66 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d   flags;.  pTerm-
2330: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54  >pWC = pWC;.  pT
2340: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
2350: 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b  1;.  return idx;
2360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2370: 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65  outine identifie
2380: 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  s subexpressions
2390: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
23a0: 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61  ause where.** ea
23b0: 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
23c0: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
23d0: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
23e0: 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a  r or some other.
23f0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63  ** operator spec
2400: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20  ified in the op 
2410: 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20  parameter.  The 
2420: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2430: 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c  cture.** is fill
2440: 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  ed with pointers
2450: 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f   to subexpressio
2460: 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ns.  For example
2470: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45  :.**.**    WHERE
2480: 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44    a=='hello' AND
2490: 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c   coalesce(b,11)<
24a0: 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20  10 AND (c+12!=d 
24b0: 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20  OR c==22).**    
24c0: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
24d0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
24e0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
24f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
2500: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  *            slo
2510: 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[0]            
2520: 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20  slot[1]         
2530: 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a        slot[2].**
2540: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
2550: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2560: 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65   pExpr is unalte
2570: 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72  red.  All this r
2580: 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69  outine.** does i
2590: 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e  s make slot[] en
25a0: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
25b0: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
25c0: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
25d0: 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  In the previous 
25e0: 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20  sentence and in 
25f0: 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c  the diagram, "sl
2600: 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a  ot[]" refers to.
2610: 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ** the WhereClau
2620: 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54  se.a[] array.  T
2630: 68 69 73 20 61 72 72 61 79 20 67 72 6f 77 73 20  his array grows 
2640: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2650: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2660: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2670: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2680: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2690: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
26a0: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
26b0: 69 6e 74 20 6f 70 29 7b 0a 20 20 69 66 28 20 70  int op){.  if( p
26c0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
26d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
26e0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
26f0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
2700: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
2710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
2720: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
2730: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
2740: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
2750: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
2760: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
2770: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2780: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  n expression mas
2790: 6b 20 73 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65  k set.*/.#define
27a0: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20   initMaskSet(P) 
27b0: 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69   memset(P, 0, si
27c0: 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a  zeof(*P))../*.**
27d0: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d   Return the bitm
27e0: 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ask for the give
27f0: 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  n cursor number.
2800: 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a    Return 0 if.**
2810: 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20   iCursor is not 
2820: 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73  in the set..*/.s
2830: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65  tatic Bitmask ge
2840: 74 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65  tMask(ExprMaskSe
2850: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
2860: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
2870: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2880: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
2890: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
28a0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
28b0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
28c0: 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31  turn ((Bitmask)1
28d0: 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )<<i;.    }.  }.
28e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2900: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
2910: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
2920: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
2930: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
2940: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2950: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
2960: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
2970: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2980: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
2990: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
29a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
29b0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
29c0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
29d0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
29e0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
29f0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
2a00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
2a10: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 45 78 70  d createMask(Exp
2a20: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
2a30: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
2a40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  {.  assert( pMas
2a50: 6b 53 65 74 2d 3e 6e 20 3c 20 41 52 52 41 59 53  kSet->n < ARRAYS
2a60: 49 5a 45 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78  IZE(pMaskSet->ix
2a70: 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d  ) );.  pMaskSet-
2a80: 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b  >ix[pMaskSet->n+
2a90: 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a  +] = iCursor;.}.
2aa0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2ab0: 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72  ine walks (recur
2ac0: 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65  sively) an expre
2ad0: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67  ssion tree and g
2ae0: 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69  enerates.** a bi
2af0: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
2b00: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   which tables ar
2b10: 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65  e used in that e
2b20: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
2b30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  e..**.** In orde
2b40: 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  r for this routi
2b50: 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20  ne to work, the 
2b60: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b70: 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72   must have.** pr
2b80: 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64  eviously invoked
2b90: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2ba0: 6c 76 65 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68  lveNames() on th
2bb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53  e expression.  S
2bc0: 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ee.** the header
2bd0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
2be0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
2bf0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2c00: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ion..** The sqli
2c10: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
2c20: 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c  mes() routines l
2c30: 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ooks for column 
2c40: 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74  names and.** set
2c50: 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20  s their opcodes 
2c60: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
2c70: 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62   their Expr.iTab
2c80: 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20  le fields to.** 
2c90: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
2ca0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61  number of the ta
2cb0: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
2cc0: 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a  ne just has to.*
2cd0: 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20  * translate the 
2ce0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
2cf0: 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  nto bitmask valu
2d00: 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a  es and OR all.**
2d10: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f   the bitmasks to
2d20: 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  gether..*/.stati
2d30: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
2d40: 73 74 54 61 62 6c 65 55 73 61 67 65 28 45 78 70  stTableUsage(Exp
2d50: 72 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c  rMaskSet*, ExprL
2d60: 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ist*);.static Bi
2d70: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
2d80: 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d  TableUsage(ExprM
2d90: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
2da0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
2db0: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
2dc0: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2dd0: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
2de0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
2df0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
2e00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2e10: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
2e20: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
2e30: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2e40: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
2e50: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
2e60: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
2e70: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
2e80: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
2e90: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
2ea0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2eb0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
2ec0: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c  .  mask |= exprL
2ed0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
2ee0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74  askSet, p->pList
2ef0: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
2f00: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2f10: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
2f20: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
2f30: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
2f40: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
2f50: 74 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72  tTableUsage(Expr
2f60: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2f70: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
2f80: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2f90: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
2fa0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2fb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2fc0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2fd0: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
2fe0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2ff0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
3000: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
3010: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3020: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
3030: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
3040: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45 78  ectTableUsage(Ex
3050: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
3060: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
3070: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
3080: 3b 0a 20 20 69 66 28 20 70 53 3d 3d 30 20 29 7b  ;.  if( pS==0 ){
3090: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  .    mask = 0;. 
30a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
30b0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
30c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
30d0: 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  pS->pEList);.   
30e0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
30f0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
3100: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
3110: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
3120: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
3130: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
3140: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
3150: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
3160: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
3170: 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , pS->pWhere);. 
3180: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
3190: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
31a0: 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29  et, pS->pHaving)
31b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
31c0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
31d0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
31e0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
31f0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
3200: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
3210: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
3220: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
3230: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
3240: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
3250: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
3260: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
3270: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
3280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3290: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
32a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
32b0: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
32c0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
32d0: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
32e0: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
32f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
3300: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
3310: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
3320: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
3330: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
3340: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
3350: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
3360: 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K_GE);.}../*.** 
3370: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
3380: 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23   of type T..*/.#
3390: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
33a0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
33b0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
33c0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
33d0: 70 61 72 69 73 69 6f 6e 20 6f 70 65 72 61 74 6f  parision operato
33e0: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
33f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
3400: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
3410: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
3420: 20 58 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   X"..*/.static v
3430: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
3440: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3450: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
3460: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
3470: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
3480: 20 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53   );.  SWAP(CollS
3490: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
34a0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
34b0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
34c0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
34d0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
34e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
34f0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3500: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3510: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3530: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3540: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3550: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
3560: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
3570: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
3580: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
3590: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
35a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
35b0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
35c0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
35d0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
35e0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
35f0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3600: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3610: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
3620: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3630: 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  t op){.  int c;.
3640: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
3650: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
3660: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
3670: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
3680: 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 57 4f  else{.    c = WO
3690: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 3b  _EQ<<(op-TK_EQ);
36a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
36b0: 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57  p!=TK_IN || c==W
36c0: 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  O_IN );.  assert
36d0: 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63  ( op!=TK_EQ || c
36e0: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73  ==WO_EQ );.  ass
36f0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c  ert( op!=TK_LT |
3700: 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  | c==WO_LT );.  
3710: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
3720: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b  E || c==WO_LE );
3730: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3740: 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54  K_GT || c==WO_GT
3750: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3760: 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GE || c==WO
3770: 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _GE );.  return 
3780: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  c;.}../*.** Sear
3790: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
37a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
37b0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
37c0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
37d0: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
37e0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
37f0: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
3800: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
3810: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
3820: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
3830: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
3840: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
3850: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
3860: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3870: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
3880: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
3890: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  nd..*/.static Wh
38a0: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
38b0: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
38c0: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
38d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
38e0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
38f0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
3900: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
3910: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
3920: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
3930: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
3940: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3950: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
3960: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
3970: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
3980: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
3990: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f   mask */.  u16 o
39a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
39b0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
39c0: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
39d0: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
39e0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
3a00: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
3a10: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
3a20: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
3a30: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3a40: 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  erm;.  int k;.  
3a50: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
3a60: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
3a70: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
3a80: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
3a90: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
3aa0: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
3ab0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
3ac0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
3ad0: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
3ae0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
3af0: 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70  umn.       && (p
3b00: 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26  Term->operator &
3b10: 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20   op)!=0.    ){. 
3b20: 20 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d 30       if( iCur>=0
3b30: 20 26 26 20 70 49 64 78 20 29 7b 0a 20 20 20 20   && pIdx ){.    
3b40: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
3b50: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
3b60: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
3b70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
3b80: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
3b90: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
3ba0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
3bb0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
3bc0: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
3bd0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3be0: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
3bf0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
3c00: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
3c10: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
3c20: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
3c30: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
3c40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3c50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
3c60: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
3c70: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
3c80: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d           if( pX-
3c90: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
3ca0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
3cb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
3cc0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  q(pParse, pX->pR
3cd0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3ce0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3cf0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
3d00: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
3d10: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
3d20: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3d30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3d40: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
3d50: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
3d60: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
3d70: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  ]!=iColumn; k++)
3d80: 7b 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  {}.        asser
3d90: 74 28 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  t( k<pIdx->nColu
3da0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  mn );.        if
3db0: 28 20 70 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b  ( pColl!=pIdx->k
3dc0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
3dd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3de0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
3df0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
3e00: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3e10: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3e20: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3e30: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
3e40: 28 53 72 63 4c 69 73 74 2a 2c 20 45 78 70 72 4d  (SrcList*, ExprM
3e50: 61 73 6b 53 65 74 2a 2c 20 57 68 65 72 65 43 6c  askSet*, WhereCl
3e60: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
3e70: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
3e80: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
3e90: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
3ea0: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
3eb0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3ec0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
3ed0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
3ee0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
3ef0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  OM clause */.  E
3f00: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
3f10: 6b 53 65 74 2c 20 20 20 2f 2a 20 74 61 62 6c 65  kSet,   /* table
3f20: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72   masks */.  Wher
3f30: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
3f40: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
3f50: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
3f60: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
3f70: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
3f80: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
3f90: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
3fa0: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
3fb0: 74 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  t, pMaskSet, pWC
3fc0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
3fd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3fe0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
3ff0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
4000: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
4010: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
4020: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
4030: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
4040: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
4050: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
4060: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
4070: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4080: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
4090: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
40a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
40b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
40c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
40d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
40e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
40f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
4100: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
4110: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
4120: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
4130: 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  OrGlob(.  sqlite
4140: 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54  3 *db,      /* T
4150: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4160: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
4170: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
4180: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
4190: 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20  int *pnPattern, 
41a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
41b0: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
41c0: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
41d0: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
41e0: 65 74 65 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ete  /* True if 
41f0: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
4200: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
4210: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
4220: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
4230: 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  *z;.  Expr *pRig
4240: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78  ht, *pLeft;.  Ex
4250: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
4260: 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 69   int c, cnt;.  i
4270: 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 63 68 61  nt noCase;.  cha
4280: 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53  r wc[3];.  CollS
4290: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66  eq *pColl;..  if
42a0: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
42b0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
42c0: 70 72 2c 20 26 6e 6f 43 61 73 65 2c 20 77 63 29  pr, &noCase, wc)
42d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
42e0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
42f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
4300: 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e  pRight = pList->
4310: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
4320: 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ( pRight->op!=TK
4330: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72  _STRING ){.    r
4340: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4350: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
4360: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
4370: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
4380: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
4390: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
43a0: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
43b0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
43c0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
43d0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
43e0: 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d   }.  if( (pColl-
43f0: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
4400: 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 6e 6f 43  LL_BINARY || noC
4410: 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70  ase) &&.      (p
4420: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
4430: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c  TE_COLL_NOCASE |
4440: 7c 20 21 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20  | !noCase) ){.  
4450: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4460: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4470: 45 78 70 72 28 70 52 69 67 68 74 29 3b 0a 20 20  Expr(pRight);.  
4480: 7a 20 3d 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65  z = pRight->toke
4490: 6e 2e 7a 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30  n.z;.  for(cnt=0
44a0: 3b 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ; (c=z[cnt])!=0 
44b0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
44c0: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
44d0: 5b 32 5d 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20  [2]; cnt++){}.  
44e0: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
44f0: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b  5==(u8)z[cnt] ){
4500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4510: 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74   }.  *pisComplet
4520: 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30  e = z[cnt]==wc[0
4530: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
4540: 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d  ;.  *pnPattern =
4550: 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31   cnt;.  return 1
4560: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4570: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
4580: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
4590: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
45a0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
45b0: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
45c0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
45d0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
45e0: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
45f0: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
4600: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4610: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
4620: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
4630: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
4640: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
4650: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
4660: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
4670: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
4680: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
4690: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
46a0: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
46b0: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
46c0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
46d0: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
46e0: 72 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78 70  r>".  If the exp
46f0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a  ression is of.**
4700: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4710: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
4720: 58 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75  X and Y are colu
4730: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
4740: 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73  iginal.** expres
4750: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
4760: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
4770: 75 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ual expression o
4780: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59  f the form.** "Y
4790: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
47a0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
47b0: 6c 61 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a  lause and analyz
47c0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ed separately..*
47d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
47e0: 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63  prAnalyze(.  Src
47f0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
4800: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
4810: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  OM clause */.  E
4820: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
4830: 6b 53 65 74 2c 20 20 20 20 2f 2a 20 74 61 62 6c  kSet,    /* tabl
4840: 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65  e masks */.  Whe
4850: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
4860: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
4870: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4880: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
48a0: 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74  ex of the term t
48b0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
48c0: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
48d0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
48e0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70  [idxTerm];.  Exp
48f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
4900: 2d 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61  ->pExpr;.  Bitma
4910: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20  sk prereqLeft;. 
4920: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
4930: 6c 6c 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65  ll;.  int nPatte
4940: 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70  rn;.  int isComp
4950: 6c 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71 6c  lete;..  if( sql
4960: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
4970: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
4980: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
4990: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
49a0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
49b0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
49c0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20  >op==TK_IN ){.  
49d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
49e0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
49f0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
4a00: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
4a10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4a20: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  et, pExpr->pList
4a30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 65 78              | ex
4a50: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4a60: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
4a70: 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  pr->pSelect);.  
4a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
4a90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
4aa0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4ab0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
4ac0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
4ad0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
4ae0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4af0: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
4b00: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4b10: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
4b20: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 72 65  Join) ){.    pre
4b30: 72 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73  reqAll |= getMas
4b40: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
4b50: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
4b60: 6c 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  le);.  }.  pTerm
4b70: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
4b80: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
4b90: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
4ba0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
4bb0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
4bc0: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b  m->operator = 0;
4bd0: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
4be0: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28  (pExpr->op) && (
4bf0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4c00: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
4c10: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
4c20: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4c30: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
4c40: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
4c50: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
4c60: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
4c70: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
4c80: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4c90: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
4ca0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  ;.      pTerm->l
4cb0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
4cc0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
4cd0: 20 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f    pTerm->operato
4ce0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
4cf0: 28 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20  (pExpr->op);.   
4d00: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
4d10: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
4d20: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4d30: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
4d40: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
4d50: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
4d60: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
4d70: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
4d80: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
4d90: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
4da0: 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72  te3ExprDup(pExpr
4db0: 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  );.        idxNe
4dc0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
4dd0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
4de0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
4df0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
4e00: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
4e10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
4e20: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
4e30: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
4e40: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
4e50: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
4e60: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
4e70: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
4e80: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
4e90: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
4ea0: 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
4eb0: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
4ec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ed0: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
4ee0: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
4ef0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
4f00: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
4f10: 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  te(pDup);.      
4f20: 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c  pLeft = pDup->pL
4f30: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
4f40: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
4f50: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
4f60: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c     pNew->leftCol
4f70: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
4f80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
4f90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
4fa0: 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20  prereqLeft;.    
4fb0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
4fc0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
4fd0: 20 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61       pNew->opera
4fe0: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
4ff0: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20  sk(pDup->op);.  
5000: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
5010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
5020: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
5030: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
5040: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
5050: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
5060: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
5070: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
5080: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
5090: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
50a0: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20  EN implements.. 
50b0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
50c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
50d0: 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72  WEEN ){.    Expr
50e0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
50f0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
5100: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
5110: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
5120: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
5130: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
5140: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
5150: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
5160: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
5170: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
5180: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
5190: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
51a0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
51b0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
51c0: 65 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73  e3Expr(ops[i], s
51d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
51e0: 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20  xpr->pLeft),.   
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5210: 33 45 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e  3ExprDup(pList->
5220: 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b  a[i].pExpr), 0);
5230: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
5240: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
5250: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
5260: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
5270: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
5280: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
5290: 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70  Src, pMaskSet, p
52a0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
52b0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
52c0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
52d0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
52e0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
52f0: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  erm;.    }.    p
5300: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
5310: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
5320: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
5330: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
5340: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
5350: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
5360: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 74  MIZATION.  /* At
5370: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74  tempt to convert
5380: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
5390: 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  rms into an IN o
53a0: 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a  perator so that.
53b0: 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61    ** they can ma
53c0: 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ke use of indice
53d0: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a  s.  Example:.  *
53e0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20  *.  **      x = 
53f0: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
5400: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
5410: 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  pr3.  **.  ** is
5420: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a   converted into.
5430: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78    **.  **      x
5440: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
5450: 2c 65 78 70 72 33 29 0a 20 20 2a 2f 0a 20 20 65  ,expr3).  */.  e
5460: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
5470: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
5480: 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20  int ok;.    int 
5490: 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  i, j;.    int iC
54a0: 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a  olumn, iCursor;.
54b0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
54c0: 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65  sOr;.    WhereTe
54d0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20  rm *pOrTerm;..  
54e0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
54f0: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  ->flags & TERM_D
5500: 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20  YNAMIC)==0 );.  
5510: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
5520: 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61  t(&sOr, pWC->pPa
5530: 72 73 65 29 3b 0a 20 20 20 20 77 68 65 72 65 53  rse);.    whereS
5540: 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72  plit(&sOr, pExpr
5550: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78  , TK_OR);.    ex
5560: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
5570: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26 73 4f  c, pMaskSet, &sO
5580: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
5590: 73 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b 0a 20  sOr.nTerm>0 );. 
55a0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64 6f     j = 0;.    do
55b0: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
55c0: 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43  = sOr.a[j].leftC
55d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75  olumn;.      iCu
55e0: 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  rsor = sOr.a[j].
55f0: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
5600: 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d    ok = iCursor>=
5610: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73  0;.      for(i=s
5620: 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  Or.nTerm-1, pOrT
5630: 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20  erm=sOr.a; i>=0 
5640: 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54  && ok; i--, pOrT
5650: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
5660: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6f 70 65  if( pOrTerm->ope
5670: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a  rator!=WO_EQ ){.
5680: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f            goto o
5690: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a  r_not_possible;.
56a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
56b0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
56c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
56d0: 6f 72 20 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c  or && pOrTerm->l
56e0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
56f0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
5700: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c  pOrTerm->flags |
5710: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
5720: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5730: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
5740: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d  & TERM_COPIED)!=
5750: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
5760: 20 20 20 20 20 20 20 20 20 28 28 70 4f 72 54 65           ((pOrTe
5770: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5780: 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 26 26 0a  _VIRTUAL)!=0 &&.
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54       (sOr.a[pOrT
57b0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c  erm->iParent].fl
57c0: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b  ags & TERM_OR_OK
57d0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
57e0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
57f0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
5800: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5810: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
5820: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5830: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
5840: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
5850: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
5860: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
5870: 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20  <sOr.nTerm );.  
5880: 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20    if( ok ){.    
5890: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
58a0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
58b0: 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a  r *pNew, *pDup;.
58c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e        for(i=sOr.
58d0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
58e0: 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20  =sOr.a; i>=0 && 
58f0: 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  ok; i--, pOrTerm
5900: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
5910: 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73   (pOrTerm->flags
5920: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
5930: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5940: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
5950: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 72 54  ite3ExprDup(pOrT
5960: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
5970: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  ht);.        pLi
5980: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
5990: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
59a0: 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20  , pDup, 0);.    
59b0: 20 20 7d 0a 20 20 20 20 20 20 70 44 75 70 20 3d    }.      pDup =
59c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
59d0: 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29  COLUMN, 0, 0, 0)
59e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 75 70  ;.      if( pDup
59f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70   ){.        pDup
5a00: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73  ->iTable = iCurs
5a10: 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  or;.        pDup
5a20: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
5a30: 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  umn;.      }.   
5a40: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5a50: 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75  3Expr(TK_IN, pDu
5a60: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
5a70: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
5a80: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20      pNew->pList 
5a90: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  = pList;.      }
5aa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5ab0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5ac0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
5ad0: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
5ae0: 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20  >pExpr = pNew;. 
5af0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
5b00: 73 20 7c 3d 20 54 45 52 4d 5f 44 59 4e 41 4d 49  s |= TERM_DYNAMI
5b10: 43 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  C;.      exprAna
5b20: 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b  lyze(pSrc, pMask
5b30: 53 65 74 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Set, pWC, idxTer
5b40: 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  m);.      pTerm 
5b50: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
5b60: 6d 5d 3b 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74  m];.    }.or_not
5b70: 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 77  _possible:.    w
5b80: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
5b90: 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  &sOr);.  }.#endi
5ba0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5bb0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
5bc0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
5bd0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
5be0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
5bf0: 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  Add constraints 
5c00: 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
5c10: 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20  arch space on a 
5c20: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a  LIKE or GLOB.  *
5c30: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  * operator..  */
5c40: 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47  .  if( isLikeOrG
5c50: 6c 6f 62 28 70 57 43 2d 3e 70 50 61 72 73 65 2d  lob(pWC->pParse-
5c60: 3e 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50 61  >db, pExpr, &nPa
5c70: 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65  ttern, &isComple
5c80: 74 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  te) ){.    Expr 
5c90: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
5ca0: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31  .    Expr *pStr1
5cb0: 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78  , *pStr2;.    Ex
5cc0: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a  pr *pNewExpr1, *
5cd0: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
5ce0: 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e  nt idxNew1, idxN
5cf0: 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20  ew2;..    pLeft 
5d00: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
5d10: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
5d20: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
5d30: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
5d40: 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73  r;.    pStr1 = s
5d50: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 53 54  qlite3Expr(TK_ST
5d60: 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  RING, 0, 0, 0);.
5d70: 20 20 20 20 69 66 28 20 70 53 74 72 31 20 29 7b      if( pStr1 ){
5d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
5d90: 6b 65 6e 43 6f 70 79 28 26 70 53 74 72 31 2d 3e  kenCopy(&pStr1->
5da0: 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e  token, &pRight->
5db0: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53  token);.      pS
5dc0: 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e  tr1->token.n = n
5dd0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 7d 0a 20  Pattern;.    }. 
5de0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
5df0: 65 33 45 78 70 72 44 75 70 28 70 53 74 72 31 29  e3ExprDup(pStr1)
5e00: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 32 20  ;.    if( pStr2 
5e10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5e20: 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79   pStr2->token.dy
5e30: 6e 20 29 3b 0a 20 20 20 20 20 20 2b 2b 2a 28 75  n );.      ++*(u
5e40: 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e  8*)&pStr2->token
5e50: 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a  .z[nPattern-1];.
5e60: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 78      }.    pNewEx
5e70: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr1 = sqlite3Exp
5e80: 72 28 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33  r(TK_GE, sqlite3
5e90: 45 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20  ExprDup(pLeft), 
5ea0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
5eb0: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
5ec0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
5ed0: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
5ee0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5ef0: 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41  AMIC);.    exprA
5f00: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61  nalyze(pSrc, pMa
5f10: 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e  skSet, pWC, idxN
5f20: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
5f30: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
5f40: 72 28 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33  r(TK_LT, sqlite3
5f50: 45 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20  ExprDup(pLeft), 
5f60: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
5f70: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
5f80: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
5f90: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
5fa0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5fb0: 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41  AMIC);.    exprA
5fc0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61  nalyze(pSrc, pMa
5fd0: 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e  skSet, pWC, idxN
5fe0: 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
5ff0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
6000: 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
6010: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
6020: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
6030: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
6040: 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
6050: 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
6060: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
6070: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
6080: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
6090: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
60a0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
60b0: 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  ZATION */.}.../*
60c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
60d0: 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78   decides if pIdx
60e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
60f0: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
6100: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  R BY.** clause. 
6110: 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72   If it can, it r
6120: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49  eturns 1.  If pI
6130: 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  dx cannot satisf
6140: 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  y the.** ORDER B
6150: 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72  Y clause, this r
6160: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
6170: 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  ..**.** pOrderBy
6180: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
6190: 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45  clause from a SE
61a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
61b0: 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20   pTab is the.** 
61c0: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
61d0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
61e0: 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20  se of that same 
61f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6200: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c   and.** the tabl
6210: 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e  e has a cursor n
6220: 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e  umber of "base".
6230: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
6240: 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a  ex on pTab..**.*
6250: 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20  * nEqCol is the 
6260: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6270: 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61  s of pIdx that a
6280: 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c  re used as equal
6290: 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
62a0: 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73  ts.  Any of thes
62b0: 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  e columns may be
62c0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68   missing from th
62d0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
62e0: 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74  ause and the mat
62f0: 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  ch can still be 
6300: 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  a success..**.**
6310: 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   All terms of th
6320: 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20  e ORDER BY that 
6330: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
6340: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
6350: 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72  either.** ASC or
6360: 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f   DESC.  (Terms o
6370: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6380: 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65  lause past the e
6390: 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a  nd of a UNIQUE.*
63a0: 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e  * index do not n
63b0: 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
63c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29  his constraint.)
63d0: 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c    The *pbRev val
63e0: 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
63f0: 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  1 if the ORDER B
6400: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
6410: 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73  DESC and it is s
6420: 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68  et to 0 if.** th
6430: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6440: 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f  e is all ASC..*/
6450: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f  .static int isSo
6460: 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61  rtingIndex(.  Pa
6470: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6480: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6490: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
64a0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
64b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
64c0: 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
64d0: 67 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  g */.  Table *pT
64e0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab,            /
64f0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
6500: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
6510: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
6520: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
6530: 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20  number for pTab 
6540: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
6550: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
6560: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
6570: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
6580: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
6590: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
65a0: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
65b0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
65c0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65e0: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
65f0: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
6600: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6630: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73  nters */.  int s
6640: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
6650: 45 5f 53 4f 5f 41 53 43 3b 20 20 2f 2a 20 57 68  E_SO_ASC;  /* Wh
6660: 69 63 68 20 64 69 72 65 63 74 69 6f 6e 20 77 65  ich direction we
6670: 20 61 72 65 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   are sorting */.
6680: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
66b0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
66c0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
66d0: 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20  st_item *pTerm; 
66e0: 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20     /* A term of 
66f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6700: 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  use */.  sqlite3
6710: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6720: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
6730: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e  rderBy!=0 );.  n
6740: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
6750: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
6760: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
6770: 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f  /* Match terms o
6780: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6790: 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f  lause against co
67a0: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
67b0: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  e index..  */.  
67c0: 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
67d0: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
67e0: 6e 54 65 72 6d 20 26 26 20 69 3c 70 49 64 78 2d  nTerm && i<pIdx-
67f0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
6800: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
6810: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
6820: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
6830: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
6840: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
6850: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
6860: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
6870: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 0a  ce of pExpr */..
6880: 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
6890: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
68a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
68b0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
68c0: 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b  >iTable!=base ){
68d0: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f  .      /* Can no
68e0: 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73  t use an index s
68f0: 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  ort on anything 
6900: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f  that is not a co
6910: 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  lumn in the.    
6920: 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74    ** left-most t
6930: 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d  able of the FROM
6940: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
6950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6960: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
6970: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
6980: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
6990: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
69a0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
69b0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  ltColl;.    if( 
69c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
69d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
69e0: 5d 20 7c 7c 20 70 43 6f 6c 6c 21 3d 70 49 64 78  ] || pColl!=pIdx
69f0: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
6a00: 69 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  i] ){.      /* T
6a10: 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44  erm j of the ORD
6a20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  ER BY clause doe
6a30: 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75  s not match colu
6a40: 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65  mn i of the inde
6a50: 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  x */.      if( i
6a60: 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  <nEqCol ){.     
6a70: 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65     /* If an inde
6a80: 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  x column that is
6a90: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
6aa0: 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  == fails to matc
6ab0: 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  h an.        ** 
6ac0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74  ORDER BY term, t
6ad0: 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74  hat is OK.  Just
6ae0: 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c   ignore that col
6af0: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
6b00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6b10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6b30: 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65     /* If an inde
6b40: 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74  x column fails t
6b50: 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e  o match and is n
6b60: 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
6b70: 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20  y ==.        ** 
6b80: 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63  then the index c
6b90: 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  annot satisfy th
6ba0: 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74  e ORDER BY const
6bb0: 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a  raint..        *
6bc0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
6bd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6be0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43  }.    if( i>nEqC
6bf0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
6c00: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
6c10: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
6c20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
6c30: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
6c40: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
6c50: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
6c60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
6c70: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
6c80: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
6c90: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
6ca0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6cb0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
6cd0: 4f 72 64 65 72 20 3d 20 70 54 65 72 6d 2d 3e 73  Order = pTerm->s
6ce0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6cf0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65      j++;.    pTe
6d00: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
6d10: 54 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  The index can be
6d20: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
6d30: 67 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f  g if all terms o
6d40: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6d50: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63  lause.  ** are c
6d60: 6f 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  overed..  */.  i
6d70: 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20  f( j>=nTerm ){. 
6d80: 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74     *pbRev = sort
6d90: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
6da0: 5f 44 45 53 43 3b 0a 20 20 20 20 72 65 74 75 72  _DESC;.    retur
6db0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
6dc0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 0;.}../*.** Ch
6dd0: 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65  eck table to see
6de0: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
6df0: 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65   clause in pOrde
6e00: 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69 73  rBy can be satis
6e10: 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69  fied.** by sorti
6e20: 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52  ng in order of R
6e30: 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72  OWID.  Return tr
6e40: 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74  ue if so and set
6e50: 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a   *pbRev to be.**
6e60: 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72 73   true for revers
6e70: 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73  e ROWID and fals
6e80: 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f  e for forward RO
6e90: 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  WID order..*/.st
6ea0: 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c  atic int sortabl
6eb0: 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20  eByRowid(.  int 
6ec0: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
6ed0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
6ee0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74  mber for table t
6ef0: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
6f00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6f10: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
6f20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6f30: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f50: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
6f60: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
6f70: 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20  ){.  Expr *p;.. 
6f80: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
6f90: 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
6fa0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
6fb0: 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72  r>0 );.  p = pOr
6fc0: 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
6fd0: 72 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  r;.  if( pOrderB
6fe0: 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  y->nExpr==1 && p
6ff0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
7000: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61  && p->iTable==ba
7010: 73 65 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  se.          && 
7020: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  p->iColumn==-1 )
7030: 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70  {.    *pbRev = p
7040: 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f  OrderBy->a[0].so
7050: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74  rtOrder;.    ret
7060: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7070: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7080: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
7090: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
70a0: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
70b0: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
70c0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
70d0: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
70e0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
70f0: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
7100: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
7110: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
7120: 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69 74  g operatings wit
7130: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
7140: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
7150: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
7160: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
7170: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
7180: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
7190: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
71a0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
71b0: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
71c0: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
71d0: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
71e0: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
71f0: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
7200: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
7210: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
7220: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
7230: 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
7240: 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73   index for acces
7250: 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
7260: 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  r table.  Return
7270: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
7280: 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67   the index, flag
7290: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
72a0: 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68  how the index sh
72b0: 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68  ould be used, th
72c0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65  e.** number of e
72d0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
72e0: 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f  nts, and the "co
72f0: 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64  st" for this ind
7300: 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  ex..**.** The lo
7310: 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20  west cost index 
7320: 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
7330: 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
7340: 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
7350: 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
7360: 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63  I/O need to proc
7370: 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20  ess the request 
7380: 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74  using the select
7390: 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63  ed index..** Fac
73a0: 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
73b0: 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
73c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
73d0: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
73e0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
73f0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
7400: 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
7410: 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
7420: 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
7430: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
7440: 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
7450: 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
7460: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
7470: 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
7480: 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
7490: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
74a0: 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
74b0: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f  ain table..**.*/
74c0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
74d0: 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  estIndex(.  Pars
74e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
74f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
7500: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7510: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7520: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
7530: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7540: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
7550: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
7560: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
7570: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
7580: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
7590: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
75a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
75b0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
75c0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
75d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
75e0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
75f0: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
7600: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  by clause */.  I
7610: 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20  ndex **ppIndex, 
7620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7630: 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e  ke *ppIndex poin
7640: 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e  t to the best in
7650: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  dex */.  int *pF
7660: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
7670: 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67       /* Put flag
7680: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69  s describing thi
7690: 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c  s choice in *pFl
76a0: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ags */.  int *pn
76b0: 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq              
76c0: 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20       /* Put the 
76d0: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
76e0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  IN constraints h
76f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ere */.){.  Wher
7700: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
7710: 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d  Index *bestIdx =
7720: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
7730: 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20  ndex that gives 
7740: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
7750: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  */.  double lowe
7760: 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
7770: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
7780: 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f  using bestIdx */
7790: 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73  .  int bestFlags
77a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
77b0: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
77c0: 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20  ed with bestIdx 
77d0: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71  */.  int bestNEq
77e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
77f0: 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66   /* Best value f
7800: 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20  or nEq */.  int 
7810: 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
7820: 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
7830: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
7840: 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
7850: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
7860: 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
7870: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
7880: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
7890: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20   */.  int rev;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
78c0: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
78d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
78e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
78f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
7900: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
7910: 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  obe */.  int nEq
7920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7930: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7940: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
7950: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75 62  raints */.  doub
7960: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
7970: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
7980: 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
7990: 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62 65  */..  TRACE(("be
79a0: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
79b0: 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20  notReady=%x\n", 
79c0: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
79d0: 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20  e, notReady));. 
79e0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51   lowestCost = SQ
79f0: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
7a00: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
7a10: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
7a20: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
7a30: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
7a40: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
7a50: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
7a60: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
7a70: 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IN, 0);.  if(
7a80: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45 78   pTerm ){.    Ex
7a90: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a  pr *pExpr;.    *
7aa0: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
7ab0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48 45   bestFlags = WHE
7ac0: 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
7ad0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72   if( pTerm->oper
7ae0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a  ator & WO_EQ ){.
7af0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d        /* Rowid==
7b00: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 62   is always the b
7b10: 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20  est pick.  Look 
7b20: 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65 63  no further.  Bec
7b30: 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20  ause only.      
7b40: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ** a single row 
7b50: 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75  is generated, ou
7b60: 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20 69  tput is always i
7b70: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
7b80: 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73 20  /.      *pFlags 
7b90: 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  = WHERE_ROWID_EQ
7ba0: 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b   | WHERE_UNIQUE;
7bb0: 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20 31  .      *pnEq = 1
7bc0: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
7bd0: 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77 69  ... best is rowi
7be0: 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  d\n"));.      re
7bf0: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65  turn 0.0;.    }e
7c00: 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20 3d  lse if( (pExpr =
7c10: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e   pTerm->pExpr)->
7c20: 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  pList!=0 ){.    
7c30: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c    /* Rowid IN (L
7c40: 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c  IST): cost is Nl
7c50: 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  ogN where N is t
7c60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73  he number of lis
7c70: 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  t.      ** eleme
7c80: 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c  nts.  */.      l
7c90: 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78 70  owestCost = pExp
7ca0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
7cb0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
7cc0: 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65  t *= estLog(lowe
7cd0: 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c  stCost);.    }el
7ce0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77  se{.      /* Row
7cf0: 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20  id IN (SELECT): 
7d00: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
7d10: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
7d20: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
7d30: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
7d40: 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  lt of the inner 
7d50: 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76 65  select.  We have
7d60: 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69 6d   no way to estim
7d70: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ate.      ** tha
7d80: 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20  t value so make 
7d90: 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f  a wild guess. */
7da0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
7db0: 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a 20  t = 200;.    }. 
7dc0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72     TRACE(("... r
7dd0: 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e  owid IN cost: %.
7de0: 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73  9g\n", lowestCos
7df0: 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  t));.  }..  /* E
7e00: 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74  stimate the cost
7e10: 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e   of a table scan
7e20: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
7e30: 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20  know how many.  
7e40: 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69  ** entries are i
7e50: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65  n the table, use
7e60: 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20   1 million as a 
7e70: 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50  guess..  */.  pP
7e80: 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  robe = pSrc->pTa
7e90: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f 73  b->pIndex;.  cos
7ea0: 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72  t = pProbe ? pPr
7eb0: 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
7ec0: 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 54 52   : 1000000;.  TR
7ed0: 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20  ACE(("... table 
7ee0: 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a 20  scan base cost: 
7ef0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
7f00: 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  .  flags = WHERE
7f10: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20  _ROWID_RANGE;.. 
7f20: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
7f30: 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72  nstraints on a r
7f40: 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69  ange of rowids i
7f50: 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  n a table scan..
7f60: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66    */.  pTerm = f
7f70: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
7f80: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
7f90: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
7fa0: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
7fb0: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
7fc0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
7fd0: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
7fe0: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
7ff0: 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  LE, 0) ){.      
8000: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  flags |= WHERE_T
8010: 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
8020: 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
8030: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c  uess that rowid<
8040: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
8050: 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72 6f  two-thirds or ro
8060: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
8070: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
8080: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
8090: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
80a0: 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66  E, 0) ){.      f
80b0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
80c0: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63  M_LIMIT;.      c
80d0: 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75  ost /= 3;  /* Gu
80e0: 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e 45  ess that rowid>E
80f0: 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74  XPR eliminates t
8100: 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77  wo-thirds of row
8110: 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  s */.    }.    T
8120: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
8130: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
8140: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
8150: 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  cost));.  }else{
8160: 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a  .    flags = 0;.
8170: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
8180: 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73   table scan does
8190: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
81a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
81b0: 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20  , increase.  ** 
81c0: 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67  the cost by Nlog
81d0: 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65  N to cover the e
81e0: 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e  xpense of sortin
81f0: 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  g. */.  if( pOrd
8200: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
8210: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
8220: 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
8230: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66  &rev) ){.      f
8240: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
8250: 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
8260: 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69  D_RANGE;.      i
8270: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
8280: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8290: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
82a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
82b0: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
82c0: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
82d0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
82e0: 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
82f0: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
8300: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ", cost));.    }
8310: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c  .  }.  if( cost<
8320: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
8330: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
8340: 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  ost;.    bestFla
8350: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
8360: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61  .  /* Look at ea
8370: 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ch index..  */. 
8380: 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70   for(; pProbe; p
8390: 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
83a0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
83d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f  ounter */.    do
83e0: 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65  uble inMultiplie
83f0: 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54 52 41 43  r = 1;..    TRAC
8400: 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73  E(("... index %s
8410: 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  :\n", pProbe->zN
8420: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
8430: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
8440: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
8450: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
8460: 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a   satisfied.    *
8470: 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73  * by x=EXPR cons
8480: 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20  traints or x IN 
8490: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
84a0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c  s..    */.    fl
84b0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
84c0: 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e  (i=0; i<pProbe->
84d0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
84e0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
84f0: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  obe->aiColumn[i]
8500: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
8510: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
8520: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
8530: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50   WO_EQ|WO_IN, pP
8540: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
8550: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
8560: 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  k;.      flags |
8570: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
8580: 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
8590: 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57  rm->operator & W
85a0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
85b0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
85c0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
85d0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
85e0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
85f0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8600: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20  >pSelect!=0 ){. 
8610: 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
8620: 70 6c 69 65 72 20 2a 3d 20 31 30 30 3b 0a 20 20  plier *= 100;.  
8630: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8640: 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20  pExpr->pList!=0 
8650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
8660: 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78  ultiplier *= pEx
8670: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8680: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
8690: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
86a0: 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d    cost = pProbe-
86b0: 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69  >aiRowEst[i] * i
86c0: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73  nMultiplier * es
86d0: 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65  tLog(inMultiplie
86e0: 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b  r);.    nEq = i;
86f0: 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
8700: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
8710: 65 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  e && (flags & WH
8720: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
8730: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45  0.         && nE
8740: 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
8750: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  mn ){.      flag
8760: 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55  s |= WHERE_UNIQU
8770: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  E;.    }.    TRA
8780: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d  CE(("...... nEq=
8790: 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63  %d inMult=%.9g c
87a0: 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71  ost=%.9g\n", nEq
87b0: 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20  , inMultiplier, 
87c0: 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cost));..    /* 
87d0: 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63  Look for range c
87e0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
87f0: 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
8800: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
8810: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
8820: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
8830: 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
8840: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
8850: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
8860: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
8870: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50  |WO_GT|WO_GE, pP
8880: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
8890: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
88a0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
88b0: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
88c0: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
88d0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
88e0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
88f0: 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29  T|WO_LE, pProbe)
8900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
8910: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
8920: 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
8930: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20    cost /= 3;.   
8940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8950: 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
8960: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
8970: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
8980: 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
8990: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
89a0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
89b0: 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
89c0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
89d0: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
89e0: 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75  ..... range redu
89f0: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
8a00: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
8a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8a20: 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69 74  /* Add the addit
8a30: 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f  ional cost of so
8a40: 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69 73  rting if that is
8a50: 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a   a factor..    *
8a60: 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
8a70: 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
8a80: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
8a90: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a  OLUMN_IN)==0 &&.
8aa0: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72             isSor
8ab0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
8ac0: 2c 70 50 72 6f 62 65 2c 70 53 72 63 2d 3e 70 54  ,pProbe,pSrc->pT
8ad0: 61 62 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79  ab,iCur,pOrderBy
8ae0: 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20  ,nEq,&rev) ){.  
8af0: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d        if( flags=
8b00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8b10: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  flags = WHERE_CO
8b20: 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
8b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c      }.        fl
8b40: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
8b50: 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66  ERBY;.        if
8b60: 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  ( rev ){.       
8b70: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8b80: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
8b90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8ba0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  {.        cost +
8bb0: 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
8bc0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  st);.        TRA
8bd0: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65  CE(("...... orde
8be0: 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f  rby increases co
8bf0: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
8c00: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
8c10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
8c20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
8c30: 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74  can get away wit
8c40: 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  h using just the
8c50: 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20   index without. 
8c60: 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69     ** ever readi
8c70: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  ng the table.  I
8c80: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
8c90: 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74  se, then halve t
8ca0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
8cb0: 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
8cc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
8cd0: 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55  gs && pSrc->colU
8ce0: 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b  sed < (((Bitmask
8cf0: 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
8d00: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
8d10: 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
8d20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
8d30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8d40: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
8d50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8d60: 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt x = pProbe->a
8d70: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
8d80: 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
8d90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26  ){.          m &
8da0: 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29  = ~(((Bitmask)1)
8db0: 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<x);.        }.
8dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8dd0: 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
8de0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8df0: 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
8e00: 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20     cost /= 2;.  
8e10: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e        TRACE(("..
8e20: 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65  .... idx-only re
8e30: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
8e40: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
8e50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8e60: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
8e70: 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20  ex has achieved 
8e80: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
8e90: 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65  so far, then use
8ea0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
8eb0: 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73  if( cost < lowes
8ec0: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62  tCost ){.      b
8ed0: 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  estIdx = pProbe;
8ee0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
8ef0: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
8f00: 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d 30  assert( flags!=0
8f10: 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c   );.      bestFl
8f20: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
8f30: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
8f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8f50: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
8f60: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
8f70: 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49  *ppIndex = bestI
8f80: 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62 65  dx;.  TRACE(("be
8f90: 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20  st index is %s, 
8fa0: 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73  cost=%.9g, flags
8fb0: 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a  =%x, nEq=%d\n",.
8fc0: 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20          bestIdx 
8fd0: 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65  ? bestIdx->zName
8fe0: 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77   : "(none)", low
8ff0: 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61  estCost, bestFla
9000: 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20  gs, bestNEq));. 
9010: 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46   *pFlags = bestF
9020: 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d 20  lags;.  *pnEq = 
9030: 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72  bestNEq;.  retur
9040: 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a  n lowestCost;.}.
9050: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
9060: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9070: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
9080: 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
9090: 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
90a0: 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
90b0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
90c0: 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
90d0: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
90e0: 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
90f0: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
9100: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
9110: 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
9120: 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
9130: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
9140: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
9150: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
9160: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
9170: 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
9180: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
9190: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
91a0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
91b0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
91c0: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
91d0: 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
91e0: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
91f0: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
9200: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
9210: 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
9220: 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
9230: 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
9240: 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
9250: 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
9260: 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
9270: 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
9280: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
9290: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
92a0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
92b0: 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
92c0: 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
92d0: 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
92e0: 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
92f0: 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
9300: 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
9310: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
9320: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
9330: 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
9340: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
9350: 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
9360: 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
9370: 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
9380: 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
9390: 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
93a0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
93b0: 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
93c0: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
93d0: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
93e0: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
93f0: 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
9400: 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
9410: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
9420: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
9430: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
9440: 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
9450: 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
9460: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
9470: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
9480: 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
9490: 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
94a0: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
94b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
94c0: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
94d0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
94e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
94f0: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
9500: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
9510: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
9520: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
9530: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
9540: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
9550: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
9560: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9570: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
9580: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
9590: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
95a0: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
95b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
95c0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
95d0: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
95e0: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
95f0: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
9600: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
9610: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
9620: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
9630: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
9640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9650: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9660: 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20  e that builds a 
9670: 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64  probe for an ind
9680: 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a  ex.  Details:.**
9690: 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20  .**    *  Check 
96a0: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
96b0: 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73  entries on the s
96c0: 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a  tack.  If any.**
96d0: 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20         of those 
96e0: 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c  entries are NULL
96f0: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
9700: 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20  ly to brk,.**   
9710: 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65      which is the
9720: 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63   loop exit, sinc
9730: 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79  e no index entry
9740: 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20   will match.**  
9750: 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74       if any part
9760: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e   of the key is N
9770: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ULL..**.**    * 
9780: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f   Construct a pro
9790: 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  be entry from th
97a0: 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e  e top nColumn en
97b0: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20  tries in.**     
97c0: 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68    the stack with
97d0: 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70 72   affinities appr
97e0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
97f0: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
9800: 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65  c void buildInde
9810: 78 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c 20  xProbe(Vdbe *v, 
9820: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e 74  int nColumn, int
9830: 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49 64   brk, Index *pId
9840: 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x){.  sqlite3Vdb
9850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
9860: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20  Null, -nColumn, 
9870: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9880: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
9890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
98a0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
98b0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  umn, 0);.  sqlit
98c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
98d0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b  P_Goto, 0, brk);
98e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
98f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
9900: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
9910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65  );.  sqlite3Inde
9920: 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
9930: 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pIdx);.}.../*.**
9940: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
9950: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
9960: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
9970: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
9980: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
9990: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
99a0: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
99b0: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
99c0: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
99d0: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
99e0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
99f0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
9a00: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
9a10: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
9a20: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
9a30: 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
9a40: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
9a50: 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
9a60: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
9a70: 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
9a80: 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
9a90: 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
9aa0: 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
9ab0: 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
9ac0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9ad0: 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
9ae0: 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
9af0: 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
9b00: 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
9b10: 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69   void codeEquali
9b20: 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
9b30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
9b40: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
9b50: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
9b60: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
9b70: 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
9b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9b90: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
9ba0: 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20 20  nt brk,         
9bb0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
9bc0: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c  to abandon the l
9bd0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  oop */.  WhereLe
9be0: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20  vel *pLevel  /* 
9bf0: 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68  When level of th
9c00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
9c10: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
9c20: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
9c30: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9c40: 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54  .  if( pX->op!=T
9c50: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
9c60: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  rt( pX->op==TK_E
9c70: 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Q );.    sqlite3
9c80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9c90: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69   pX->pRight);.#i
9ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9cb0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
9cc0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  se{.    int iTab
9cd0: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a  ;.    int *aIn;.
9ce0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9cf0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
9d00: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
9d10: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
9d20: 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  X);.    iTab = p
9d30: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
9d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9d50: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
9d60: 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64  ab, brk);.    Vd
9d70: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
9d80: 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e   %.*s", pX->span
9d90: 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
9da0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
9db0: 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n++;.    sqlite3
9dc0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76  ReallocOrFree((v
9dd0: 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e 61  oid**)&pLevel->a
9de0: 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
9e10: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
9e20: 30 5d 29 2a 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49  0])*3*pLevel->nI
9e30: 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70 4c  n);.    aIn = pL
9e40: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20  evel->aInLoop;. 
9e50: 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20     if( aIn ){.  
9e60: 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65      aIn += pLeve
9e70: 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20 20  l->nIn*3 - 3;.  
9e80: 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f      aIn[0] = OP_
9e90: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 49 6e 5b  Next;.      aIn[
9ea0: 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  1] = iTab;.     
9eb0: 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c 69 74 65   aIn[2] = sqlite
9ec0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9ed0: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
9ee0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9ef0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20      pLevel->nIn 
9f00: 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
9f10: 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
9f20: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
9f30: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
9f40: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9f50: 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
9f60: 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
9f70: 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
9f80: 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61  * index.  The va
9f90: 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  lues for all con
9fa0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66  straints are lef
9fb0: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  t on the stack..
9fc0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
9fd0: 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
9fe0: 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
9ff0: 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
a000: 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
a010: 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
a020: 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
a030: 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
a040: 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
a050: 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
a060: 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
a070: 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
a080: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
a090: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
a0a0: 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
a0b0: 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
a0c0: 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
a0d0: 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
a0e0: 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
a0f0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
a100: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
a110: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
a120: 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
a130: 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
a140: 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
a150: 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
a160: 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65  e left.** on the
a170: 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68   stack - a is th
a180: 65 20 64 65 65 70 65 73 74 20 61 6e 64 20 62 20  e deepest and b 
a190: 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a  the shallowest..
a1a0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
a1b0: 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
a1c0: 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
a1d0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
a1e0: 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
a1f0: 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
a200: 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
a210: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
a220: 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
a230: 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
a240: 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
a250: 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
a260: 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
a270: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  l..**.** This ro
a280: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
a290: 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
a2a0: 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
a2b0: 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20  and puts.** the 
a2c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 61 74 20  address of that 
a2d0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70  memory cell in p
a2e0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68  Level->iMem.  Th
a2f0: 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
a300: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
a310: 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65  e will use pLeve
a320: 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65  l->iMem to store
a330: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
a340: 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
a350: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
a360: 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
a370: 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
a380: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
a390: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
a3a0: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
a3b0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
a3c0: 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
a3d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a3e0: 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  d codeAllEqualit
a3f0: 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
a400: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a410: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a420: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
a430: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
a440: 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
a450: 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
a460: 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
a470: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a480: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
a490: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
a4a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
a4b0: 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
a4c0: 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
a4d0: 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
a4e0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  coded */.  int b
a4f0: 72 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rk              
a500: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a510: 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f   end the loop */
a520: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
a530: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20  pLevel->nEq;    
a540: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
a550: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
a560: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
a570: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73  e */.  int terms
a580: 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  InMem = 0;      
a590: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
a5a0: 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20   store value in 
a5b0: 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20  mem[] cells */. 
a5c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a5d0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
a5e0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
a5f0: 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
a600: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
a610: 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
a620: 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54  el->pIdx;   /* T
a630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
a640: 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
a650: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
a660: 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
a670: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
a680: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
a690: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
a6a0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
a6b0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
a6c0: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
a6d0: 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a700: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r */..  /* Figur
a710: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
a720: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
a730: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
a740: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
a750: 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
a760: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
a770: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
a780: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
a790: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
a7a0: 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
a7b0: 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
a7c0: 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
a7d0: 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
a7e0: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
a7f0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
a800: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a810: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
a820: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
a830: 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72  N_IN ){.    pPar
a840: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76  se->nMem += pLev
a850: 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72  el->nEq;.    ter
a860: 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d  msInMem = 1;.  }
a870: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
a880: 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
a890: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
a8a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
a8b0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
a8c0: 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
a8d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
a8e0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
a8f0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
a900: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
a910: 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a  Q|WO_IN, pIdx);.
a920: 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
a930: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
a940: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
a950: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
a960: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  )==0 );.    code
a970: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
a980: 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c  rse, pTerm, brk,
a990: 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66   pLevel);.    if
a9a0: 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a  ( termsInMem ){.
a9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a9c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
a9d0: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
a9e0: 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20  Mem+j+1, 1);.   
a9f0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
aa00: 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a   j==nEq );..  /*
aa10: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   Make sure all t
aa20: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  he constraint va
aa30: 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20  lues are on the 
aa40: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
aa50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d  .  */.  if( term
aa60: 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  sInMem ){.    fo
aa70: 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
aa80: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
aa90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aaa0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
aab0: 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a  ->iMem+j+1, 0);.
aac0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
aad0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
aae0: 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
aaf0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
ab00: 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
ab10: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
ab20: 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
ab30: 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
ab40: 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
ab50: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
ab60: 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
ab70: 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
ab80: 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
ab90: 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
aba0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
abb0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
abc0: 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
abd0: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
abe0: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
abf0: 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
ac00: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
ac10: 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
ac20: 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
ac30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
ac40: 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
ac50: 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
ac60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ac70: 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  E_TEST */..../*.
ac80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
ac90: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
aca0: 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
acb0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
acc0: 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
acd0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
ace0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
acf0: 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
ad00: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
ad10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
ad20: 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
ad30: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
ad40: 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
ad50: 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
ad60: 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
ad70: 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
ad80: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
ad90: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
ada0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
adb0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
adc0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
add0: 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
ade0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
adf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
ae00: 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
ae10: 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
ae20: 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
ae30: 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
ae40: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
ae50: 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
ae60: 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
ae70: 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
ae80: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
ae90: 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
aea0: 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
aeb0: 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
aec0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
aed0: 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
aee0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
aef0: 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
af00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
af10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
af20: 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
af30: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
af40: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
af50: 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
af60: 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
af70: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
af80: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
af90: 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
afa0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
afb0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
afc0: 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
afd0: 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
afe0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
aff0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
b000: 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
b010: 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
b020: 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
b030: 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
b040: 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
b050: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
b060: 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
b090: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
b0a0: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
b0d0: 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
b0e0: 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
b0f0: 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
b100: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
b110: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
b120: 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
b130: 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
b140: 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
b150: 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
b160: 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
b170: 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
b180: 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
b190: 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
b1a0: 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
b1b0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
b1c0: 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
b1d0: 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
b1e0: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
b1f0: 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
b200: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b210: 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
b220: 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
b230: 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
b240: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
b250: 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
b260: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
b270: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
b280: 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
b290: 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
b2a0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
b2b0: 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
b2c0: 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
b2d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
b2e0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
b2f0: 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
b300: 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
b310: 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
b320: 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
b330: 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
b340: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
b350: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
b360: 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
b370: 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
b380: 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
b390: 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
b3a0: 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
b3b0: 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
b3c0: 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
b3d0: 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
b3e0: 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
b3f0: 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
b400: 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
b410: 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
b420: 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
b430: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
b440: 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
b450: 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
b460: 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
b470: 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
b480: 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
b490: 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
b4a0: 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
b4b0: 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
b4c0: 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
b4d0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
b4e0: 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
b4f0: 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
b500: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
b510: 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
b520: 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
b530: 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
b540: 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
b550: 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
b560: 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
b570: 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
b580: 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
b590: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
b5a0: 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
b5b0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
b5c0: 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
b5d0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
b5e0: 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
b5f0: 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
b600: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b610: 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
b620: 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
b630: 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
b640: 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
b650: 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
b660: 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
b670: 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
b680: 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
b690: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
b6a0: 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
b6b0: 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
b6c0: 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
b6d0: 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
b6e0: 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
b6f0: 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
b700: 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
b710: 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
b720: 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
b730: 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
b740: 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
b750: 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
b760: 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
b770: 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
b780: 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
b790: 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
b7a0: 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
b7b0: 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
b7c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b7d0: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
b7e0: 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
b7f0: 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
b800: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
b810: 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
b820: 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
b830: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
b840: 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
b850: 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
b860: 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
b870: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
b880: 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
b890: 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
b8a0: 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
b8b0: 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
b8c0: 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
b8d0: 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
b8e0: 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
b8f0: 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
b900: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
b910: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
b920: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
b930: 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
b940: 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
b950: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
b960: 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
b970: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b980: 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
b990: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
b9a0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
b9b0: 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
b9c0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
b9d0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
b9e0: 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
b9f0: 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
ba00: 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
ba10: 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
ba20: 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
ba30: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
ba40: 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
ba50: 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
ba60: 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
ba70: 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
ba80: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
ba90: 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
baa0: 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
bab0: 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
bac0: 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
bad0: 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
bae0: 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
baf0: 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
bb00: 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
bb10: 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
bb20: 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
bb30: 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
bb40: 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
bb50: 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
bb60: 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
bb70: 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
bb80: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
bb90: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
bba0: 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
bbb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bbc0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
bbd0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
bbe0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
bbf0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
bc00: 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
bc10: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
bc20: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
bc30: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
bc40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
bc50: 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
bc60: 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
bc70: 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
bc80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bcb0: 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
bcc0: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
bcd0: 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
bce0: 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
bcf0: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
bd00: 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
bd10: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
bd20: 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
bd30: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
bd40: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
bd50: 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
bd60: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
bd70: 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
bd80: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
bd90: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
bda0: 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
bdb0: 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
bdc0: 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
bdd0: 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
bde0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
bdf0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
be00: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
be10: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
be20: 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
be30: 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
be40: 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
be50: 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
be60: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
be70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
be80: 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
be90: 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
bea0: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
beb0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
bec0: 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
bed0: 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
bee0: 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
bef0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
bf00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bf10: 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
bf20: 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
bf30: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
bf40: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bf60: 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
bf70: 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
bf80: 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
bfa0: 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
bfb0: 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
bfc0: 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  flags */..  /* T
bfd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
bfe0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
bff0: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
c000: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
c010: 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
c020: 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
c030: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
c040: 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
c050: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c060: 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
c070: 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
c080: 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
c090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
c0a0: 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
c0b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
c0c0: 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
c0d0: 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
c0e0: 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
c0f0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
c100: 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
c110: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
c120: 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b  nitMaskSet(&mask
c130: 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
c140: 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50 61  useInit(&wc, pPa
c150: 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  rse);.  whereSpl
c160: 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20  it(&wc, pWhere, 
c170: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
c180: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
c190: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
c1a0: 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
c1b0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
c1c0: 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
c1d0: 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  urn value..  */.
c1e0: 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
c1f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c200: 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
c210: 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
c220: 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
c230: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
c240: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
c250: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
c260: 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20  ginNoMem;.  }.  
c270: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
c280: 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
c290: 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
c2a0: 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
c2b0: 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
c2c0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c2d0: 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  v);..  /* Specia
c2e0: 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
c2f0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
c300: 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
c310: 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
c320: 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
c330: 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
c340: 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
c350: 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
c360: 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
c370: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
c380: 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
c390: 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  IsConstant(pWher
c3a0: 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
c3b0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
c3c0: 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
c3d0: 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29  Info->iBreak, 1)
c3e0: 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
c3f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  ;.  }..  /* Anal
c400: 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
c410: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
c420: 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
c430: 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
c440: 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
c450: 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
c460: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
c470: 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
c480: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
c490: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
c4a0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
c4b0: 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
c4c0: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
c4d0: 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
c4e0: 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
c4f0: 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
c500: 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
c510: 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
c520: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
c530: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
c540: 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
c550: 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
c560: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
c570: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61  );.  }.  exprAna
c580: 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
c590: 2c 20 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29  , &maskSet, &wc)
c5a0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
c5b0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
c5c0: 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
c5d0: 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a  eginNoMem;.  }..
c5e0: 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
c5f0: 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
c600: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
c610: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
c620: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
c630: 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
c640: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
c650: 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
c660: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
c670: 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
c680: 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
c690: 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
c6a0: 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
c6b0: 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20  nfo->a[].flags  
c6c0: 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
c6d0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
c6e0: 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
c6f0: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
c700: 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
c710: 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
c720: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
c730: 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
c740: 6d 20 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20  m     When term 
c750: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
c760: 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
c770: 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
c780: 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
c790: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
c7a0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
c7b0: 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
c7c0: 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
c7d0: 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
c7e0: 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
c7f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
c800: 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
c810: 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
c820: 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
c830: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
c840: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
c850: 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
c860: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62  itmask)0;.  pTab
c870: 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
c880: 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70  >a;.  pLevel = p
c890: 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46  WInfo->a;.  andF
c8a0: 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 54 52 41  lags = ~0;.  TRA
c8b0: 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
c8c0: 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
c8d0: 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
c8e0: 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
c8f0: 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
c900: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
c910: 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
c920: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
c930: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c940: 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
c950: 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
c960: 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20     int flags;   
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c980: 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61  * Flags asssocia
c990: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
c9a0: 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  .    int nEq;   
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
c9d0: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
c9e0: 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  ts */.    double
c9f0: 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
ca00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
ca10: 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  t for pIdx */.  
ca20: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca40: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
ca50: 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
ca60: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73  .    Index *pBes
ca70: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
ca80: 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64   /* The best ind
ca90: 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  ex seen so far *
caa0: 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c  /.    int bestFl
cab0: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
cac0: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
cad0: 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
cae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
caf0: 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
cb00: 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63      /* nEq assoc
cb10: 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
cb20: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c   */.    double l
cb30: 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20  owestCost;      
cb40: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74      /* Cost of t
cb50: 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  he pBest */.    
cb60: 69 6e 74 20 62 65 73 74 4a 3b 20 20 20 20 20 20  int bestJ;      
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cb80: 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
cb90: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
cbc0: 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
cbd0: 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43   */..    lowestC
cbe0: 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
cbf0: 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  _DBL;.    for(j=
cc00: 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d  iFrom, pTabItem=
cc10: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
cc20: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
cc30: 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  c; j++, pTabItem
cc40: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 67  ++){.      m = g
cc50: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
cc60: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
cc70: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  or);.      if( (
cc80: 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  m & notReady)==0
cc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
cca0: 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
ccb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
ccc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
ccd0: 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49      cost = bestI
cce0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63  ndex(pParse, &wc
ccf0: 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
cd00: 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d               (i=
cd20: 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29  =0 && ppOrderBy)
cd30: 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
cd40: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
cd50: 20 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c            &pIdx,
cd60: 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a   &flags, &nEq);.
cd70: 20 20 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c        if( cost<l
cd80: 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20  owestCost ){.   
cd90: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
cda0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  = cost;.        
cdb0: 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
cdc0: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
cdd0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
cde0: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
cdf0: 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
ce00: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
ce10: 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e   if( (pTabItem->
ce20: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
ce30: 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
ce40: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 6a  0.         || (j
ce50: 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
ce60: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28  -1].jointype & (
ce70: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
ce80: 29 29 21 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a  ))!=0).      ){.
ce90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cea0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ceb0: 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74   TRACE(("*** Opt
cec0: 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74 61  imizer choose ta
ced0: 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20  ble %d for loop 
cee0: 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20  %d\n", bestJ,.  
cef0: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
cf00: 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20  pWInfo->a));.   
cf10: 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73 20   if( (bestFlags 
cf20: 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  & WHERE_ORDERBY)
cf30: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  !=0 ){.      *pp
cf40: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
cf50: 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20   }.    andFlags 
cf60: 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20  &= bestFlags;.  
cf70: 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20    pLevel->flags 
cf80: 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20  = bestFlags;.   
cf90: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20   pLevel->pIdx = 
cfa0: 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76 65  pBest;.    pLeve
cfb0: 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45 71  l->nEq = bestNEq
cfc0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49  ;.    pLevel->aI
cfd0: 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70  nLoop = 0;.    p
cfe0: 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a  Level->nIn = 0;.
cff0: 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
d000: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
d010: 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
d020: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nTab++;.    }el
d030: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
d040: 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
d050: 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61      }.    notRea
d060: 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
d070: 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  maskSet, pTabLis
d080: 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72  t->a[bestJ].iCur
d090: 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  sor);.    pLevel
d0a0: 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b  ->iFrom = bestJ;
d0b0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 2a  .  }.  TRACE(("*
d0c0: 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
d0d0: 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
d0e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74  .  /* If the tot
d0f0: 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65  al query only se
d100: 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72  lects a single r
d110: 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44  ow, then the ORD
d120: 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
d130: 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e  e is irrelevant.
d140: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64  .  */.  if( (and
d150: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
d160: 49 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72  IQUE)!=0 && ppOr
d170: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70  derBy ){.    *pp
d180: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
d190: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
d1a0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
d1b0: 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
d1c0: 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
d1d0: 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
d1e0: 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
d1f0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
d200: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
d210: 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
d220: 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
d230: 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
d240: 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57  */.  pLevel = pW
d250: 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  Info->a;.  for(i
d260: 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
d270: 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
d280: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
d290: 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
d2a0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64  e *pTab;.    Ind
d2b0: 65 78 20 2a 70 49 78 3b 0a 20 20 20 20 69 6e 74  ex *pIx;.    int
d2c0: 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
d2d0: 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66  l->iIdxCur;..#if
d2e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2f0: 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
d300: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d310: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==2 ){.      cha
d320: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73  r *zMsg;.      s
d330: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
d340: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
d350: 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
d360: 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a  >iFrom];.      z
d370: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
d380: 69 6e 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c  intf("TABLE %s",
d390: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
d3a0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
d3b0: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
d3c0: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
d3d0: 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20  3MPrintf("%z AS 
d3e0: 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
d3f0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
d400: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 49   }.      if( (pI
d410: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
d420: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
d430: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
d440: 72 69 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49  rintf("%z WITH I
d450: 4e 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20  NDEX %s", zMsg, 
d460: 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pIx->zName);.   
d470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
d480: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48  vel->flags & (WH
d490: 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
d4a0: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
d4b0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
d4c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d4d0: 28 22 25 7a 20 55 53 49 4e 47 20 49 4e 54 45 47  ("%z USING INTEG
d4e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
d4f0: 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
d500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d510: 65 4f 70 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61  eOp3(v, OP_Expla
d520: 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  in, i, pLevel->i
d530: 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44  From, zMsg, P3_D
d540: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
d550: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d560: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
d570: 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
d580: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
d590: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
d5a0: 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
d5b0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
d5c0: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
d5d0: 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
d5e0: 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
d5f0: 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66    if( (pLevel->f
d600: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
d610: 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
d620: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
d630: 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c  bleForReading(v,
d640: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
d650: 6f 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  or, pTab);.    }
d660: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
d670: 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
d680: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
d690: 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
d6a0: 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
d6b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d6c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d6d0: 72 2c 20 70 49 78 2d 3e 69 44 62 2c 20 30 29 3b  r, pIx->iDb, 0);
d6e0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d6f0: 6e 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70  nt((v, "# %s", p
d700: 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
d710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d720: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
d730: 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
d740: 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
d750: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
d760: 2a 29 26 70 49 78 2d 3e 6b 65 79 49 6e 66 6f 2c  *)&pIx->keyInfo,
d770: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
d780: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65    }.    if( (pLe
d790: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
d7a0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
d7b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d7c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7d0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
d7e0: 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f  IdxCur, pIx->nCo
d7f0: 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  lumn+1);.    }. 
d800: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
d810: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
d820: 65 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  e, pTab->iDb);. 
d830: 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
d840: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
d850: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
d860: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
d870: 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
d880: 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
d890: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
d8a0: 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
d8b0: 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
d8c0: 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
d8d0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
d8e0: 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
d8f0: 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
d900: 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
d910: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  0;.  for(i=0, pL
d920: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
d930: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
d940: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
d950: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
d960: 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
d970: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20  Item->iCursor;  
d980: 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
d990: 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
d9a0: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
d9b0: 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx;       /* Th
d9c0: 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
d9d0: 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
d9e0: 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
d9f0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
da00: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
da10: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  dex */.    int o
da20: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a  mitTable;     /*
da30: 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
da40: 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
da50: 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20  /.    int bRev; 
da60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
da70: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
da80: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
da90: 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61  rder */..    pTa
daa0: 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
dab0: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
dac0: 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  om];.    iCur = 
dad0: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
dae0: 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  r;.    pIdx = pL
daf0: 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
db00: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
db10: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62  ->iIdxCur;.    b
db20: 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  Rev = (pLevel->f
db30: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
db40: 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d  ERSE)!=0;.    om
db50: 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
db60: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
db70: 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a  _IDX_ONLY)!=0;..
db80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
db90: 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
dba0: 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
dbb0: 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
dbc0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
dbd0: 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
dbe0: 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72  ump to brk to br
dbf0: 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
dc00: 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74  p..    ** Jump t
dc10: 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
dc20: 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
dc30: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
dc40: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  f the.    ** loo
dc50: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72  p..    */.    br
dc60: 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20  k = pLevel->brk 
dc70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dc80: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63  eLabel(v);.    c
dc90: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
dca0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
dcb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
dcc0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
dcd0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
dce0: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
dcf0: 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
dd00: 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69  and.    ** initi
dd10: 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
dd20: 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
dd30: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
dd40: 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a  atches any.    *
dd50: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
dd60: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
dd70: 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oin..    */.    
dd80: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
dd90: 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
dda0: 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  [-1].jointype & 
ddb0: 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
ddc0: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
ddd0: 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
dde0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
ddf0: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
de00: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
de10: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
de20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
de30: 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65  MemInt, 0, pLeve
de40: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
de50: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
de60: 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c 45 46  ((v, "# init LEF
de70: 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
de80: 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  flag"));.    }..
de90: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
dea0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
deb0: 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  WID_EQ ){.      
dec0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63  /* Case 1:  We c
ded0: 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
dee0: 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
def0: 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
df00: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
df10: 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
df20: 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
df30: 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
df40: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
df50: 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
df60: 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
df70: 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
df80: 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20  ..)".      **   
df90: 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
dfa0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
dfb0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
dfc0: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
dfd0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
dfe0: 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
dff0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
e000: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
e010: 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
e020: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
e030: 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ert( pTerm->left
e040: 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
e050: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
e060: 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
e070: 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
e080: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
e090: 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29  rm, brk, pLevel)
e0a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e0b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e0c0: 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 62 72 6b  ustBeInt, 1, brk
e0d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e0e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e0f0: 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
e100: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62   brk);.      Vdb
e110: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
e120: 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  "));.      pLeve
e130: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
e140: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
e150: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e160: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
e170: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
e180: 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
e190: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
e1a0: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
e1b0: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
e1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e1d0: 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e  nt testOp = OP_N
e1e0: 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  oop;.      int s
e1f0: 74 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72  tart;.      Wher
e200: 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
e210: 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73  pEnd;..      ass
e220: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
e230: 30 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72  0 );.      pStar
e240: 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  t = findTerm(&wc
e250: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
e260: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
e270: 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e  E, 0);.      pEn
e280: 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  d = findTerm(&wc
e290: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
e2a0: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
e2b0: 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
e2c0: 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
e2d0: 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
e2e0: 0a 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20  .        pStart 
e2f0: 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  = pEnd;.        
e300: 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
e310: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e320: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
e330: 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
e340: 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
e350: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
e360: 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
e370: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e380: 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
e390: 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
e3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e3b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
e3c0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
e3d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e3e0: 4f 70 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e  Op(v, OP_ForceIn
e3f0: 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  t, pX->op==TK_LE
e400: 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
e410: 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  T, brk);.       
e420: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e430: 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d  p(v, bRev ? OP_M
e440: 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47  oveLt : OP_MoveG
e450: 65 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  e, iCur, brk);. 
e460: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
e470: 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
e480: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
e490: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
e4a0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
e4b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e4c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65  VdbeAddOp(v, bRe
e4d0: 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
e4e0: 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62  _Rewind, iCur, b
e4f0: 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rk);.      }.   
e500: 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
e510: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
e520: 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 45  .        pX = pE
e530: 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
e540: 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
e550: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
e560: 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
e570: 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
e580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e590: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
e5a0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
e5b0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
e5c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
e5d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e5e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e5f0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
e600: 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  l->iMem, 1);.   
e610: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
e620: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
e630: 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
e640: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
e650: 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
e660: 47 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  Ge;.        }els
e670: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  e{.          tes
e680: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
e690: 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
e6a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 69      }.        di
e6b0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
e6c0: 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d  , pEnd);.      }
e6d0: 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
e6e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e6f0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
e700: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
e710: 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
e720: 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
e730: 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
e740: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
e750: 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20   = start;.      
e760: 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
e770: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
e780: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e790: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
e7a0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r, 0);.        s
e7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e7c0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
e7d0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
e7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e7f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
e800: 74 4f 70 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  tOp, SQLITE_AFF_
e810: 4e 55 4d 45 52 49 43 2c 20 62 72 6b 29 3b 0a 20  NUMERIC, brk);. 
e820: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e830: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
e840: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
e850: 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
e860: 20 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65 20   /* Case 3: The 
e870: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
e880: 6d 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  m that refers to
e890: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
e8a0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e8b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
e8c0: 6e 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71 75  ndex is an inequ
e8d0: 61 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61 6d  ality.  For exam
e8e0: 70 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  ple, if.      **
e8f0: 20 20 20 20 20 20 20 20 20 74 68 65 20 69 6e 64           the ind
e900: 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29  ex is on (x,y,z)
e910: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
e920: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 0a  lause is of the.
e930: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e940: 20 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20 79   form "x=5 AND y
e950: 3c 31 30 22 20 74 68 65 6e 20 74 68 69 73 20 63  <10" then this c
e960: 61 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f 6e  ase is used.  On
e970: 6c 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ly the.      ** 
e980: 20 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d 6f          right-mo
e990: 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
e9a0: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
e9b0: 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
e9c0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
e9d0: 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
e9e0: 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
e9f0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
ea00: 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
ea10: 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
ea20: 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
ea30: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
ea40: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
ea50: 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
ea60: 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
ea70: 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
ea80: 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
ea90: 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
eaa0: 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
eab0: 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
eac0: 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
ead0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
eae0: 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e   start;.      in
eaf0: 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
eb00: 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  nEq;.      int l
eb10: 65 46 6c 61 67 3d 30 2c 20 67 65 46 6c 61 67 3d  eFlag=0, geFlag=
eb20: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  0;.      int tes
eb30: 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  tOp;.      int t
eb40: 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  opLimit = (pLeve
eb50: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
eb60: 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _TOP_LIMIT)!=0;.
eb70: 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d        int btmLim
eb80: 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
eb90: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
eba0: 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20 20  LIMIT)!=0;..    
ebb0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ebc0: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
ebd0: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
ebe0: 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
ebf0: 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  IN.      ** and 
ec00: 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73  level the values
ec10: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
ec20: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
ec30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
ec40: 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
ec50: 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
ec60: 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c  , &wc, notReady,
ec70: 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a   brk);..      /*
ec80: 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 65   Duplicate the e
ec90: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61 6c  quality term val
eca0: 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65 79  ues because they
ecb0: 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20 20   will all be.   
ecc0: 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63 65     ** used twice
ecd0: 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74  : once to make t
ece0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
ecf0: 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20 6d  ey and once to m
ed00: 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ake the.      **
ed10: 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20   start key..    
ed20: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a    */.      for(j
ed30: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
ed40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ed50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ed60: 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29 3b 0a  Dup, nEq-1, 0);.
ed70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
ed80: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
ed90: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20  ermination key. 
eda0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
edb0: 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20   value that.    
edc0: 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68    ** will end th
edd0: 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
ede0: 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69   is no terminati
edf0: 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a  on key if there.
ee00: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20        ** are no 
ee10: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
ee20: 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65  nd no "X<..." te
ee30: 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm..      **.   
ee40: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
ee50: 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d  4: On a reverse-
ee60: 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20  order scan, the 
ee70: 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69  so-called "termi
ee80: 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a  nation".      **
ee90: 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65   key computed he
eea0: 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  re really ends u
eeb0: 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72  p being the star
eec0: 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
eed0: 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d        if( topLim
eee0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
eef0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
ef00: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
ef10: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
ef20: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
ef30: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
ef40: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
ef50: 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a  T|WO_LE, pIdx);.
ef60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ef70: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
ef80: 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
ef90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
efa0: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
efb0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
efc0: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
efd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
efe0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
eff0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ght);.        le
f000: 46 6c 61 67 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54  Flag = pX->op==T
f010: 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 64 69  K_LE;.        di
f020: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
f030: 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
f040: 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64    testOp = OP_Id
f050: 78 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xGE;.      }else
f060: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
f070: 20 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64   = nEq>0 ? OP_Id
f080: 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  xGE : OP_Noop;. 
f090: 20 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20         leFlag = 
f0a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
f0b0: 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
f0c0: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
f0d0: 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
f0e0: 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   topLimit;.     
f0f0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
f100: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
f110: 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49  ;.        buildI
f120: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f  ndexProbe(v, nCo
f130: 6c 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  l, brk, pIdx);. 
f140: 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
f150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f160: 20 6f 70 20 3d 20 6c 65 46 6c 61 67 20 3f 20 4f   op = leFlag ? O
f170: 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f  P_MoveLe : OP_Mo
f180: 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veLt;.          
f190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1a0: 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
f1b0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d   brk);.        }
f1c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f1d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1e0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
f1f0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
f200: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f210: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
f220: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  v ){.        sql
f230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f240: 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75   OP_Last, iIdxCu
f250: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
f260: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
f270: 61 74 65 20 74 68 65 20 73 74 61 72 74 20 6b 65  ate the start ke
f280: 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
f290: 6b 65 79 20 74 68 61 74 20 64 65 66 69 6e 65 73  key that defines
f2a0: 20 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20   the lower.     
f2b0: 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65   ** bound on the
f2c0: 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20   search.  There 
f2d0: 69 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20  is no start key 
f2e0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
f2f0: 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74        ** equalit
f300: 79 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74  y terms and if t
f310: 68 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e  here is no "X>..
f320: 2e 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20  ." term.  In.   
f330: 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c     ** that case,
f340: 20 67 65 6e 65 72 61 74 65 20 61 20 22 52 65 77   generate a "Rew
f350: 69 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  ind" instruction
f360: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
f370: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20  .      ** start 
f380: 6b 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20  key search..    
f390: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30    **.      ** 20
f3a0: 30 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68  02-Dec-04: In th
f3b0: 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 76 65  e case of a reve
f3c0: 72 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68  rse-order search
f3d0: 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a  , the so-called.
f3e0: 20 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22        ** "start"
f3f0: 20 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73   key really ends
f400: 20 75 70 20 62 65 69 6e 67 20 75 73 65 64 20 61   up being used a
f410: 73 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  s the terminatio
f420: 6e 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  n key..      */.
f430: 20 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d        if( btmLim
f440: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
f450: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
f460: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
f470: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
f480: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
f490: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
f4a0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
f4b0: 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a  T|WO_GE, pIdx);.
f4c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f4d0: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
f4e0: 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
f4f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
f500: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
f510: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
f520: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
f530: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f540: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
f550: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 67 65  ght);.        ge
f560: 46 6c 61 67 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54  Flag = pX->op==T
f570: 4b 5f 47 45 3b 0a 20 20 20 20 20 20 20 20 64 69  K_GE;.        di
f580: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
f590: 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
f5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67  }else{.        g
f5b0: 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20  eFlag = 1;.     
f5c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
f5d0: 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29  >0 || btmLimit )
f5e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
f5f0: 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69  ol = nEq + btmLi
f600: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 62 75 69  mit;.        bui
f610: 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
f620: 6e 43 6f 6c 2c 20 62 72 6b 2c 20 70 49 64 78 29  nCol, brk, pIdx)
f630: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52  ;.        if( bR
f640: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
f650: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
f660: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
f670: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f690: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
f6a0: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
f6b0: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
f6c0: 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20 20  P_IdxLT;.       
f6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f6e0: 20 20 69 6e 74 20 6f 70 20 3d 20 67 65 46 6c 61    int op = geFla
f6f0: 67 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20  g ? OP_MoveGe : 
f700: 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20  OP_MoveGt;.     
f710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f720: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64  AddOp(v, op, iId
f730: 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
f740: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f750: 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
f760: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
f770: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65  P_Noop;.      }e
f780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
f790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f7a0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
f7b0: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
f7c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
f7d0: 65 72 61 74 65 20 74 68 65 20 74 68 65 20 74 6f  erate the the to
f7e0: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  p of the loop.  
f7f0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65  If there is a te
f800: 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  rmination.      
f810: 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65 20 74  ** key we have t
f820: 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61 74 20  o test for that 
f830: 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74  key and abort at
f840: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
f850: 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20        ** loop.. 
f860: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
f870: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
f880: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
f890: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
f8a0: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
f8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f8c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
f8d0: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
f8e0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
f8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f900: 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49 64 78  (v, testOp, iIdx
f910: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
f920: 20 20 20 69 66 28 20 28 6c 65 46 6c 61 67 20 26     if( (leFlag &
f930: 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21 67 65  & !bRev) || (!ge
f940: 46 6c 61 67 20 26 26 20 62 52 65 76 29 20 29 7b  Flag && bRev) ){
f950: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f960: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
f970: 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54  , -1, "+", P3_ST
f980: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
f990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f9b0: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49  v, OP_RowKey, iI
f9c0: 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
f9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9e0: 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c  p(v, OP_IdxIsNul
f9f0: 6c 2c 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69  l, nEq + topLimi
fa00: 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20  t, cont);.      
fa10: 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
fa20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fa30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fa40: 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
fa50: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
fa60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa70: 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
fa80: 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
fa90: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72  ..      /* Recor
faa0: 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
fab0: 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
fac0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20  ate the loop..  
fad0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65      */.      pLe
fae0: 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
faf0: 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
fb00: 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
fb10: 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
fb20: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
fb30: 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
fb40: 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
fb50: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
fb60: 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20  LUMN_EQ ){.     
fb70: 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65   /* Case 4:  The
fb80: 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61  re is an index a
fb90: 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  nd all terms of 
fba0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
fbb0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20   that.      **  
fbc0: 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74 6f          refer to
fbd0: 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
fbe0: 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e   the "==" or "IN
fbf0: 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20  " operators..   
fc00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
fc10: 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
fc20: 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
fc30: 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  Eq;..      /* Ge
fc40: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
fc50: 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
fc60: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
fc70: 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
fc80: 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20 74    ** and leave t
fc90: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
fca0: 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
fcb0: 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
fcc0: 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
fcd0: 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
fce0: 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
fcf0: 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a  notReady, brk);.
fd00: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
fd10: 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20  te a single key 
fd20: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
fd30: 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74 20  d to both start 
fd40: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20 20  and terminate.  
fd50: 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63      ** the searc
fd60: 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  h.      */.     
fd70: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
fd80: 28 76 2c 20 6e 45 71 2c 20 62 72 6b 2c 20 70 49  (v, nEq, brk, pI
fd90: 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dx);.      sqlit
fda0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fdb0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76  P_MemStore, pLev
fdc0: 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  el->iMem, 0);.. 
fdd0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
fde0: 20 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76   code (1) to mov
fdf0: 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d  e to the first m
fe00: 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20  atching element 
fe10: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
fe20: 20 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65      ** Then gene
fe30: 72 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68  rate code (2) th
fe40: 61 74 20 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b  at jumps to "brk
fe50: 22 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73  " after the curs
fe60: 6f 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20  or is past.     
fe70: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74   ** the last mat
fe80: 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  ching element of
fe90: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
fea0: 20 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65   code (1) is exe
feb0: 63 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f  cuted.      ** o
fec0: 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
fed0: 65 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68  e the search, th
fee0: 65 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78  e code (2) is ex
fef0: 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61  ecuted before ea
ff00: 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72  ch.      ** iter
ff10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61  ation of the sca
ff20: 6e 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  n to see if the 
ff30: 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65  scan has finishe
ff40: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  d. */.      if( 
ff50: 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
ff60: 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
ff70: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
ff80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c  ddOp(v, OP_MoveL
ffa0: 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  e, iIdxCur, brk)
ffb0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
ffc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ffd0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
ffe0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
fff0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10000 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10010 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43 75  OP_IdxLT, iIdxCu
10020 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
10030 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
10040 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c  _Prev;.      }el
10050 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  se{.        /* S
10060 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61  can in the forwa
10070 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  rd order */.    
10080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10090 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
100a0 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  e, iIdxCur, brk)
100b0 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
100c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
100d0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
100e0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
100f0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10100 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10110 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72 2c  _IdxGE, iIdxCur,
10120 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54   brk, "+", P3_ST
10130 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 70  ATIC);.        p
10140 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
10150 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
10160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10170 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  dOp(v, OP_RowKey
10180 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  , iIdxCur, 0);. 
10190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
101b0 73 4e 75 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74  sNull, nEq, cont
101c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
101d0 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
101e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
101f0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
10200 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
10210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10220 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10230 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
10240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10250 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
10260 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  xCur;.      pLev
10270 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
10280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10290 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65   /* Case 5:  The
102a0 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
102b0 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
102c0 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
102d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
102e0 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
102f0 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  re table..      
10300 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
10310 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
10320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
10330 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Rev==0 );.      
10340 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
10350 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
10360 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
10370 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
10380 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
10390 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
103a0 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  ind, iCur, brk);
103b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
103c0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
103d0 26 6d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  &maskSet, iCur);
103e0 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
103f0 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
10400 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
10410 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
10420 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63  pletely.    ** c
10430 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
10440 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
10450 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a   tables..    */.
10460 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63      for(pTerm=wc
10470 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20  .a, j=wc.nTerm; 
10480 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
10490 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
104a0 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  pE;.      if( pT
104b0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45  erm->flags & (TE
104c0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
104d0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
104e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
104f0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
10500 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
10510 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
10520 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
10530 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
10540 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
10550 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
10560 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
10570 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
10580 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
10590 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
105a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
105b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
105c0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e  (pParse, pE, con
105d0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 65  t, 1);.      pTe
105e0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
105f0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a  M_CODED;.    }..
10600 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46      /* For a LEF
10610 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
10620 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10630 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
10640 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a   fact that.    *
10650 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
10660 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
10670 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
10680 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
10690 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
106a0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
106b0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c  Join ){.      pL
106c0 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69  evel->top = sqli
106d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
106e0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
106f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10700 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70   OP_MemInt, 1, p
10710 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
10720 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
10730 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65 63 6f  ment((v, "# reco
10740 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
10750 22 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  "));.      for(p
10760 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20  Term=wc.a, j=0; 
10770 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  j<wc.nTerm; j++,
10780 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
10790 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
107a0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
107b0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
107c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
107d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
107e0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
107f0 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69  eady)!=0 ) conti
10800 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
10810 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
10820 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
10830 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
10840 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
10850 45 78 70 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a  Expr, cont, 1);.
10860 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
10870 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
10880 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
10890 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
108a0 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
108b0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
108c0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
108d0 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
108e0 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
108f0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
10900 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
10910 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
10920 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
10930 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
10940 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
10950 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
10960 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
10970 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
10980 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
10990 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
109a0 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
109b0 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
109c0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
109d0 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
109e0 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
109f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
10a00 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
10a10 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rc; i++){.    ch
10a20 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
10a30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
10a40 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
10a50 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
10a60 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
10a70 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
10a80 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
10a90 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
10aa0 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
10ab0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
10ac0 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b    n = strlen(z);
10ad0 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61  .    if( n+nQPla
10ae0 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
10af0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31  e3_query_plan)-1
10b00 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
10b10 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
10b20 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
10b30 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
10b40 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
10b50 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
10b60 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  ");.        nQPl
10b70 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  an += 2;.      }
10b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
10b90 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
10ba0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
10bb0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , z);.        nQ
10bc0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
10bd0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10be0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
10bf0 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
10c00 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
10c10 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
10c20 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
10c30 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
10c40 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73  .      strcpy(&s
10c50 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
10c60 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29  n[nQPlan], "* ")
10c70 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
10c80 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
10c90 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d  f( pLevel->pIdx=
10ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  =0 ){.      strc
10cb0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
10cc0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
10cd0 22 7b 7d 20 22 29 3b 0a 20 20 20 20 20 20 6e 51  "{} ");.      nQ
10ce0 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
10cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
10d00 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70  strlen(pLevel->p
10d10 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
10d20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
10d30 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
10d40 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29  _query_plan)-2 )
10d50 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  {.        strcpy
10d60 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
10d70 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c  plan[nQPlan], pL
10d80 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
10d90 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  e);.        nQPl
10da0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
10db0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
10dc0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
10dd0 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
10de0 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
10df0 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69  nQPlan>0 && sqli
10e00 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
10e10 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b  QPlan-1]==' ' ){
10e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65  .    sqlite3_que
10e30 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e  ry_plan[--nQPlan
10e40 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  ] = 0;.  }.  sql
10e50 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
10e60 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e  nQPlan] = 0;.  n
10e70 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69  QPlan = 0;.#endi
10e80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
10e90 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20   // Testing and 
10ea0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
10eb0 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  ly */..  /* Reco
10ec0 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  rd the continuat
10ed0 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74  ion address in t
10ee0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
10ef0 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20  ucture.  Then.  
10f00 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** clean up and 
10f10 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70  return..  */.  p
10f20 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
10f30 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65   = cont;.  where
10f40 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63 29  ClauseClear(&wc)
10f50 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
10f60 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
10f70 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
10f80 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
10f90 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c  NoMem:.  whereCl
10fa0 61 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a  auseClear(&wc);.
10fb0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49    sqliteFree(pWI
10fc0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nfo);.  return 0
10fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
10fe0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
10ff0 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
11000 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
11010 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
11020 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
11030 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
11040 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
11050 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
11060 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
11070 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e    Vdbe *v = pWIn
11080 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62  fo->pParse->pVdb
11090 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
110a0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
110b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
110c0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
110d0 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  pTabList;..  /* 
110e0 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
110f0 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
11100 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61    */.  for(i=pTa
11110 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69  bList->nSrc-1; i
11120 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
11130 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
11140 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
11150 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11160 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f  el(v, pLevel->co
11170 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
11180 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
11190 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
111a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c  3VdbeAddOp(v, pL
111b0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
111c0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
111d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
111e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
111f0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
11200 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  brk);.    if( pL
11210 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20  evel->nIn ){.   
11220 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20 20 20 20     int *a;.     
11230 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
11240 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c  r(j=pLevel->nIn,
11250 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c   a=&pLevel->aInL
11260 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b 20 6a 3e 30 3b  oop[j*3-3]; j>0;
11270 20 6a 2d 2d 2c 20 61 2d 3d 33 29 7b 0a 20 20 20   j--, a-=3){.   
11280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11290 41 64 64 4f 70 28 76 2c 20 61 5b 30 5d 2c 20 61  AddOp(v, a[0], a
112a0 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 20 20  [1], a[2]);.    
112b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
112c0 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e  Free(pLevel->aIn
112d0 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
112e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
112f0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
11300 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
11310 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
11320 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
11330 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  MemPos, pLevel->
11340 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20  iLeftJoin, 0);. 
11350 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11360 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
11370 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
11380 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b  [i].iCursor, 0);
11390 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
113a0 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
113b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
113c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
113d0 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
113e0 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20  >iIdxCur, 0);.  
113f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11400 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11410 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
11420 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20  el->top);.      
11430 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11440 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
11450 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
11460 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
11470 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
11480 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11490 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
114a0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
114b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
114c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
114d0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
114e0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
114f0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
11500 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
11510 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11520 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  in..  */.  for(i
11530 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
11540 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
11550 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
11560 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
11570 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
11580 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
11590 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
115a0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
115b0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
115c0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
115d0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
115e0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
115f0 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70  isTransient || p
11600 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
11610 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
11620 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
11630 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
11640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11660 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
11670 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
11680 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11690 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30   pLevel->pIdx!=0
116a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
116b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
116c0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
116d0 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
116e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
116f0 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74  cursor substitut
11700 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77  ions for cases w
11710 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20  here we want to 
11720 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  use.    ** just 
11730 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65  the index and ne
11740 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68  ver reference th
11750 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
11760 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
11770 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
11780 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
11790 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
117a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
117b0 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
117c0 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
117d0 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
117e0 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
117f0 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
11800 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
11810 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
11820 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
11830 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
11840 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
11850 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
11860 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
11870 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
11880 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
11890 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
118a0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
118b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
118c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
118d0 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
118e0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
118f0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
11900 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20  Level->pIdx;..  
11910 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11920 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  !=0 );.      pOp
11930 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
11940 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  tOp(v, pWInfo->i
11950 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74  Top);.      last
11960 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11970 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11980 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f      for(i=pWInfo
11990 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73 74 3b 20  ->iTop; i<last; 
119a0 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i++, pOp++){.   
119b0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
119c0 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
119d0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
119e0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
119f0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
11a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
11a10 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
11a20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
11a30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
11a40 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
11a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
11a60 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
11a70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
11a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
11a90 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
11aa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
11ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11ad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
11ae0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
11af0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
11b00 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
11b10 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
11b20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
11b30 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
11b40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11b50 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
11b60 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  P_NullRow ){.   
11b70 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
11b80 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
11b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11ba0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11bb0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
11bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  */.  sqliteFree(
11bd0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
11be0 6e 3b 0a 7d 0a                                   n;.}.