/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7ce7a52fdc696d26cd9f9c939dc972585d3dd72d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 30 30   where.c,v 1.200
0340: 20 32 30 30 36 2f 30 31 2f 32 30 20 31 38 3a 31   2006/01/20 18:1
0350: 30 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a  0:57 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 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3dc0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
3dd0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 29 20  Idx->azColl[k]) 
3de0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3df0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
3e00: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
3e10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3e20: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3e30: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3e40: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
3e50: 28 53 72 63 4c 69 73 74 2a 2c 20 45 78 70 72 4d  (SrcList*, ExprM
3e60: 61 73 6b 53 65 74 2a 2c 20 57 68 65 72 65 43 6c  askSet*, WhereCl
3e70: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
3e80: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
3e90: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
3ea0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
3eb0: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
3ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3ed0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
3ee0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
3ef0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
3f00: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  OM clause */.  E
3f10: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
3f20: 6b 53 65 74 2c 20 20 20 2f 2a 20 74 61 62 6c 65  kSet,   /* table
3f30: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72   masks */.  Wher
3f40: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
3f50: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
3f60: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
3f70: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
3f80: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
3f90: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
3fa0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
3fb0: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
3fc0: 74 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  t, pMaskSet, pWC
3fd0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
3fe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ff0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4000: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
4010: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
4020: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
4030: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
4040: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
4050: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
4060: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
4070: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
4080: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4090: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
40a0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
40b0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
40c0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
40d0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
40e0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
40f0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
4100: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
4110: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
4120: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
4130: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
4140: 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  OrGlob(.  sqlite
4150: 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54  3 *db,      /* T
4160: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4170: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
4180: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
4190: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
41a0: 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20  int *pnPattern, 
41b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
41c0: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
41d0: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
41e0: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
41f0: 65 74 65 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ete  /* True if 
4200: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
4210: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
4220: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
4230: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
4240: 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  *z;.  Expr *pRig
4250: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78  ht, *pLeft;.  Ex
4260: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
4270: 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 69   int c, cnt;.  i
4280: 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 63 68 61  nt noCase;.  cha
4290: 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53  r wc[3];.  CollS
42a0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66  eq *pColl;..  if
42b0: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
42c0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
42d0: 70 72 2c 20 26 6e 6f 43 61 73 65 2c 20 77 63 29  pr, &noCase, wc)
42e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
42f0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
4300: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
4310: 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e  pRight = pList->
4320: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
4330: 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ( pRight->op!=TK
4340: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72  _STRING ){.    r
4350: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4360: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
4370: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
4380: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
4390: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
43a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
43b0: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
43c0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
43d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
43e0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
43f0: 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d   }.  if( (pColl-
4400: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
4410: 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 6e 6f 43  LL_BINARY || noC
4420: 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70  ase) &&.      (p
4430: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
4440: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c  TE_COLL_NOCASE |
4450: 7c 20 21 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20  | !noCase) ){.  
4460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4470: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4480: 45 78 70 72 28 70 52 69 67 68 74 29 3b 0a 20 20  Expr(pRight);.  
4490: 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67  z = (char *)pRig
44a0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66  ht->token.z;.  f
44b0: 6f 72 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63  or(cnt=0; (c=z[c
44c0: 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63  nt])!=0 && c!=wc
44d0: 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20  [0] && c!=wc[1] 
44e0: 26 26 20 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74  && c!=wc[2]; cnt
44f0: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d  ++){}.  if( cnt=
4500: 3d 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a  =0 || 255==(u8)z
4510: 5b 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74  [cnt] ){.    ret
4520: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69  urn 0;.  }.  *pi
4530: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e  sComplete = z[cn
4540: 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63  t]==wc[0] && z[c
4550: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50  nt+1]==0;.  *pnP
4560: 61 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20  attern = cnt;.  
4570: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4580: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4590: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
45a0: 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  ION */../*.** If
45b0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
45c0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
45d0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
45e0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
45f0: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
4600: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
4610: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
4620: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
4630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4640: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
4650: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
4660: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
4670: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
4680: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
4690: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
46a0: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
46b0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
46c0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
46d0: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 0a 2f 2a  oinTable;.}.../*
46e0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
46f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4700: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
4710: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
4720: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
4730: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
4740: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
4750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
4760: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
4770: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
4780: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
4790: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
47a0: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
47b0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
47c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
47d0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
47e0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
47f0: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
4800: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
4810: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
4820: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
4830: 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  ".  If the expre
4840: 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74  ssion is of.** t
4850: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4860: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
4870: 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e  and Y are column
4880: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
4890: 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69  inal.** expressi
48a0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
48b0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
48c0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  l expression of 
48d0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
48e0: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
48f0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
4900: 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64  use and analyzed
4910: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
4920: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4930: 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69  Analyze(.  SrcLi
4940: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
4950: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
4960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
4970: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
4980: 65 74 2c 20 20 20 20 2f 2a 20 74 61 62 6c 65 20  et,    /* table 
4990: 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65  masks */.  Where
49a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
49b0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
49c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
49d0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
49e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
49f0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
4a00: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
4a10: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
4a20: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
4a30: 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70 72 20  dxTerm];.  Expr 
4a40: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
4a50: 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61 73 6b  pExpr;.  Bitmask
4a60: 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 42   prereqLeft;.  B
4a70: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
4a80: 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  ;.  int nPattern
4a90: 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  ;.  int isComple
4aa0: 74 65 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  te;..  if( sqlit
4ab0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
4ac0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72 65   ) return;.  pre
4ad0: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
4ae0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4af0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
4b00: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
4b10: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
4b20: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
4b30: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
4b40: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4b50: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
4b60: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4b70: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 0a  , pExpr->pList).
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70 72            | expr
4ba0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
4bb0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4bc0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  ->pSelect);.  }e
4bd0: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
4be0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
4bf0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4c00: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
4c10: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
4c20: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
4c30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4c40: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
4c50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4c60: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
4c70: 69 6e 29 20 29 7b 0a 20 20 20 20 70 72 65 72 65  in) ){.    prere
4c80: 71 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73 6b 28  qAll |= getMask(
4c90: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
4ca0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
4cb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  );.  }.  pTerm->
4cc0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
4cd0: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
4ce0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
4cf0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
4d00: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
4d10: 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  >operator = 0;. 
4d20: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
4d30: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70 54  Expr->op) && (pT
4d40: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
4d50: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
4d60: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
4d70: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4d80: 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  eft;.    Expr *p
4d90: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
4da0: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70  Right;.    if( p
4db0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
4dc0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
4dd0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
4de0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
4df0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
4e00: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
4e10: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
4e20: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
4e30: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
4e40: 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  Expr->op);.    }
4e50: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
4e60: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
4e70: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
4e80: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
4e90: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
4ea0: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
4eb0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4ec0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
4ed0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
4ee0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
4ef0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
4f00: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
4f10: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
4f20: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
4f30: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
4f40: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
4f50: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
4f60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
4f70: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
4f80: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
4f90: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
4fa0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
4fb0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
4fc0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
4fd0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
4fe0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
4ff0: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
5000: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
5010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5020: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
5030: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
5040: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
5050: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
5060: 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c  (pDup);.      pL
5070: 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66  eft = pDup->pLef
5080: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  t;.      pNew->l
5090: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
50a0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
50b0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d   pNew->leftColum
50c0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
50d0: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  mn;.      pNew->
50e0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
50f0: 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20  ereqLeft;.      
5100: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
5110: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
5120: 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61 74 6f     pNew->operato
5130: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
5140: 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20  (pDup->op);.    
5150: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
5160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
5170: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
5180: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
5190: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
51a0: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
51b0: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
51c0: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
51d0: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
51e0: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
51f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a   implements..  *
5200: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
5210: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
5220: 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  EN ){.    ExprLi
5230: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
5240: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  r->pList;.    in
5250: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
5260: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
5270: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
5280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
5290: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
52a0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
52b0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
52c0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
52d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
52e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
52f0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
5300: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
5310: 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71 6c  Expr(ops[i], sql
5320: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
5330: 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20  r->pLeft),.     
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5360: 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e 61 5b  xprDup(pList->a[
5370: 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20  i].pExpr), 0);. 
5380: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
5390: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
53a0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
53b0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
53c0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
53d0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
53e0: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
53f0: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
5400: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
5410: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
5420: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
5430: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
5440: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
5450: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
5460: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5470: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
5480: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
5490: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
54a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
54b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
54c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
54d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
54e0: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63   /* Attempt to c
54f0: 6f 6e 76 65 72 74 20 4f 52 2d 63 6f 6e 6e 65 63  onvert OR-connec
5500: 74 65 64 20 74 65 72 6d 73 20 69 6e 74 6f 20 61  ted terms into a
5510: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  n IN operator so
5520: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
5530: 63 61 6e 20 6d 61 6b 65 20 75 73 65 20 6f 66 20  can make use of 
5540: 69 6e 64 69 63 65 73 2e 20 20 45 78 61 6d 70 6c  indices.  Exampl
5550: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
5560: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
5570: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
5580: 78 20 3d 20 65 78 70 72 33 0a 20 20 2a 2a 0a 20  x = expr3.  **. 
5590: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
55a0: 20 69 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20   into.  **.  ** 
55b0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
55c0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 20 20  ,expr2,expr3).  
55d0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 74  **.  ** This opt
55e0: 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62  imization must b
55f0: 65 20 6f 6d 69 74 74 65 64 20 69 66 20 4f 4d 49  e omitted if OMI
5600: 54 5f 53 55 42 51 55 45 52 59 20 69 73 20 64 65  T_SUBQUERY is de
5610: 66 69 6e 65 64 20 62 65 63 61 75 73 65 0a 20 20  fined because.  
5620: 2a 2a 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ** the compiler 
5630: 66 6f 72 20 74 68 65 20 74 68 65 20 49 4e 20 6f  for the the IN o
5640: 70 65 72 61 74 6f 72 20 69 73 20 70 61 72 74 20  perator is part 
5650: 6f 66 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a  of sub-queries..
5660: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
5670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
5680: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a   ){.    int ok;.
5690: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
56a0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69    int iColumn, i
56b0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68 65 72  Cursor;.    Wher
56c0: 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20 20 20  eClause sOr;.   
56d0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
56e0: 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  erm;..    assert
56f0: 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
5700: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d  & TERM_DYNAMIC)=
5710: 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72 65 43  =0 );.    whereC
5720: 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72 2c 20  lauseInit(&sOr, 
5730: 70 57 43 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20  pWC->pParse);.  
5740: 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 73 4f    whereSplit(&sO
5750: 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  r, pExpr, TK_OR)
5760: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
5770: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4d 61 73 6b  eAll(pSrc, pMask
5780: 53 65 74 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20  Set, &sOr);.    
5790: 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54 65 72  assert( sOr.nTer
57a0: 6d 3e 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  m>0 );.    j = 0
57b0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
57c0: 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b  iColumn = sOr.a[
57d0: 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  j].leftColumn;. 
57e0: 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 73       iCursor = s
57f0: 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73  Or.a[j].leftCurs
5800: 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69  or;.      ok = i
5810: 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20  Cursor>=0;.     
5820: 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d   for(i=sOr.nTerm
5830: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e  -1, pOrTerm=sOr.
5840: 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69  a; i>=0 && ok; i
5850: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
5860: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
5870: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 21 3d 57  erm->operator!=W
5880: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
5890: 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f    goto or_not_po
58a0: 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ssible;.        
58b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
58c0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
58d0: 72 3d 3d 69 43 75 72 73 6f 72 20 26 26 20 70 4f  r==iCursor && pO
58e0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  rTerm->leftColum
58f0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
5900: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
5910: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  >flags |= TERM_O
5920: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
5930: 6c 73 65 20 69 66 28 20 28 70 4f 72 54 65 72 6d  lse if( (pOrTerm
5940: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
5950: 4f 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20 20 20  OPIED)!=0 ||.   
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67   ((pOrTerm->flag
5980: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
5990: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 4f               (sO
59b0: 72 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  r.a[pOrTerm->iPa
59c0: 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20 54 45  rent].flags & TE
59d0: 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20 29 7b  RM_OR_OK)!=0) ){
59e0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
59f0: 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45  rm->flags &= ~TE
5a00: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
5a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5a20: 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20     ok = 0;.     
5a30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5a40: 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26 26 20   }while( !ok && 
5a50: 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67  (sOr.a[j++].flag
5a60: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29  s & TERM_COPIED)
5a70: 21 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e 54 65  !=0 && j<sOr.nTe
5a80: 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b  rm );.    if( ok
5a90: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   ){.      ExprLi
5aa0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
5ab0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c       Expr *pNew,
5ac0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 66 6f   *pDup;.      fo
5ad0: 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c  r(i=sOr.nTerm-1,
5ae0: 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20   pOrTerm=sOr.a; 
5af0: 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c  i>=0 && ok; i--,
5b00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
5b10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
5b20: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
5b30: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
5b40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44  inue;.        pD
5b50: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
5b60: 44 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  Dup(pOrTerm->pEx
5b70: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
5b80: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
5b90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5ba0: 6e 64 28 70 4c 69 73 74 2c 20 70 44 75 70 2c 20  nd(pList, pDup, 
5bb0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5bc0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
5bd0: 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  Expr(TK_COLUMN, 
5be0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
5bf0: 69 66 28 20 70 44 75 70 20 29 7b 0a 20 20 20 20  if( pDup ){.    
5c00: 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62 6c 65      pDup->iTable
5c10: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
5c20: 20 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c 75 6d      pDup->iColum
5c30: 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  n = iColumn;.   
5c40: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20     }.      pNew 
5c50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5c60: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
5c70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
5c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
5c90: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
5ca0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
5cb0: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
5cc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
5cd0: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
5ce0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
5cf0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
5d00: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
5d10: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
5d20: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
5d30: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
5d40: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
5d50: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
5d60: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
5d70: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
5d80: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
5d90: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
5da0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
5db0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
5dc0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
5df0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
5e00: 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69    }.or_not_possi
5e10: 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65 43 6c  ble:.    whereCl
5e20: 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72 29 3b  auseClear(&sOr);
5e30: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
5e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
5e50: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
5e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5e70: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
5e80: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
5e90: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
5ea0: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
5eb0: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
5ec0: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
5ed0: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ator..  */.  if(
5ee0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 57   isLikeOrGlob(pW
5ef0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
5f00: 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c  Expr, &nPattern,
5f10: 20 26 69 73 43 6f 6d 70 6c 65 74 65 29 20 29 7b   &isComplete) ){
5f20: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
5f30: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45  , *pRight;.    E
5f40: 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74  xpr *pStr1, *pSt
5f50: 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r2;.    Expr *pN
5f60: 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78  ewExpr1, *pNewEx
5f70: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
5f80: 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a  New1, idxNew2;..
5f90: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
5fa0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
5fb0: 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74  Expr;.    pRight
5fc0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5fd0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
5fe0: 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33   pStr1 = sqlite3
5ff0: 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20  Expr(TK_STRING, 
6000: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
6010: 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20  ( pStr1 ){.     
6020: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
6030: 79 28 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c  y(&pStr1->token,
6040: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29   &pRight->token)
6050: 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e 74  ;.      pStr1->t
6060: 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72  oken.n = nPatter
6070: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  n;.    }.    pSt
6080: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
6090: 44 75 70 28 70 53 74 72 31 29 3b 0a 20 20 20 20  Dup(pStr1);.    
60a0: 69 66 28 20 70 53 74 72 32 20 29 7b 0a 20 20 20  if( pStr2 ){.   
60b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 32     assert( pStr2
60c0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20  ->token.dyn );. 
60d0: 20 20 20 20 20 2b 2b 2a 28 75 38 2a 29 26 70 53       ++*(u8*)&pS
60e0: 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61  tr2->token.z[nPa
60f0: 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a  ttern-1];.    }.
6100: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
6110: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 47  sqlite3Expr(TK_G
6120: 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  E, sqlite3ExprDu
6130: 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c  p(pLeft), pStr1,
6140: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
6150: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
6160: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
6170: 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
6180: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
6190: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
61a0: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
61b0: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
61c0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
61d0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4c  sqlite3Expr(TK_L
61e0: 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  T, sqlite3ExprDu
61f0: 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c  p(pLeft), pStr2,
6200: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
6210: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
6220: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
6230: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
6240: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
6250: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
6260: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
6270: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
6280: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
6290: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
62a0: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
62b0: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
62c0: 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
62d0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
62e0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
62f0: 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
6300: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
6310: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
6320: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
6330: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
6340: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
6350: 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
6360: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
6370: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
6380: 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
6390: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
63a0: 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74  * clause.  If it
63b0: 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73   can, it returns
63c0: 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e   1.  If pIdx can
63d0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a  not satisfy the.
63e0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
63f0: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
6400: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
6410: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
6420: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6430: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
6440: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
6450: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
6460: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
6470: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
6480: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
6490: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
64a0: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
64b0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
64c0: 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
64d0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
64e0: 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43  pTab..**.** nEqC
64f0: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
6500: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70   of columns of p
6510: 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65  Idx that are use
6520: 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a  d as equality.**
6530: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41   constraints.  A
6540: 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75  ny of these colu
6550: 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69  mns may be missi
6560: 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  ng from the ORDE
6570: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61  R BY.** clause a
6580: 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
6590: 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
65a0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
65b0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
65c0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
65d0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
65e0: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
65f0: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
6600: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
6610: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6620: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
6630: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
6640: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
6650: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
6660: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
6670: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
6680: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
6690: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
66a0: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
66b0: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
66c0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
66d0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
66e0: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
66f0: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
6700: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
6710: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6720: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6730: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
6740: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
6750: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
6760: 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
6770: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
6780: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6790: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
67a0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ed */.  int base
67b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67c0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
67d0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 45   for pTab */.  E
67e0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
67f0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
6800: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
6810: 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20  .  int nEqCol,  
6820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6830: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f  mber of index co
6840: 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f  lumns with == co
6850: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
6860: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
6870: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
6880: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
6890: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69  s DESC */.){.  i
68a0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
68c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
68d0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
68e0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
68f0: 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69       /* XOR of i
6900: 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42  ndex and ORDER B
6910: 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e  Y sort direction
6920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6950: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
6960: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  s */.  struct Ex
6970: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
6980: 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d  rm;    /* A term
6990: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
69a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c   clause */.  sql
69b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
69c0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
69d0: 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
69e0: 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65  .  nTerm = pOrde
69f0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  rBy->nExpr;.  as
6a00: 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
6a10: 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
6a20: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
6a30: 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
6a40: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
6a50: 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
6a60: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  /.  for(i=j=0, p
6a70: 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Term=pOrderBy->a
6a80: 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 70  ; j<nTerm && i<p
6a90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6aa0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
6ab0: 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  xpr;       /* Th
6ac0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
6ad0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65  the ORDER BY pTe
6ae0: 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  rm */.    CollSe
6af0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
6b00: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
6b10: 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20  quence of pExpr 
6b20: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53  */.    int termS
6b30: 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72  ortOrder; /* Sor
6b40: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  t order for this
6b50: 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45   term */..    pE
6b60: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
6b70: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
6b80: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
6b90: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
6ba0: 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20  e!=base ){.     
6bb0: 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20   /* Can not use 
6bc0: 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e  an index sort on
6bd0: 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69   anything that i
6be0: 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69  s not a column i
6bf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  n the.      ** l
6c00: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f  eft-most table o
6c10: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
6c20: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
6c30: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
6c40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6c50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
6c60: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  , pExpr);.    if
6c70: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
6c80: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
6c90: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
6ca0: 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e  >iColumn!=pIdx->
6cb0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 0a  aiColumn[i] || .
6cc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
6cd0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
6ce0: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
6cf0: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 2f  l[i]) ){.      /
6d00: 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20  * Term j of the 
6d10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6d20: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63  does not match c
6d30: 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69  olumn i of the i
6d40: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
6d50: 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i<nEqCol ){.  
6d60: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
6d70: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
6d80: 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
6d90: 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d  by == fails to m
6da0: 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20  atch an.        
6db0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
6dc0: 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a  , that is OK.  J
6dd0: 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20  ust ignore that 
6de0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
6df0: 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  dex.        */. 
6e00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6e10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6e20: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
6e30: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c  ndex column fail
6e40: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69  s to match and i
6e50: 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  s not constraine
6e60: 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20  d by ==.        
6e70: 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  ** then the inde
6e80: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
6e90: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f   the ORDER BY co
6ea0: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20  nstraint..      
6eb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
6ec0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
6ed0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
6ee0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
6ef0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
6f00: 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  rt( pTerm->sortO
6f10: 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d  rder==0 || pTerm
6f20: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
6f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
6f40: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
6f50: 5d 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 61 53  ]==0 || pIdx->aS
6f60: 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 31 20 29  ortOrder[i]==1 )
6f70: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
6f80: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
6f90: 74 4f 72 64 65 72 5b 69 5d 20 5e 20 70 54 65 72  tOrder[i] ^ pTer
6fa0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
6fb0: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
6fc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  {.      if( term
6fd0: 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
6fe0: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
6ff0: 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f  /* Indices can o
7000: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61  nly be used if a
7010: 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
7020: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20  s past the.     
7030: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63     ** equality c
7040: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
7050: 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f  ll either DESC o
7060: 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20  r ASC. */.      
7070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7080: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7090: 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
70a0: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a   termSortOrder;.
70b0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
70c0: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     pTerm++;.  }.
70d0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
70e0: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
70f0: 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74  sorting if all t
7100: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
7110: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
7120: 20 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20 20   are covered..  
7130: 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  */.  if( j>=nTer
7140: 6d 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  m ){.    *pbRev 
7150: 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a  = sortOrder!=0;.
7160: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7170: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7180: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62  ./*.** Check tab
7190: 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  le to see if the
71a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
71b0: 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e   in pOrderBy can
71c0: 20 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a   be satisfied.**
71d0: 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f   by sorting in o
71e0: 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20  rder of ROWID.  
71f0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
7200: 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76  o and set *pbRev
7210: 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66   to be.** true f
7220: 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57 49 44  or reverse ROWID
7230: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66   and false for f
7240: 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64  orward ROWID ord
7250: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
7260: 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  t sortableByRowi
7270: 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  d(.  int base,  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7290: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
72a0: 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f  r table to be so
72b0: 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rted */.  ExprLi
72c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
72d0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
72e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
72f0: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
7300: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
7310: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
7320: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78   DESC */.){.  Ex
7330: 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  pr *p;..  assert
7340: 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
7350: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
7360: 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  rBy->nExpr>0 );.
7370: 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
7380: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
7390: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
73a0: 72 3d 3d 31 20 26 26 20 70 2d 3e 6f 70 3d 3d 54  r==1 && p->op==T
73b0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
73c0: 54 61 62 6c 65 3d 3d 62 61 73 65 0a 20 20 20 20  Table==base.    
73d0: 20 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c        && p->iCol
73e0: 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 2a  umn==-1 ){.    *
73f0: 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79  pbRev = pOrderBy
7400: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
7410: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
7420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7430: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
7440: 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74   a crude estimat
7450: 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74  e of the logarit
7460: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
7470: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
7480: 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62  sults need not b
7490: 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69  e exact.  This i
74a0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
74b0: 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68  estimating.** th
74c0: 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20  e total cost of 
74d0: 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61  performing opera
74e0: 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67  tings with O(log
74f0: 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a  N) or O(NlogN).*
7500: 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42  * complexity.  B
7510: 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74  ecause N is just
7520: 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20   a guess, it is 
7530: 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79  no great tragedy
7540: 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61   if.** logN is a
7550: 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a   little off..*/.
7560: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73  static double es
7570: 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a  tLog(double N){.
7580: 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20    double logN = 
7590: 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20  1;.  double x = 
75a0: 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78  10;.  while( N>x
75b0: 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20   ){.    logN += 
75c0: 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a  1;.    x *= 10;.
75d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67    }.  return log
75e0: 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  N;.}../*.** Find
75f0: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
7600: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
7610: 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
7620: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
7630: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e  ter.** to the in
7640: 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20  dex, flags that 
7650: 64 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65  describe how the
7660: 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
7670: 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75   used, the.** nu
7680: 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
7690: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e   constraints, an
76a0: 64 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72  d the "cost" for
76b0: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a   this index..**.
76c0: 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f  ** The lowest co
76d0: 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20  st index wins.  
76e0: 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65  The cost is an e
76f0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61  stimate of the a
7700: 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20  mount of.** CPU 
7710: 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65  and disk I/O nee
7720: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
7730: 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74   request using t
7740: 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65  he selected inde
7750: 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  x..** Factors th
7760: 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
7770: 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
7780: 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
7790: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
77a0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
77b0: 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
77c0: 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
77d0: 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
77e0: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
77f0: 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
7800: 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
7810: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
7820: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
7830: 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
7840: 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
7850: 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
7860: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
7870: 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
7880: 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65   double bestInde
7890: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
78a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
78b0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
78c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
78d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
78e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
78f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
7900: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7910: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
7920: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
7930: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
7940: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
7950: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
7960: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
7970: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
7980: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
7990: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
79a0: 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
79b0: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
79c0: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a  se */.  Index **
79d0: 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  ppIndex,        
79e0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49      /* Make *ppI
79f0: 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  ndex point to th
7a00: 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a  e best index */.
7a10: 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20    int *pFlags,  
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a30: 20 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72   Put flags descr
7a40: 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63  ibing this choic
7a50: 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a  e in *pFlags */.
7a60: 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20    int *pnEq     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a80: 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Put the number 
7a90: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
7aa0: 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a  traints here */.
7ab0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
7ac0: 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a  pTerm;.  Index *
7ad0: 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20  bestIdx = 0;    
7ae0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
7af0: 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77  at gives the low
7b00: 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f  est cost */.  do
7b10: 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b  uble lowestCost;
7b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7b30: 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62   cost of using b
7b40: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
7b50: 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20  bestFlags = 0;  
7b60: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7b70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7b80: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
7b90: 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20  t bestNEq = 0;  
7ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
7bb0: 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20  t value for nEq 
7bc0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
7bd0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20  pSrc->iCursor;  
7be0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
7bf0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
7c00: 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20  e accessed */.  
7c10: 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7c30: 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
7c40: 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69  valuating */.  i
7c50: 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  nt rev;         
7c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7c70: 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ue to scan in re
7c80: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
7c90: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cb0: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
7cc0: 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a   with pProbe */.
7cd0: 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
7d00: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
7d10: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  */.  double cost
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d30: 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
7d40: 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54  g pProbe */..  T
7d50: 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65 78  RACE(("bestIndex
7d60: 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64  : tbl=%s notRead
7d70: 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  y=%x\n", pSrc->p
7d80: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52  Tab->zName, notR
7d90: 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74  eady));.  lowest
7da0: 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
7db0: 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  G_DBL;..  /* Che
7dc0: 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45  ck for a rowid=E
7dd0: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
7de0: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
7df0: 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d  s.  */.  pTerm =
7e00: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
7e10: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
7e20: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
7e30: 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
7e40: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
7e50: 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78  pr;.    *ppIndex
7e60: 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c   = 0;.    bestFl
7e70: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
7e80: 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54  D_EQ;.    if( pT
7e90: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20  erm->operator & 
7ea0: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  WO_EQ ){.      /
7eb0: 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77  * Rowid== is alw
7ec0: 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63  ays the best pic
7ed0: 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74  k.  Look no furt
7ee0: 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e  her.  Because on
7ef0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  ly.      ** a si
7f00: 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65  ngle row is gene
7f10: 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73  rated, output is
7f20: 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65   always in sorte
7f30: 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  d order */.     
7f40: 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45   *pFlags = WHERE
7f50: 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52  _ROWID_EQ | WHER
7f60: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
7f70: 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  *pnEq = 1;.     
7f80: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73   TRACE(("... bes
7f90: 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
7fa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
7fb0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
7fc0: 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   (pExpr = pTerm-
7fd0: 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d  >pExpr)->pList!=
7fe0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  0 ){.      /* Ro
7ff0: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
8000: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
8010: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
8020: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
8030: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
8040: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
8050: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
8060: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
8070: 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73  lowestCost *= es
8080: 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29  tLog(lowestCost)
8090: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
80a0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
80b0: 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73  SELECT): cost is
80c0: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
80d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
80e0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rows.      ** in
80f0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
8100: 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
8110: 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
8120: 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
8130: 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
8140: 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
8150: 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
8160: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
8170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
8180: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e  E(("... rowid IN
8190: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
81a0: 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20 20  lowestCost));.  
81b0: 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  }..  /* Estimate
81c0: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74   the cost of a t
81d0: 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77  able scan.  If w
81e0: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  e do not know ho
81f0: 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72  w many.  ** entr
8200: 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 74  ies are in the t
8210: 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c  able, use 1 mill
8220: 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a  ion as a guess..
8230: 20 20 2a 2f 0a 20 20 70 50 72 6f 62 65 20 3d 20    */.  pProbe = 
8240: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
8250: 65 78 3b 0a 20 20 63 6f 73 74 20 3d 20 70 50 72  ex;.  cost = pPr
8260: 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69  obe ? pProbe->ai
8270: 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30  RowEst[0] : 1000
8280: 30 30 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2e  000;.  TRACE((".
8290: 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61  .. table scan ba
82a0: 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  se cost: %.9g\n"
82b0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67  , cost));.  flag
82c0: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
82d0: 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65  RANGE;..  /* Che
82e0: 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ck for constrain
82f0: 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66  ts on a range of
8300: 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62   rowids in a tab
8310: 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20  le scan..  */.  
8320: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
8330: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
8340: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
8350: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8360: 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  E, 0);.  if( pTe
8370: 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69  rm ){.    if( fi
8380: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8390: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
83a0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20  WO_LT|WO_LE, 0) 
83b0: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
83c0: 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
83d0: 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  T;.      cost /=
83e0: 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68   3;  /* Guess th
83f0: 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c  at rowid<EXPR el
8400: 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
8410: 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20  rds or rows */. 
8420: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e     }.    if( fin
8430: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
8440: 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
8450: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29  O_GT|WO_GE, 0) )
8460: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
8470: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
8480: 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20  ;.      cost /= 
8490: 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
84a0: 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69  t rowid>EXPR eli
84b0: 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
84c0: 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  ds of rows */.  
84d0: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
84e0: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
84f0: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
8500: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
8510: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
8520: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ags = 0;.  }..  
8530: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
8540: 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61  scan does not sa
8550: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
8560: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
8570: 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73  ase.  ** the cos
8580: 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
8590: 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
85a0: 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
85b0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
85c0: 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c  .    if( sortabl
85d0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
85e0: 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29 20 29  OrderBy, &rev) )
85f0: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
8600: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57   WHERE_ORDERBY|W
8610: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
8620: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20  ;.      if( rev 
8630: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
8640: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
8650: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
8660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74  else{.      cost
8670: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
8680: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52 41  cost);.      TRA
8690: 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
86a0: 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
86b0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
86c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
86d0: 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43  if( cost<lowestC
86e0: 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73  ost ){.    lowes
86f0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
8700: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c    bestFlags = fl
8710: 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ags;.  }..  /* L
8720: 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
8730: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  x..  */.  for(; 
8740: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
8750: 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
8760: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8790: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  */.    double in
87a0: 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a  Multiplier = 1;.
87b0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e  .    TRACE(("...
87c0: 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70   index %s:\n", p
87d0: 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Probe->zName));.
87e0: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
87f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
8800: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
8810: 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66   that are satisf
8820: 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d  ied.    ** by x=
8830: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73  EXPR constraints
8840: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63   or x IN (...) c
8850: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
8860: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  */.    flags = 0
8870: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8880: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
8890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
88a0: 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
88b0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
88c0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
88d0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
88e0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
88f0: 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_IN, pProbe);.
8900: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
8910: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
8920: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8930: 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
8940: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65    if( pTerm->ope
8950: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
8960: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
8970: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
8980: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  xpr;.        fla
8990: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
89a0: 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
89b0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
89c0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
89d0: 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a    inMultiplier *
89e0: 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d  = 100;.        }
89f0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
8a00: 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  pList!=0 ){.    
8a10: 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69        inMultipli
8a20: 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69  er *= pExpr->pLi
8a30: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20  st->nExpr + 1;. 
8a40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8a50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20  .    }.    cost 
8a60: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  = pProbe->aiRowE
8a70: 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70  st[i] * inMultip
8a80: 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e  lier * estLog(in
8a90: 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20  Multiplier);.   
8aa0: 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66   nEq = i;.    if
8ab0: 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  ( pProbe->onErro
8ac0: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66  r!=OE_None && (f
8ad0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
8ae0: 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20  UMN_IN)==0.     
8af0: 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f      && nEq==pPro
8b00: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
8b10: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8b20: 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
8b30: 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  }.    TRACE(("..
8b40: 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75  .... nEq=%d inMu
8b50: 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39  lt=%.9g cost=%.9
8b60: 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c  g\n", nEq, inMul
8b70: 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29 29 3b  tiplier, cost));
8b80: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  ..    /* Look fo
8b90: 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  r range constrai
8ba0: 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nts.    */.    i
8bb0: 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  f( nEq<pProbe->n
8bc0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
8bd0: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
8be0: 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
8bf0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
8c00: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
8c10: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
8c20: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
8c30: 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_GE, pProbe);.
8c40: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 20        if( pTerm 
8c50: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
8c60: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
8c70: 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
8c80: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
8c90: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
8ca0: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
8cb0: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
8cc0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
8cd0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
8cf0: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
8d00: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
8d10: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
8d20: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
8d30: 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
8d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
8d50: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
8d60: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
8d70: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
8d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8d90: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72  TRACE(("...... r
8da0: 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73  ange reduces cos
8db0: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
8dc0: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
8dd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
8de0: 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  the additional c
8df0: 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
8e00: 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63 74  f that is a fact
8e10: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
8e20: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
8e30: 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20       if( (flags 
8e40: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
8e50: 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  N)==0 &&.       
8e60: 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64      isSortingInd
8e70: 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f 62 65  ex(pParse,pProbe
8e80: 2c 70 53 72 63 2d 3e 70 54 61 62 2c 69 43 75 72  ,pSrc->pTab,iCur
8e90: 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72  ,pOrderBy,nEq,&r
8ea0: 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ev) ){.        i
8eb0: 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20  f( flags==0 ){. 
8ec0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
8ed0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
8ee0: 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NGE;.        }. 
8ef0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
8f00: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
8f10: 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
8f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
8f30: 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
8f40: 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SE;.        }.  
8f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8f60: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
8f70: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
8f80: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e        TRACE(("..
8f90: 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63  .... orderby inc
8fa0: 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25  reases cost to %
8fb0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
8fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8fd0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
8fe0: 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74  ee if we can get
8ff0: 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67   away with using
9000: 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20   just the index 
9010: 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65  without.    ** e
9020: 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ver reading the 
9030: 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20  table.  If that 
9040: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
9050: 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20  n halve the.    
9060: 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20  ** cost of this 
9070: 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
9080: 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 70    if( flags && p
9090: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28  Src->colUsed < (
90a0: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
90b0: 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20  MS-1)) ){.      
90c0: 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
90d0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
90e0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
90f0: 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d  r(j=0; j<pProbe-
9100: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
9110: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
9120: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
9130: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
9140: 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
9150: 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
9160: 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
9170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9180: 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
9190: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
91a0: 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
91b0: 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  LY;.        cost
91c0: 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 54   /= 2;.        T
91d0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64  RACE(("...... id
91e0: 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63  x-only reduces c
91f0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
9200: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
9210: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
9220: 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20   this index has 
9230: 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77  achieved the low
9240: 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c  est cost so far,
9250: 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20   then use it..  
9260: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73    */.    if( cos
9270: 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29  t < lowestCost )
9280: 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20  {.      bestIdx 
9290: 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20  = pProbe;.      
92a0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
92b0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
92c0: 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20   flags!=0 );.   
92d0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
92e0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74  lags;.      best
92f0: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d  NEq = nEq;.    }
9300: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
9310: 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  t the best resul
9320: 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65  t.  */.  *ppInde
9330: 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54  x = bestIdx;.  T
9340: 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65  RACE(("best inde
9350: 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e  x is %s, cost=%.
9360: 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45  9g, flags=%x, nE
9370: 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  q=%d\n",.       
9380: 20 62 65 73 74 49 64 78 20 3f 20 62 65 73 74 49   bestIdx ? bestI
9390: 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f  dx->zName : "(no
93a0: 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74  ne)", lowestCost
93b0: 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73  , bestFlags, bes
93c0: 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67  tNEq));.  *pFlag
93d0: 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20  s = bestFlags;. 
93e0: 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71   *pnEq = bestNEq
93f0: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73  ;.  return lowes
9400: 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tCost;.}.../*.**
9410: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
9420: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
9430: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
9440: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
9450: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
9460: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
9470: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
9480: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
9490: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
94a0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
94b0: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
94c0: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
94d0: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
94e0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
94f0: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
9500: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
9510: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
9520: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
9530: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
9540: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
9550: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
9560: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
9570: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
9580: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
9590: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
95a0: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
95b0: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
95c0: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
95d0: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
95e0: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
95f0: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
9600: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
9610: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
9620: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
9630: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
9640: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
9650: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
9660: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
9670: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
9680: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
9690: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
96a0: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
96b0: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
96c0: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
96d0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
96e0: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
96f0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
9700: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
9710: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
9720: 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
9730: 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
9740: 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
9750: 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
9760: 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
9770: 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
9780: 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
9790: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
97a0: 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
97b0: 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
97c0: 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
97d0: 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
97e0: 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
97f0: 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
9800: 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
9810: 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
9820: 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
9830: 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
9840: 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
9850: 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
9860: 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
9870: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
9880: 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
9890: 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
98a0: 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
98b0: 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
98c0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
98d0: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
98e0: 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
98f0: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
9900: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
9910: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
9920: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
9930: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  ){.    pTerm->fl
9940: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
9950: 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
9960: 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
9970: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
9980: 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
9990: 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
99a0: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
99b0: 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
99c0: 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
99d0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
99e0: 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
99f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9a00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9a10: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9a20: 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66  builds a probe f
9a30: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44 65  or an index.  De
9a40: 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
9a50: 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f 70  *  Check the top
9a60: 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73   nColumn entries
9a70: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
9a80: 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20  If any.**       
9a90: 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  of those entries
9aa0: 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20   are NULL, jump 
9ab0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 62  immediately to b
9ac0: 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  rk,.**       whi
9ad0: 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20 65  ch is the loop e
9ae0: 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e  xit, since no in
9af0: 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d  dex entry will m
9b00: 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69 66  atch.**       if
9b10: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
9b20: 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 20 50 6f   key is NULL. Po
9b30: 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72  p (nColumn+nExtr
9b40: 61 29 20 0a 2a 2a 20 20 20 20 20 20 20 65 6c 65  a) .**       ele
9b50: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
9b60: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  tack..**.**    *
9b70: 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72    Construct a pr
9b80: 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  obe entry from t
9b90: 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65  he top nColumn e
9ba0: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20  ntries in.**    
9bb0: 20 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74     the stack wit
9bc0: 68 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70  h affinities app
9bd0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
9be0: 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20 20 20 20  ex pIdx. .**    
9bf0: 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d 6e 20     Only nColumn 
9c00: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 70 6f 70  elements are pop
9c10: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
9c20: 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a  ck in this case.
9c30: 2a 2a 20 20 20 20 20 20 20 28 62 79 20 4f 50 5f  **       (by OP_
9c40: 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a 2a 2a 0a  MakeRecord)..**.
9c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9c60: 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 0a  uildIndexProbe(.
9c70: 20 20 56 64 62 65 20 2a 76 2c 20 0a 20 20 69 6e    Vdbe *v, .  in
9c80: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20 69 6e  t nColumn, .  in
9c90: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
9ca0: 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65 78 20 2a   brk, .  Index *
9cb0: 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pIdx.){.  sqlite
9cc0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9cd0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75  _NotNull, -nColu
9ce0: 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  mn, sqlite3VdbeC
9cf0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
9d00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
9d20: 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 2c 20  nColumn+nExtra, 
9d30: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9d40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
9d50: 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71  o, 0, brk);.  sq
9d60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9d70: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9d80: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
9d90: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
9da0: 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
9db0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
9dc0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
9dd0: 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
9de0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
9df0: 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
9e00: 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
9e10: 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
9e20: 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
9e30: 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
9e40: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
9e50: 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
9e60: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
9e70: 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
9e80: 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  nt is left on th
9e90: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
9ea0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ck..**.** For a 
9eb0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
9ec0: 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
9ed0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9ee0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
9ef0: 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
9f00: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
9f10: 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
9f20: 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
9f30: 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
9f40: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
9f50: 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
9f60: 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
9f70: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
9f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9f90: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
9fa0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
9fb0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
9fc0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
9fd0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
9fe0: 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
9ff0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
a000: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
a010: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72  oded */.  int br
a020: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
a030: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 61 62   Jump here to ab
a040: 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70 20 2a  andon the loop *
a050: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
a060: 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20  pLevel  /* When 
a070: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
a080: 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
a090: 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b  working on */.){
a0a0: 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
a0b0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 69 66  erm->pExpr;.  if
a0c0: 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20  ( pX->op!=TK_IN 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a0e0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  X->op==TK_EQ );.
a0f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a100: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
a110: 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64 65 66  pRight);.#ifndef
a120: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a130: 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
a140: 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
a150: 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20 20 20 56   int *aIn;.    V
a160: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a170: 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20 73 71 6c  >pVdbe;..    sql
a180: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
a190: 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20  t(pParse, pX);. 
a1a0: 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
a1b0: 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
a1c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a1d0: 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 62  _Rewind, iTab, b
a1e0: 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  rk);.    VdbeCom
a1f0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 2e 2a 73  ment((v, "# %.*s
a200: 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70  ", pX->span.n, p
a210: 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20  X->span.z));.   
a220: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a   pLevel->nIn++;.
a230: 20 20 20 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f      sqliteReallo
a240: 63 4f 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29  cOrFree((void**)
a250: 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  &pLevel->aInLoop
a260: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
a290: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a  ->aInLoop[0])*3*
a2a0: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20  pLevel->nIn);.  
a2b0: 20 20 61 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    aIn = pLevel->
a2c0: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
a2d0: 20 61 49 6e 20 29 7b 0a 20 20 20 20 20 20 61 49   aIn ){.      aI
a2e0: 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  n += pLevel->nIn
a2f0: 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20 20 61 49  *3 - 3;.      aI
a300: 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  n[0] = OP_Next;.
a310: 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d 20 69        aIn[1] = i
a320: 54 61 62 3b 0a 20 20 20 20 20 20 61 49 6e 5b 32  Tab;.      aIn[2
a330: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
a340: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
a350: 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  n, iTab, 0);.   
a360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
a370: 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20  evel->nIn = 0;. 
a380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a390: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
a3a0: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a  evel, pTerm);.}.
a3b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a3c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
a3d0: 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
a3e0: 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
a3f0: 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
a400: 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 66  x.  The values f
a410: 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  or all constrain
a420: 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74  ts are left on t
a430: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
a440: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
a450: 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
a460: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
a470: 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
a480: 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
a490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
a4a0: 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
a4b0: 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
a4c0: 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
a4d0: 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
a4e0: 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
a4f0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
a500: 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
a510: 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
a520: 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
a530: 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
a540: 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
a550: 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
a560: 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
a570: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a580: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
a590: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
a5a0: 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
a5b0: 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
a5c0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
a5d0: 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  d b will be left
a5e0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
a5f0: 20 2d 20 61 20 69 73 20 74 68 65 20 64 65 65 70   - a is the deep
a600: 65 73 74 20 61 6e 64 20 62 20 74 68 65 20 73 68  est and b the sh
a610: 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  allowest..**.** 
a620: 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
a630: 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
a640: 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
a650: 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
a660: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
a670: 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
a680: 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
a690: 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
a6a0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
a6b0: 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
a6c0: 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
a6d0: 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
a6e0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
a6f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a700: 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
a710: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
a720: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75  mory cell and pu
a730: 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  ts.** the addres
a740: 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  s of that memory
a750: 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d   cell in pLevel-
a760: 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65  >iMem.  The code
a770: 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
a780: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a790: 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   use pLevel->iMe
a7a0: 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  m to store the t
a7b0: 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
a7c0: 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
a7d0: 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
a7e0: 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
a7f0: 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
a800: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
a810: 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
a820: 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
a830: 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
a840: 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a  rnal.** use..*/.
a850: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
a860: 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
a870: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a880: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
a890: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a8a0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
a8b0: 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
a8c0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
a8d0: 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
a8e0: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
a8f0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
a900: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
a910: 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
a920: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
a930: 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
a940: 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
a950: 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
a960: 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20 20 20  */.  int brk    
a970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a980: 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74  mp here to end t
a990: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  he loop */.){.  
a9a0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
a9b0: 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a  ->nEq;        /*
a9c0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
a9d0: 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
a9e0: 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
a9f0: 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20   int termsInMem 
aa00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
aa10: 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65  * If true, store
aa20: 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20   value in mem[] 
aa30: 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20  cells */.  Vdbe 
aa40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
aa50: 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
aa60: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
aa70: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
aa80: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
aa90: 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
aaa0: 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  dx;   /* The ind
aab0: 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
aac0: 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
aad0: 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76   int iCur = pLev
aae0: 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f  el->iTabCur;   /
aaf0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
ab00: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
ab10: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab30: 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
ab40: 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  int term */.  in
ab50: 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ab70: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
ab80: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
ab90: 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
aba0: 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
abb0: 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
abc0: 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61   them..  ** We a
abd0: 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65  lways need at le
abe0: 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20  ast one used to 
abf0: 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74  store the loop t
ac00: 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76  erminator.  ** v
ac10: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65 20  alue.  If there 
ac20: 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  are IN operators
ac30: 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20   we'll need one 
ac40: 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20  for each == or. 
ac50: 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   ** IN constrain
ac60: 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c  t..  */.  pLevel
ac70: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
ac80: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70  >nMem++;.  if( p
ac90: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
aca0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
acb0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  {.    pParse->nM
acc0: 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  em += pLevel->nE
acd0: 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d 65  q;.    termsInMe
ace0: 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m = 1;.  }..  /*
acf0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
ad00: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
ad10: 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  ts.  */.  for(j=
ad20: 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
ad30: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  mn; j++){.    in
ad40: 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
ad50: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
ad60: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
ad70: 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
ad80: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
ad90: 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66  N, pIdx);.    if
ada0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
adb0: 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
adc0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
add0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
ade0: 3b 0a 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69  ;.    codeEquali
adf0: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
ae00: 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65  Term, brk, pLeve
ae10: 6c 29 3b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  l);.    if( term
ae20: 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20  sInMem ){.      
ae30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae40: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
ae50: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b   pLevel->iMem+j+
ae60: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 1);.    }.  }
ae70: 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 45  .  assert( j==nE
ae80: 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  q );..  /* Make 
ae90: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  sure all the con
aea0: 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 61  straint values a
aeb0: 72 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  re on the top of
aec0: 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a   the stack.  */.
aed0: 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d    if( termsInMem
aee0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
aef0: 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
af00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
af20: 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
af30: 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  +j+1, 0);.    }.
af40: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
af50: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
af60: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
af70: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
af80: 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
af90: 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
afa0: 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
afb0: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
afc0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
afd0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
afe0: 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
aff0: 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
b000: 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
b010: 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
b020: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
b030: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
b040: 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
b050: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
b060: 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
b070: 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
b080: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
b090: 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
b0a0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
b0b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
b0c0: 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
b0d0: 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
b0e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
b0f0: 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */..../*.** Gen
b100: 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
b110: 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
b120: 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
b130: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
b140: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
b150: 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
b160: 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
b170: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
b180: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
b190: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
b1a0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
b1b0: 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
b1c0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
b1d0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
b1e0: 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
b1f0: 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
b200: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
b210: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
b220: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
b230: 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
b240: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
b250: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
b260: 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
b270: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
b280: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
b290: 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
b2a0: 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
b2b0: 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
b2c0: 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
b2d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
b2e0: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
b2f0: 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
b300: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
b310: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
b320: 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
b330: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
b340: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
b350: 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
b360: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
b370: 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
b380: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
b390: 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
b3a0: 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
b3b0: 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
b3c0: 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
b3d0: 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
b3e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b3f0: 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
b400: 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
b410: 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
b420: 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
b430: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
b440: 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
b450: 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
b460: 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
b470: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
b480: 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
b490: 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
b4a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
b4d0: 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
b4e0: 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
b500: 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
b510: 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
b520: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
b530: 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
b540: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
b550: 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
b560: 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
b570: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
b580: 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
b590: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
b5a0: 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
b5b0: 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
b5c0: 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
b5d0: 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
b5e0: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
b5f0: 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
b600: 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
b610: 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
b620: 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
b630: 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
b640: 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
b650: 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
b660: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
b670: 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
b680: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
b690: 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
b6a0: 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
b6b0: 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
b6c0: 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
b6d0: 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
b6e0: 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
b6f0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
b700: 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
b710: 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
b720: 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
b730: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
b740: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
b750: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
b760: 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
b770: 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
b780: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
b790: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
b7a0: 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
b7b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
b7c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
b7d0: 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
b7e0: 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
b7f0: 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
b800: 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
b810: 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
b820: 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
b830: 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
b840: 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
b850: 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
b860: 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
b870: 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
b880: 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
b890: 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
b8a0: 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
b8b0: 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
b8c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b8d0: 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
b8e0: 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
b8f0: 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
b900: 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
b910: 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
b920: 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
b930: 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
b940: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
b950: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
b960: 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
b970: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
b980: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
b990: 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
b9a0: 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
b9b0: 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
b9c0: 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
b9d0: 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
b9e0: 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
b9f0: 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
ba00: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
ba10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
ba20: 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
ba30: 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
ba40: 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
ba50: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
ba60: 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
ba70: 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
ba80: 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
ba90: 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
baa0: 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
bab0: 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
bac0: 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
bad0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
bae0: 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
baf0: 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
bb00: 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
bb10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
bb20: 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
bb30: 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
bb40: 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
bb50: 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
bb60: 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
bb70: 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
bb80: 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
bb90: 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
bba0: 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
bbb0: 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
bbc0: 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
bbd0: 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
bbe0: 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
bbf0: 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
bc00: 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
bc10: 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
bc20: 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
bc30: 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
bc40: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
bc50: 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
bc60: 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
bc70: 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
bc80: 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
bc90: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
bca0: 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
bcb0: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
bcc0: 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
bcd0: 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
bce0: 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
bcf0: 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
bd00: 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
bd10: 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
bd20: 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
bd30: 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
bd40: 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
bd50: 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
bd60: 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64  ING.**.** *ppOrd
bd70: 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
bd80: 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
bd90: 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
bda0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
bdb0: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
bdc0: 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
bdd0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
bde0: 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
bdf0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
be00: 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
be10: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
be20: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f  tement, then ppO
be30: 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
be40: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65  **.** If an inde
be50: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f  x can be used so
be60: 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61   that the natura
be70: 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f  l output order o
be80: 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73  f the table.** s
be90: 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66  can is correct f
bea0: 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
beb0: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61  clause, then tha
bec0: 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  t index is used 
bed0: 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  and.** *ppOrderB
bee0: 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  y is set to NULL
bef0: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
bf00: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
bf10: 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75  prevents an.** u
bf20: 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20  nnecessary sort 
bf30: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
bf40: 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70  t if an index ap
bf50: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
bf60: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
bf70: 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69  ause already exi
bf80: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sts..**.** If th
bf90: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c  e where clause l
bfa0: 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61  oops cannot be a
bfb0: 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69  rranged to provi
bfc0: 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  de the correct.*
bfd0: 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20  * output order, 
bfe0: 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65  then the *ppOrde
bff0: 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64  rBy is unchanged
c000: 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
c010: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
c020: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
c030: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
c040: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
c050: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
c060: 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41  TabList,    /* A
c070: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
c080: 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
c090: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
c0a0: 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
c0b0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
c0c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c0d0: 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41  *ppOrderBy  /* A
c0e0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
c0f0: 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  e, or NULL */.){
c100: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c120: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c130: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
c140: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
c150: 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
c160: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c170: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
c180: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
c190: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
c1a0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
c1b0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
c1c0: 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74  .  int brk, cont
c1d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
c1e0: 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64 20   Addresses used 
c1f0: 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65  during code gene
c200: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ration */.  Bitm
c210: 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
c220: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c230: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
c240: 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
c250: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
c260: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  erm;          /*
c270: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69   A single term i
c280: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
c290: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  se */.  ExprMask
c2a0: 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20  Set maskSet;    
c2b0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c2c0: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
c2d0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
c2e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
c2f0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
c300: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
c310: 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f  o these terms */
c320: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
c330: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
c340: 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65  ;  /* A single e
c350: 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69  ntry from pTabLi
c360: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  st */.  WhereLev
c370: 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
c380: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
c390: 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65  gle level in the
c3a0: 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a   pWInfo list */.
c3b0: 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20    int iFrom;    
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
c3e0: 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  d FROM clause el
c3f0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c400: 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ndFlags;        
c410: 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20        /* AND-ed 
c420: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61  combination of a
c430: 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20  ll wc.a[].flags 
c440: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  */..  /* The num
c450: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
c460: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
c470: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
c480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
c490: 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
c4a0: 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask .  */.  if( 
c4b0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
c4c0: 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
c4d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c4e0: 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
c4f0: 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
c500: 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
c510: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  n 0;.  }..  /* S
c520: 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
c530: 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
c540: 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
c550: 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
c560: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
c570: 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
c580: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
c590: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
c5a0: 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a  kSet(&maskSet);.
c5b0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
c5c0: 74 28 26 77 63 2c 20 70 50 61 72 73 65 29 3b 0a  t(&wc, pParse);.
c5d0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77 63    whereSplit(&wc
c5e0: 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
c5f0: 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c  );.    .  /* All
c600: 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
c610: 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
c620: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
c630: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
c640: 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
c650: 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  lue..  */.  pWIn
c660: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
c670: 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49  c( sizeof(WhereI
c680: 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d  nfo) + pTabList-
c690: 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65  >nSrc*sizeof(Whe
c6a0: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28  reLevel));.  if(
c6b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
c6c0: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f  iled() ){.    go
c6d0: 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
c6e0: 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  em;.  }.  pWInfo
c6f0: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
c700: 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
c710: 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
c720: 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
c730: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
c740: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
c750: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
c760: 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
c770: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
c780: 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
c790: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
c7a0: 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
c7b0: 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
c7c0: 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
c7d0: 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
c7e0: 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69  Where && (pTabLi
c7f0: 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73  st->nSrc==0 || s
c800: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
c810: 74 61 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b  tant(pWhere)) ){
c820: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
c830: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
c840: 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
c850: 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20  iBreak, 1);.    
c860: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
c870: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
c880: 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
c890: 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
c8a0: 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
c8b0: 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
c8c0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
c8d0: 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
c8e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
c8f0: 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
c900: 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
c910: 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
c920: 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
c930: 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
c940: 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
c950: 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
c960: 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
c970: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
c980: 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
c990: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
c9a0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
c9b0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
c9c0: 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53  reateMask(&maskS
c9d0: 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
c9e0: 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
c9f0: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
ca00: 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73  l(pTabList, &mas
ca10: 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20 20 69 66  kSet, &wc);.  if
ca20: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
ca30: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
ca40: 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
ca50: 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  Mem;.  }..  /* C
ca60: 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
ca70: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
ca80: 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
ca90: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
caa0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
cab0: 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
cac0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
cad0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
cae0: 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
caf0: 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
cb00: 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
cb10: 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
cb20: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
cb30: 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45  [].flags     WHE
cb40: 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
cb50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
cb60: 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
cb70: 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
cb80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
cb90: 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
cba0: 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
cbb0: 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
cbc0: 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65  When term of the
cbd0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
cbe0: 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a  being coded.  **
cbf0: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
cc00: 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42  TabCur   The VDB
cc10: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
cc20: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a   database table.
cc30: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
cc40: 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65  [].iIdxCur   The
cc50: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
cc60: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a   the index.  **.
cc70: 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
cc80: 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20  lso figures out 
cc90: 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65  the nesting orde
cca0: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
ccb0: 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61  he FROM.  ** cla
ccc0: 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  use..  */.  notR
ccd0: 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
cce0: 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  )0;.  pTabItem =
ccf0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20   pTabList->a;.  
cd00: 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
cd10: 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d  >a;.  andFlags =
cd20: 20 7e 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2a   ~0;.  TRACE(("*
cd30: 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
cd40: 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
cd50: 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
cd60: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
cd70: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
cd80: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
cd90: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
cda0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
cdb0: 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
cdc0: 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
cdd0: 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
cde0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
cdf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
ce00: 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77 69  s asssociated wi
ce10: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  th pIdx */.    i
ce20: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
ce30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ce40: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
ce50: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
ce60: 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72 20  /* The cost for 
ce90: 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pIdx */.    int 
cea0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
cec0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d  ooping over FROM
ced0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49   tables */.    I
cee0: 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
cef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
cf00: 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65 65  e best index see
cf10: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
cf20: 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20  int bestFlags = 
cf30: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
cf40: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
cf50: 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
cf60: 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20    int bestNEq = 
cf70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
cf80: 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64 20   nEq associated 
cf90: 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
cfa0: 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43    double lowestC
cfb0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ost;          /*
cfc0: 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42 65   Cost of the pBe
cfd0: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  st */.    int be
cfe0: 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  stJ = 0;        
cff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
d000: 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
d010: 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
d020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
d030: 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
d040: 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 0a 20  j or bestJ */.. 
d050: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
d060: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
d070: 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
d080: 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
d090: 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61  ist->a[j]; j<pTa
d0a0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b  bList->nSrc; j++
d0b0: 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20  , pTabItem++){. 
d0c0: 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
d0d0: 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (&maskSet, pTabI
d0e0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
d0f0: 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
d100: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
d110: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
d120: 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
d130: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
d150: 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70  st = bestIndex(p
d160: 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62  Parse, &wc, pTab
d170: 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20         (i==0 && 
d1a0: 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70  ppOrderBy) ? *pp
d1b0: 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20  OrderBy : 0,.   
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67      &pIdx, &flag
d1e0: 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20  s, &nEq);.      
d1f0: 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43  if( cost<lowestC
d200: 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  ost ){.        l
d210: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
d220: 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20  ;.        pBest 
d230: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
d240: 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
d250: 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e  s;.        bestN
d260: 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
d270: 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
d280: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
d290: 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pTabItem->jointy
d2a0: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
d2b0: 5f 43 52 4f 53 53 29 29 21 3d 30 0a 20 20 20 20  _CROSS))!=0.    
d2c0: 20 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20       || (j>0 && 
d2d0: 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f  (pTabItem[-1].jo
d2e0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
d2f0: 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
d300: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
d310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d320: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
d330: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
d340: 20 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64   choose table %d
d350: 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c   for loop %d\n",
d360: 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20   bestJ,.        
d370: 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
d380: 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28  ->a));.    if( (
d390: 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52  bestFlags & WHER
d3a0: 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
d3b0: 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42  .      *ppOrderB
d3c0: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
d3d0: 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
d3e0: 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
d3f0: 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74  el->flags = best
d400: 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
d410: 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b  l->pIdx = pBest;
d420: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  .    pLevel->nEq
d430: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20   = bestNEq;.    
d440: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
d450: 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
d460: 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  >nIn = 0;.    if
d470: 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
d480: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
d490: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d4a0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
d4b0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
d4c0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
d4d0: 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
d4e0: 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
d4f0: 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
d500: 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
d510: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
d520: 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20  m = bestJ;.  }. 
d530: 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74   TRACE(("*** Opt
d540: 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
d550: 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ***\n"));..  /* 
d560: 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
d570: 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
d580: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
d590: 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
d5a0: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
d5b0: 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
d5c0: 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
d5d0: 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
d5e0: 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
d5f0: 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
d600: 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
d610: 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
d620: 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
d630: 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
d640: 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
d650: 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
d660: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
d670: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
d680: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
d690: 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
d6a0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
d6b0: 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70  fier Goto */.  p
d6c0: 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
d6d0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  a;.  for(i=0, pL
d6e0: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
d6f0: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
d700: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
d710: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
d720: 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
d730: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49  to open */.    I
d740: 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20  ndex *pIx;      
d750: 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
d760: 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69 66   access pTab (if
d770: 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74   any) */.    int
d780: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
d790: 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
d7a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
d7b0: 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
d7c0: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70   int iIdxCur = p
d7d0: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
d7e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d7f0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
d800: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
d810: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
d820: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
d830: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
d840: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
d850: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
d860: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
d870: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
d880: 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45 20  3MPrintf("TABLE 
d890: 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
d8a0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
d8b0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
d8c0: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
d8d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
d8e0: 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
d8f0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
d900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d910: 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
d920: 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
d930: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
d940: 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57 49  e3MPrintf("%z WI
d950: 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d  TH INDEX %s", zM
d960: 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b  sg, pIx->zName);
d970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d980: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
d990: 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
d9a0: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
d9b0: 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  GE) ){.        z
d9c0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
d9d0: 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20 50  intf("%z USING P
d9e0: 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
d9f0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
da00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
da10: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
da20: 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
da30: 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d  , zMsg, P3_DYNAM
da40: 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
da50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
da60: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
da70: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
da80: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
da90: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
daa0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
dab0: 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
dac0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
dad0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
dae0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
daf0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
db00: 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d  ansient || pTab-
db10: 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
db20: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
db30: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
db40: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
db50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
db60: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
db70: 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
db80: 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
db90: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
dba0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
dbb0: 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d  Col<(sizeof(Bitm
dbc0: 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20  ask)*8) ){.     
dbd0: 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
dbe0: 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
dbf0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
dc00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
dc10: 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
dc20: 2b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +);.        sqli
dc30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
dc40: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
dc50: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
dc60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
dc70: 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
dc80: 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
dc90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
dca0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
dcb0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
dcc0: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
dcd0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
dce0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
dcf0: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
dd00: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
dd10: 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
dd20: 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
dd30: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
dd40: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
dd50: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
dd60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dd70: 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
dd80: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
dd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dda0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ddb0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
ddc0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ddd0: 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78  ((v, "# %s", pIx
dde0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
ddf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
de00: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
de10: 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  iIdxCur, pIx->tn
de20: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
de30: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
de40: 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
de50: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
de60: 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
de70: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
de80: 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  IDX_ONLY)!=0 ){.
de90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
deb0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78  NumColumns, iIdx
dec0: 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d  Cur, pIx->nColum
ded0: 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n+1);.    }.    
dee0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
def0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
df00: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
df10: 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
df20: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
df30: 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  r(v);..  /* Gene
df40: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
df50: 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
df60: 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
df70: 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
df80: 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
df90: 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
dfa0: 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
dfb0: 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
dfc0: 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
dfd0: 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
dfe0: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
dff0: 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
e000: 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
e010: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
e020: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
e030: 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72   j;.    int iCur
e040: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
e050: 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44  rsor;  /* The VD
e060: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
e070: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49  e table */.    I
e080: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
e090: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
e0a0: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
e0b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
e0c0: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
e0d0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
e0e0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
e0f0: 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
e100: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
e110: 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
e120: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74   only */.    int
e130: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
e140: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
e150: 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
e160: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a  verse order */..
e170: 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
e180: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
e190: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
e1a0: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
e1b0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49  >iCursor;.    pI
e1c0: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
e1d0: 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
e1e0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
e1f0: 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c  ;.    bRev = (pL
e200: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e210: 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
e220: 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  .    omitTable =
e230: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
e240: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
e250: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  )!=0;..    /* Cr
e260: 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
e270: 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
e280: 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
e290: 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66  uctions.    ** f
e2a0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
e2b0: 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72  oop.  Jump to br
e2c0: 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
e2d0: 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a  f a loop..    **
e2e0: 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
e2f0: 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
e300: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
e310: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20  ation of the.   
e320: 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f   ** loop..    */
e330: 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65  .    brk = pLeve
e340: 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  l->brk = sqlite3
e350: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e360: 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65  ;.    cont = pLe
e370: 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69  vel->cont = sqli
e380: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e390: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  (v);..    /* If 
e3a0: 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
e3b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
e3c0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
e3d0: 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a  locate and.    *
e3e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
e3f0: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
e400: 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
e410: 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
e420: 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20  y.    ** row of 
e430: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
e440: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20  f the join..    
e450: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
e460: 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
e470: 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e  TabItem[-1].join
e480: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
e490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
e4a0: 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  !pParse->nMem ) 
e4b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
e4c0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
e4d0: 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65  eftJoin = pParse
e4e0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
e4f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e500: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
e510: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
e520: 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oin);.      Vdbe
e530: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
e540: 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
e550: 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
e560: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
e570: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e580: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
e590: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
e5a0: 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
e5b0: 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
e5c0: 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
e5d0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
e5e0: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
e5f0: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
e600: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
e610: 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
e620: 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
e630: 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
e640: 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
e650: 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
e660: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
e670: 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
e680: 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  /.      pTerm = 
e690: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
e6a0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
e6b0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
e6c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e6d0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
e6e0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
e6f0: 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
e700: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e710: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
e720: 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
e730: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
e740: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  0 );.      codeE
e750: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
e760: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
e770: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  pLevel);.      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 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e7a0: 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   1, brk);.      
e7b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e7c0: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
e7d0: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
e7e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e7f0: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
e800: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
e810: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
e820: 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
e830: 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
e840: 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  D_RANGE ){.     
e850: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
e860: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
e870: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
e880: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
e890: 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
e8a0: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
e8b0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
e8c0: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
e8d0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
e8e0: 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
e8f0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
e900: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
e910: 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
e920: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
e930: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
e940: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
e950: 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
e960: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
e970: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
e980: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
e990: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
e9a0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e9b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  pStart;.        
e9c0: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
e9d0: 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54         pEnd = pT
e9e0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
e9f0: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
ea00: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
ea10: 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
ea20: 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
ea30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ea40: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
ea50: 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
ea60: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
ea70: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
ea80: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ea90: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
eaa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eac0: 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70  ForceInt, pX->op
ead0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LE || pX->o
eae0: 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a  p==TK_GT, brk);.
eaf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eb00: 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
eb10: 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f   ? OP_MoveLt : O
eb20: 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20  P_MoveGe, iCur, 
eb30: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64  brk);.        Vd
eb40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
eb50: 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69  k"));.        di
eb60: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
eb70: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
eb80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eb90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eba0: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
ebb0: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
ebc0: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
ebd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ebe0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
ebf0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
ec00: 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
ec10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ec20: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
ec30: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
ec40: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
ec50: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
ec60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ec70: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
ec80: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
ec90: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
eca0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
ecb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ecc0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
ecd0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
ece0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
ecf0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
ed00: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
ed10: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
ed20: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
ed30: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
ed40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed50: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
ed60: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
ed70: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
ed80: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
ed90: 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
eda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
edb0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
edc0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
edd0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
ede0: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
edf0: 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
ee00: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
ee10: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
ee20: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
ee30: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
ee40: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
ee50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
ee70: 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  id, iCur, 0);.  
ee80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
eea0: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
eeb0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
eec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eed0: 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49  (v, testOp, SQLI
eee0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
eef0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
ef00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
ef10: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
ef20: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
ef30: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
ef40: 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  3: The WHERE cla
ef50: 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72 65  use term that re
ef60: 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67 68  fers to the righ
ef70: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
ef80: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f          column o
ef90: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
efa0: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46  n inequality.  F
efb0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20  or example, if. 
efc0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
efd0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20  the index is on 
efe0: 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20  (x,y,z) and the 
eff0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
f000: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
f010: 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d          form "x=
f020: 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e  5 AND y<10" then
f030: 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75 73   this case is us
f040: 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20  ed.  Only the.  
f050: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72      **         r
f060: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
f070: 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
f080: 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
f090: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20   must.      **  
f0a0: 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
f0b0: 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
f0c0: 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a  rators..      **
f0d0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
f0e0: 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
f0f0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
f100: 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
f110: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a   clause.      **
f120: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
f130: 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
f140: 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
f150: 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
f160: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f170: 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
f180: 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
f190: 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
f1a0: 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   BY..      */.  
f1b0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
f1c0: 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
f1d0: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20  Level->nEq;.    
f1e0: 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20    int topEq=0;  
f1f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f200: 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20   top limit uses 
f210: 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72  ==. False is str
f220: 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20  ictly < */.     
f230: 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20   int btmEq=0;   
f240: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f250: 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d  btm limit uses =
f260: 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72 69  =. False if stri
f270: 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20  ctly > */.      
f280: 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70  int topOp, btmOp
f290: 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73  ;   /* Operators
f2a0: 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64   for the top and
f2b0: 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62   bottom search b
f2c0: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounds */.      i
f2d0: 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20  nt testOp;.     
f2e0: 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20   int nNotNull;  
f2f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f300: 66 20 72 6f 77 73 20 6f 66 20 69 6e 64 65 78 20  f rows of index 
f310: 74 68 61 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e  that must be non
f320: 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69  -NULL */.      i
f330: 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70  nt topLimit = (p
f340: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
f350: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21  HERE_TOP_LIMIT)!
f360: 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74  =0;.      int bt
f370: 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c  mLimit = (pLevel
f380: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
f390: 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a  BTM_LIMIT)!=0;..
f3a0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
f3b0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f3c0: 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
f3d0: 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
f3e0: 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20   or IN.      ** 
f3f0: 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61  and level the va
f400: 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
f410: 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  rms on the stack
f420: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f430: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
f440: 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c  Terms(pParse, pL
f450: 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65  evel, &wc, notRe
f460: 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20  ady, brk);..    
f470: 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74    /* Duplicate t
f480: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
f490: 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65 20   values because 
f4a0: 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65  they will all be
f4b0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74  .      ** used t
f4c0: 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61  wice: once to ma
f4d0: 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ke the terminati
f4e0: 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20  on key and once 
f4f0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  to make the.    
f500: 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a    ** start key..
f510: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
f520: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
f530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
f540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f550: 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20   OP_Dup, nEq-1, 
f560: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
f570: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
f580: 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e   what comparison
f590: 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73   operators to us
f5a0: 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f  e for top and bo
f5b0: 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73  ttom .      ** s
f5c0: 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f  earch bounds. Fo
f5d0: 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  r an ascending i
f5e0: 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d  ndex, the bottom
f5f0: 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72   bound is a > or
f600: 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65   >=.      ** ope
f610: 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f  rator and the to
f620: 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f  p bound is a < o
f630: 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20  r <= operator.  
f640: 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67  For a descending
f650: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  .      ** index 
f660: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
f670: 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20  e reversed..    
f680: 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e    */.      nNotN
f690: 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c  ull = nEq + topL
f6a0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  imit;.      if( 
f6b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
f6c0: 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
f6d0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  _ASC ){.        
f6e0: 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f  topOp = WO_LT|WO
f6f0: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d  _LE;.        btm
f700: 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  Op = WO_GT|WO_GE
f710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f720: 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57         topOp = W
f730: 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20  O_GT|WO_GE;.    
f740: 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c      btmOp = WO_L
f750: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
f760: 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69   SWAP(int, topLi
f770: 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a  mit, btmLimit);.
f780: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f790: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
f7a0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20  ermination key. 
f7b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
f7c0: 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20   value that.    
f7d0: 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68    ** will end th
f7e0: 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
f7f0: 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69   is no terminati
f800: 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a  on key if there.
f810: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20        ** are no 
f820: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
f830: 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65  nd no "X<..." te
f840: 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm..      **.   
f850: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
f860: 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d  4: On a reverse-
f870: 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20  order scan, the 
f880: 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69  so-called "termi
f890: 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a  nation".      **
f8a0: 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65   key computed he
f8b0: 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  re really ends u
f8c0: 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72  p being the star
f8d0: 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
f8e0: 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d        if( topLim
f8f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
f900: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
f910: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
f920: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
f930: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
f940: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
f950: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f  , notReady, topO
f960: 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  p, pIdx);.      
f970: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
f980: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58  =0 );.        pX
f990: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
f9a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f9b0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
f9c0: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
f9d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f9e0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f9f0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
fa00: 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20          topEq = 
fa10: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
fa20: 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
fa30: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
fa40: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
fa50: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  rm);.        tes
fa60: 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a  tOp = OP_IdxGE;.
fa70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa80: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45       testOp = nE
fa90: 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a  q>0 ? OP_IdxGE :
faa0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
fab0: 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20    topEq = 1;.   
fac0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
fad0: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
fae0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
faf0: 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69  ol = nEq + topLi
fb00: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  mit;.        pLe
fb10: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
fb20: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
fb30: 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
fb40: 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71  obe(v, nCol, nEq
fb50: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
fb60: 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
fb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
fb80: 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f  op = topEq ? OP_
fb90: 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveLe : OP_Move
fba0: 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Lt;.          sq
fbb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fbc0: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
fbd0: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rk);.        }el
fbe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
fbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fc00: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
fc10: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
fc20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fc30: 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
fc40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
fc50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fc60: 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c  P_Last, iIdxCur,
fc70: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a   brk);.      }..
fc80: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
fc90: 65 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e  e the start key.
fca0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65    This is the ke
fcb0: 79 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  y that defines t
fcc0: 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a  he lower.      *
fcd0: 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73  * bound on the s
fce0: 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
fcf0: 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66   no start key if
fd00: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
fd10: 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
fd20: 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65  terms and if the
fd30: 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22  re is no "X>..."
fd40: 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20   term.  In.     
fd50: 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67   ** that case, g
fd60: 65 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e  enerate a "Rewin
fd70: 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  d" instruction i
fd80: 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20  n place of the. 
fd90: 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65       ** start ke
fda0: 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20  y search..      
fdb0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32  **.      ** 2002
fdc0: 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20  -Dec-04: In the 
fdd0: 63 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73  case of a revers
fde0: 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20  e-order search, 
fdf0: 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20  the so-called.  
fe00: 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b      ** "start" k
fe10: 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  ey really ends u
fe20: 70 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  p being used as 
fe30: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
fe40: 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
fe50: 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74      if( btmLimit
fe60: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
fe70: 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
fe80: 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
fe90: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
fea0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
feb0: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20  m(&wc, iCur, k, 
fec0: 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c  notReady, btmOp,
fed0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
fee0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
fef0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
ff00: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
ff10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
ff20: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
ff30: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
ff40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff50: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ff60: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
ff70: 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54        btmEq = pT
ff80: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20  erm->operator & 
ff90: 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
ffa0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
ffb0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
ffc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ffd0: 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20          btmEq = 
ffe0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
fff0: 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74   if( nEq>0 || bt
10000 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
10010 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71    int nCol = nEq
10020 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20   + btmLimit;.   
10030 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
10040 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c  robe(v, nCol, 0,
10050 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
10060 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
10070 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65  .          pLeve
10080 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
10090 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
100a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
100b0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
100c0 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
100d0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  m, 1);.         
100e0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78   testOp = OP_Idx
100f0 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  LT;.        }els
10100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
10110 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50   op = btmEq ? OP
10120 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveGe : OP_Mov
10130 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eGt;.          s
10140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10150 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
10160 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  brk);.        }.
10170 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10180 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
10190 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
101a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
101b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
101c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
101d0 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62  wind, iIdxCur, b
101e0 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
101f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10200 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74  the the top of t
10210 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65  he loop.  If the
10220 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74  re is a terminat
10230 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  ion.      ** key
10240 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74   we have to test
10250 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e   for that key an
10260 64 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74  d abort at the t
10270 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  op of the.      
10280 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a  ** loop..      *
10290 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20  /.      start = 
102a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
102b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
102c0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
102d0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
102e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102f0 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
10300 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29  pLevel->iMem, 0)
10310 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10320 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65  3VdbeAddOp(v, te
10330 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  stOp, iIdxCur, b
10340 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rk);.        if(
10350 20 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76   (topEq && !bRev
10360 29 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20  ) || (!btmEq && 
10370 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  bRev) ){.       
10380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10390 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b  angeP3(v, -1, "+
103a0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
103b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
103c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
103d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
103e0 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
103f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10400 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10410 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e  IdxIsNull, nNotN
10420 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  ull, cont);.    
10430 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
10440 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10450 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10460 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
10470 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
10480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10490 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
104a0 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
104b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63   }..      /* Rec
104c0 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
104d0 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
104e0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a  inate the loop..
104f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
10500 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
10510 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
10520 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
10530 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
10540 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
10550 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
10560 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
10570 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
10580 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20  COLUMN_EQ ){.   
10590 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
105a0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
105b0 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f   and all terms o
105c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
105d0 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  se that.      **
105e0 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20            refer 
105f0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  to the index usi
10600 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22  ng the "==" or "
10610 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20  IN" operators.. 
10620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
10630 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
10640 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
10650 3e 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  >nEq;..      /* 
10660 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10670 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
10680 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
10690 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
106a0 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65      ** and leave
106b0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
106c0 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68  hose terms on th
106d0 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
106e0 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45  /.      codeAllE
106f0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
10700 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63  rse, pLevel, &wc
10710 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29  , notReady, brk)
10720 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
10730 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65  rate a single ke
10740 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
10750 73 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72  sed to both star
10760 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a  t and terminate.
10770 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61        ** the sea
10780 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rch.      */.   
10790 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
107a0 62 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72  be(v, nEq, 0, br
107b0 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
107c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
107d0 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
107e0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
107f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
10800 65 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74  erate code (1) t
10810 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69  o move to the fi
10820 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65  rst matching ele
10830 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
10840 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  e..      ** Then
10850 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   generate code (
10860 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  2) that jumps to
10870 20 22 62 72 6b 22 20 61 66 74 65 72 20 74 68 65   "brk" after the
10880 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a   cursor is past.
10890 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
108a0 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
108b0 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
108c0 20 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69    The code (1) i
108d0 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20  s executed.     
108e0 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74   ** once to init
108f0 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63  ialize the searc
10900 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20  h, the code (2) 
10910 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f  is executed befo
10920 72 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a  re each.      **
10930 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
10940 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66  e scan to see if
10950 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69   the scan has fi
10960 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20  nished. */.     
10970 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
10980 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
10990 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
109a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
109b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
109c0 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c  MoveLe, iIdxCur,
109d0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
109e0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
109f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10a00 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
10a10 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
10a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a30 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69  p(v, OP_IdxLT, i
10a40 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
10a50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
10a60 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
10a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10a80 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
10a90 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
10aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10ab0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10ac0 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c  MoveGe, iIdxCur,
10ad0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
10ae0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10af0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10b00 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
10b10 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
10b20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10b30 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64  v, OP_IdxGE, iId
10b40 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20  xCur, brk, "+", 
10b50 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10b60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
10b70 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
10b80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
10b90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
10ba0 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
10bb0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10bc0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10bd0 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c  _IdxIsNull, nEq,
10be0 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
10bf0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
10c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10c20 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
10c30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c50 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
10c60 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
10c70 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
10c80 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
10c90 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
10ca0 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
10cb0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a        /* Case 5:
10cc0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
10cd0 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
10ce0 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
10cf0 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  te.      **     
10d00 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
10d10 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
10d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
10d30 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
10d40 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
10d50 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
10d60 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
10d70 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
10d80 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
10d90 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
10da0 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
10db0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10dc0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
10dd0 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  brk);.    }.    
10de0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
10df0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69  Mask(&maskSet, i
10e00 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Cur);..    /* In
10e10 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
10e20 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
10e30 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
10e40 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20  e completely.   
10e50 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
10e60 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
10e70 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
10e80 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65    */.    for(pTe
10e90 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54  rm=wc.a, j=wc.nT
10ea0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
10eb0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
10ec0 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
10ed0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
10ee0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
10ef0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
10f00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
10f10 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
10f20 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
10f30 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10f40 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d       pE = pTerm-
10f50 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
10f60 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
10f70 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
10f80 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
10f90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10fa0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
10fb0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
10fc0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
10fd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
10fe0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
10ff0 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
11000 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
11010 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
11020 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
11030 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
11040 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
11050 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
11060 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
11070 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
11080 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
11090 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
110a0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
110b0 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a  table.  .    */.
110c0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
110d0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
110e0 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d     pLevel->top =
110f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11100 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
11110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11120 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
11130 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
11140 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
11150 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
11160 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49   record LEFT JOI
11170 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20  N hit"));.      
11180 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
11190 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b  j=0; j<wc.nTerm;
111a0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
111b0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
111c0 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
111d0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
111e0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
111f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
11200 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
11210 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
11220 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11230 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
11240 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
11250 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
11260 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
11270 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c  rm->pExpr, cont,
11280 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   1);.        pTe
11290 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
112a0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d  M_CODED;.      }
112b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
112c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  ef SQLITE_TEST  
112d0 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61  /* For testing a
112e0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
112f0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65   only */.  /* Re
11300 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72  cord in the quer
11310 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69  y plan informati
11320 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
11330 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  rent table.  ** 
11340 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73  and the index us
11350 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20  ed to access it 
11360 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68  (if any).  If th
11370 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20  e table itself. 
11380 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c   ** is not used,
11390 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73   its name is jus
113a0 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69  t '{}'.  If no i
113b0 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a  ndex is used.  *
113c0 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c  * the index is l
113d0 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20  isted as "{}".  
113e0 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  If the primary k
113f0 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20  ey is used the. 
11400 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69   ** index name i
11410 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s '*'..  */.  fo
11420 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
11430 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
11440 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
11450 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65  int n;.    pLeve
11460 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
11470 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ];.    pTabItem 
11480 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
11490 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
114a0 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d     z = pTabItem-
114b0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28  >zAlias;.    if(
114c0 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62   z==0 ) z = pTab
114d0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
114e0 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  e;.    n = strle
114f0 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  n(z);.    if( n+
11500 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
11510 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11520 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
11530 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
11540 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
11550 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  LY ){.        st
11560 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
11570 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
11580 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20  , "{}");.       
11590 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
115a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
115b0 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
115c0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
115d0 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  Plan], z);.     
115e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
115f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11600 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11610 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
11620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11630 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
11640 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
11650 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
11660 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  E) ){.      strc
11670 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
11680 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
11690 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50  "* ");.      nQP
116a0 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
116b0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
116c0 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
116d0 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
116e0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
116f0 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20  an], "{} ");.   
11700 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
11710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11720 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76   n = strlen(pLev
11730 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  el->pIdx->zName)
11740 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
11750 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
11760 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11770 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  )-2 ){.        s
11780 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
11790 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
117a0 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  ], pLevel->pIdx-
117b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
117c0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
117d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
117e0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
117f0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
11800 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
11810 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
11820 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
11830 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
11840 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
11850 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
11860 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
11870 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
11880 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
11890 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
118a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
118b0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
118c0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
118d0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
118e0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
118f0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
11900 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
11910 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
11920 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
11930 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
11940 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
11950 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
11960 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
11970 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
11980 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
11990 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
119a0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
119b0 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
119c0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
119d0 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  wc);.  sqliteFre
119e0 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  e(pWInfo);.  ret
119f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11a00 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
11a10 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
11a20 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
11a30 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
11a40 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
11a50 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
11a60 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
11a70 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
11a80 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
11a90 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
11aa0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
11ab0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
11ac0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
11ad0 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
11ae0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
11af0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a  nfo->pTabList;..
11b00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
11b10 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
11b20 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ode..  */.  for(
11b30 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i=pTabList->nSrc
11b40 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
11b50 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
11b60 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
11b70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11b80 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
11b90 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66  l->cont);.    if
11ba0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
11bb0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
11bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11bd0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
11be0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
11bf0 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p2);.    }.  
11c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11c10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
11c20 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69  vel->brk);.    i
11c30 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29  f( pLevel->nIn )
11c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a  {.      int *a;.
11c50 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11c60 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
11c70 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d  >nIn, a=&pLevel-
11c80 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b  >aInLoop[j*3-3];
11c90 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29   j>0; j--, a-=3)
11ca0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11cb0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 61 5b  3VdbeAddOp(v, a[
11cc0 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b  0], a[1], a[2]);
11cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11ce0 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c  qliteFree(pLevel
11cf0 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->aInLoop);.    
11d00 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
11d10 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
11d20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11d30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
11d40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11d50 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65  OP_IfMemPos, pLe
11d60 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20  vel->iLeftJoin, 
11d70 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11d80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11d90 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
11da0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
11db0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11dc0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
11dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
11de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11df0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
11e00 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
11e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11e30 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
11e40 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20   pLevel->top);. 
11e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11e60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11e70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11e80 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
11e90 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
11ea0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
11eb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
11ec0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
11ed0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
11ee0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11ef0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
11f00 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
11f10 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
11f20 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
11f30 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
11f40 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
11f50 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
11f60 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
11f70 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
11f80 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
11f90 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
11fa0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
11fb0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
11fc0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
11fd0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11fe0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
11ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
12000 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
12010 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
12020 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
12030 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
12040 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66    if( (pLevel->f
12050 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
12060 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
12070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12080 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
12090 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
120a0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  or, 0);.    }.  
120b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
120c0 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  dx!=0 ){.      s
120d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
120e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
120f0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29  vel->iIdxCur, 0)
12100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12110 4d 61 6b 65 20 63 75 72 73 6f 72 20 73 75 62 73  Make cursor subs
12120 74 69 74 75 74 69 6f 6e 73 20 66 6f 72 20 63 61  titutions for ca
12130 73 65 73 20 77 68 65 72 65 20 77 65 20 77 61 6e  ses where we wan
12140 74 20 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20  t to use.    ** 
12150 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 61  just the index a
12160 6e 64 20 6e 65 76 65 72 20 72 65 66 65 72 65 6e  nd never referen
12170 63 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  ce the table..  
12180 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
12190 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
121a0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
121b0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
121c0 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
121d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
121e0 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
121f0 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
12200 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
12210 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
12220 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
12230 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
12240 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
12250 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
12260 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
12270 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
12280 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
12290 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
122a0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
122b0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
122c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
122d0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
122e0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NLY ){.      int
122f0 20 69 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   i, j, last;.   
12300 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
12310 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
12320 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
12330 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
12340 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
12350 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
12360 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
12370 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
12380 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
12390 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
123a0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
123b0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c  WInfo->iTop; i<l
123c0 61 73 74 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; i++, pOp++)
123d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
123e0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
123f0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
12400 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
12410 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
12420 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
12430 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
12440 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
12450 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
12460 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
12470 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
12480 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
12490 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
124a0 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
124b0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
124c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
124d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
124e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
124f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12500 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
12510 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
12520 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
12530 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
12540 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
12550 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
12560 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  wid;.        }el
12570 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
12580 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29  de==OP_NullRow )
12590 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
125a0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
125b0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
125c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
125d0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
125e0 75 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  up.  */.  sqlite
125f0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
12600 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.