/ Hex Artifact Content
Login

Artifact 7757b1731d74364bc56d7da7cb9cfe8c9db1c019:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 35 33   where.c,v 1.153
0340: 20 32 30 30 35 2f 30 37 2f 32 37 20 32 30 3a 34   2005/07/27 20:4
0350: 31 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a  1:44 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 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 20 46 6f 72 77 61 72 64  ndif../* Forward
0520: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
0530: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0540: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
0550: 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ause;../*.** The
0560: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
0570: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
0580: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
0590: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
05a0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
05b0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
05c0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
05d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
05e0: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
05f0: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0600: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0610: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0620: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
0630: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
0640: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
0650: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
0660: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
0670: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
0680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
0690: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
06a0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
06b0: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
06c0: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
06d0: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
06e0: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
06f0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
0710: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
0720: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
0730: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
0740: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
0750: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
0760: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
0770: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
0780: 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c  hereTerm.leftCol
0790: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07a0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07b0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07c0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07d0: 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63  erm.operator rec
07e0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
07f0: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
0800: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
0810: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
0820: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
0830: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
0840: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
0850: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
0860: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
0870: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
0880: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
0890: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
08a0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
08b0: 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20  .** prereqRight 
08c0: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
08d0: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
08e0: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
08f0: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0900: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0910: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0920: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0930: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0940: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0950: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0960: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0970: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0980: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0990: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
09a0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
09b0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
09c0: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
09d0: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
09e0: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
09f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0a00: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0a10: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0a20: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0a30: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0a40: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0a50: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0a60: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0a70: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0a80: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
0a90: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
0aa0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
0ab0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0ac0: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0ad0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0ae0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0af0: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0b00: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0b10: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0b20: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0b30: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0b40: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0b50: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
0b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
0b70: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
0b80: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
0b90: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f   0 through 7..*/
0ba0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bb0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0bc0: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0bd0: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0be0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0bf0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0c00: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0c10: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 64 78 3b 20  n */.  u16 idx; 
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c30: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
0c40: 74 65 72 6d 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  term in pWC->a[]
0c50: 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 74 6e   */.  i16 iPartn
0c60: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
0c70: 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b   Disable pWC->a[
0c80: 69 50 61 72 74 6e 65 72 5d 20 77 68 65 6e 20 74  iPartner] when t
0c90: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0ca0: 64 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  d */.  u16 flags
0cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0cc0: 2a 20 42 69 74 20 66 6c 61 67 73 2e 20 20 53 65  * Bit flags.  Se
0cd0: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 69 31 36  e below */.  i16
0ce0: 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20   leftCursor;    
0cf0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0d00: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0d10: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0d20: 0a 20 20 69 31 36 20 6c 65 66 74 43 6f 6c 75 6d  .  i16 leftColum
0d30: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
0d40: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
0d50: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
0d60: 72 3e 22 20 2a 2f 0a 20 20 75 31 36 20 6f 70 65  r>" */.  u16 ope
0d70: 72 61 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  rator;          
0d80: 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c 75   /* A WO_xx valu
0d90: 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c 6f 70  e describing <op
0da0: 3e 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  > */.  WhereClau
0db0: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
0dc0: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
0dd0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
0de0: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
0df0: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
0e00: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
0e10: 6c 65 73 20 75 73 65 64 20 62 79 20 70 52 69 67  les used by pRig
0e20: 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ht */.  Bitmask 
0e30: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
0e40: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0e50: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0e60: 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  by p */.};../*.*
0e70: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0e80: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 66 6c   of WhereTerm.fl
0e90: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
0ea0: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
0eb0: 78 30 30 30 31 20 20 20 2f 2a 20 4e 65 65 64 20  x0001   /* Need 
0ec0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45  to call sqlite3E
0ed0: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
0ee0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0ef0: 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30 30  _VIRTUAL    0x00
0f00: 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79  02   /* Added by
0f10: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
0f20: 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a   Do not code */.
0f30: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44  #define TERM_COD
0f40: 45 44 20 20 20 20 20 20 30 78 30 30 30 34 20 20  ED      0x0004  
0f50: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73   /* This term is
0f60: 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a   already coded *
0f70: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
0f80: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0f90: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
0fa0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
0fb0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
0fc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
0fd0: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
0fe0: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
0ff0: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1000: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1010: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1040: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1050: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b   */.  int nSlot;
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
10b0: 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  ies in a[] */.  
10c0: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20  WhereTerm *a;   
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
10e0: 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61   a[] describes a
10f0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1100: 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20 57  RE cluase */.  W
1110: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
1120: 5b 31 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74 69  [10];   /* Initi
1130: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
1140: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  for a[] */.};../
1150: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1160: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1170: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
1180: 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70  s track of a map
1190: 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ping.** between 
11a0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
11b0: 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20  ers and bits of 
11c0: 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20  the bitmasks in 
11d0: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
11e0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
11f0: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61   numbers are sma
1200: 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74  ll integers cont
1210: 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63  ained in .** Src
1220: 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f  List_item.iCurso
1230: 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c  r and Expr.iTabl
1240: 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61  e fields.  For a
1250: 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a  ny given WHERE .
1260: 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  ** clause, the c
1270: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69  ursor numbers mi
1280: 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  ght not begin wi
1290: 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69  th 0 and they mi
12a0: 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67  ght.** contain g
12b0: 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  aps in the numbe
12c0: 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20  ring sequence.  
12d0: 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  But we want to m
12e0: 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75  ake maximum.** u
12f0: 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69  se of the bits i
1300: 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20  n our bitmasks. 
1310: 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
1320: 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69  provides a mappi
1330: 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  ng.** from the s
1340: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
1350: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
1360: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62  utive integers b
1370: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68  eginning.** with
1380: 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78 70   0..**.** If Exp
1390: 72 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  rMaskSet.ix[A]==
13a0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
13b0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
13c0: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
13d0: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
13e0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
13f0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1400: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1410: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1420: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1430: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1440: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1450: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1460: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1470: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1480: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74    ExprMaskSet st
1490: 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64  ructure.** would
14a0: 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f   map those curso
14b0: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
14c0: 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e  its 0 through 5.
14d0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
14e0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
14f0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1500: 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65  ordered.  In the
1510: 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76   example.** abov
1520: 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d  e, the mapping m
1530: 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69  ight go like thi
1540: 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20  s:  4->3, 5->1, 
1550: 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20  8->2, 29->0,.** 
1560: 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f  57->5, 73->4.  O
1570: 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68  r one of 719 oth
1580: 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  er combinations 
1590: 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20 49  might be used. I
15a0: 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65  t.** does not re
15b0: 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68  ally matter.  Wh
15c0: 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  at is important 
15d0: 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20 63  is that sparse c
15e0: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
15f0: 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20   all get mapped 
1600: 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73  into bit numbers
1610: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
1620: 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a   0 and contain.*
1630: 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 74 79  * no gaps..*/.ty
1640: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
1650: 72 4d 61 73 6b 53 65 74 20 45 78 70 72 4d 61 73  rMaskSet ExprMas
1660: 6b 53 65 74 3b 0a 73 74 72 75 63 74 20 45 78 70  kSet;.struct Exp
1670: 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74  rMaskSet {.  int
1680: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16a0: 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64  mber of assigned
16b0: 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a   cursor values *
16c0: 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a 65 6f  /.  int ix[sizeo
16d0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20 20  f(Bitmask)*8];  
16e0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69    /* Cursor assi
16f0: 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74  gned to each bit
1700: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42   */.};.../*.** B
1710: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
1720: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
1730: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
1740: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
1750: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
1760: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
1770: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
1780: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
1790: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
17a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
17b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
17c0: 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  IN     1.#define
17d0: 20 57 4f 5f 4c 49 53 54 20 20 20 32 0a 23 64 65   WO_LIST   2.#de
17e0: 66 69 6e 65 20 57 4f 5f 53 45 4c 45 43 54 20 34  fine WO_SELECT 4
17f0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
1800: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 57 4f 5f     8.#define WO_
1810: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
1820: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
1830: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
1840: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
1850: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
1860: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
1870: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
1880: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
1890: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
18a0: 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a 20  -TK_EQ))../*.** 
18b0: 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20  Value for flags 
18c0: 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73 74  returned by best
18d0: 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66 69  Index().*/.#defi
18e0: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  ne WHERE_ROWID_E
18f0: 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20 20  Q       0x0001  
1900: 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f   /* rowid=EXPR o
1910: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
1920: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1930: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 20  E_ROWID_RANGE   
1940: 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f 77   0x0002   /* row
1950: 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72  id<EXPR and/or r
1960: 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65  owid>EXPR */.#de
1970: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1980: 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31 30  N_EQ      0x0010
1990: 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20     /* x=EXPR or 
19a0: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
19b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
19c0: 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30 32  MN_RANGE   0x002
19d0: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e  0   /* x<EXPR an
19e0: 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23  d/or x>EXPR */.#
19f0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1a00: 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30 30  UMN_IN      0x00
1a10: 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  40   /* x IN (..
1a20: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1a30: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20  ERE_TOP_LIMIT   
1a40: 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20 78     0x0100   /* x
1a50: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
1a60: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
1a70: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
1a80: 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30 32  _LIMIT      0x02
1a90: 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f  00   /* x>EXPR o
1aa0: 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x>=EXPR constr
1ab0: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
1ac0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
1ad0: 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f 2a       0x0800   /*
1ae0: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
1af0: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
1b00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
1b10: 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78 31  DERBY        0x1
1b20: 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  000   /* Output 
1b30: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
1b40: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
1b50: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
1b60: 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78 32  VERSE        0x2
1b70: 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e  000   /* Scan in
1b80: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1b90: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
1ba0: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
1bb0: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
1bc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1bd0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
1be0: 61 75 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c  auseInit(WhereCl
1bf0: 61 75 73 65 20 2a 70 57 43 2c 20 50 61 72 73 65  ause *pWC, Parse
1c00: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 57 43   *pParse){.  pWC
1c10: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
1c20: 65 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  e;.  pWC->nTerm 
1c30: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
1c40: 74 20 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57  t = ARRAYSIZE(pW
1c50: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
1c60: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
1c70: 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  atic;.}../*.** D
1c80: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
1c90: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1ca0: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
1cb0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
1cc0: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
1cd0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
1ce0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
1cf0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
1d00: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
1d10: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
1d20: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
1d30: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
1d40: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
1d50: 20 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43   *a;.  for(i=pWC
1d60: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
1d70: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
1d80: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
1d90: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
1da0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
1db0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1dc0: 28 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  (a->pExpr);.    
1dd0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d  }.  }.  if( pWC-
1de0: 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  >a!=pWC->aStatic
1df0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1e00: 65 65 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  ee(pWC->a);.  }.
1e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
1e20: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
1e30: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1e40: 72 75 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61  ructure.  Increa
1e50: 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  se the allocated
1e60: 0a 2a 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63  .** space as nec
1e70: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
1e80: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
1e90: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
1ea0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1eb0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
1ec0: 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72  ags){.  WhereTer
1ed0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 66 28 20  m *pTerm;.  if( 
1ee0: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
1ef0: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
1f00: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
1f10: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d  pWC->a;.    pWC-
1f20: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
1f30: 63 28 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  c( sizeof(pWC->a
1f40: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
1f50: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
1f60: 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ->a==0 ) return 
1f70: 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57  0;.    memcpy(pW
1f80: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
1f90: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
1fa0: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
1fb0: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
1fc0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
1fd0: 71 6c 69 74 65 46 72 65 65 28 70 4f 6c 64 29 3b  qliteFree(pOld);
1fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
1ff0: 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a  nSlot *= 2;.  }.
2000: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2010: 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
2020: 20 70 54 65 72 6d 2d 3e 69 64 78 20 3d 20 70 57   pTerm->idx = pW
2030: 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 57 43 2d  C->nTerm;.  pWC-
2040: 3e 6e 54 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72  >nTerm++;.  pTer
2050: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20  m->pExpr = p;.  
2060: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66  pTerm->flags = f
2070: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
2080: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
2090: 6d 2d 3e 69 50 61 72 74 6e 65 72 20 3d 20 2d 31  m->iPartner = -1
20a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d  ;.  return pTerm
20b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20c0: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
20d0: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
20e0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
20f0: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
2100: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
2110: 6e 20 69 73 20 73 65 70 61 72 61 74 65 20 62 79  n is separate by
2120: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
2130: 72 2e 20 20 61 53 6c 6f 74 20 69 73 20 0a 2a 2a  r.  aSlot is .**
2140: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
2150: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 73 75 62  nters to the sub
2160: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
2170: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2180: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
2190: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
21a0: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
21b0: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
21c0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
21d0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
21e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
21f0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
2200: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
2210: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
2220: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2240: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
2250: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2260: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
2270: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
2280: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
2290: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
22a0: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
22b0: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
22c0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
22d0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
22e0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
22f0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
2300: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
2310: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
2320: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
2330: 61 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72  array.  This arr
2340: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
2350: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
2360: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2370: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
2380: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2390: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
23a0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
23b0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
23c0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
23d0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
23e0: 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op!=TK_AND ){.  
23f0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
2400: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
2410: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
2420: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2430: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
2440: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2450: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
2460: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2470: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65   Initialize an e
2480: 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2490: 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  et.*/.#define in
24a0: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65  itMaskSet(P)  me
24b0: 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f  mset(P, 0, sizeo
24c0: 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  f(*P))../*.** Re
24d0: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
24e0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
24f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2500: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
2510: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2520: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
2530: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
2540: 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  sk(ExprMaskSet *
2550: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
2560: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b  ursor){.  int i;
2570: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
2580: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
2590: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
25a0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
25b0: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
25c0: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
25d0: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
25e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
25f0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
2600: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
2610: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
2620: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
2630: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
2640: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
2650: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
2660: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
2670: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
2680: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
2690: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
26a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
26b0: 69 6e 28 29 20 72 6f 75 74 69 65 6e 2e 20 20 53  in() routien.  S
26c0: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
26d0: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
26e0: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
26f0: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
2700: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2710: 72 65 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61  reateMask(ExprMa
2720: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2730: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2740: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
2750: 74 2d 3e 6e 20 3c 20 41 52 52 41 59 53 49 5a 45  t->n < ARRAYSIZE
2760: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2770: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2780: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2790: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
27a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27b0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
27c0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
27d0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
27e0: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
27f0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
2800: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
2810: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
2820: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
2830: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
2840: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2850: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
2860: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
2870: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
2880: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
2890: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
28a0: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
28b0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
28c0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
28d0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
28e0: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
28f0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2900: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
2910: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
2920: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
2930: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
2940: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
2950: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
2960: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
2970: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
2980: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
2990: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
29a0: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
29b0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
29c0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
29d0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
29e0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
29f0: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
2a00: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
2a10: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
2a20: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
2a30: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
2a40: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
2a50: 73 6b 53 65 74 20 2a 2c 20 45 78 70 72 4c 69 73  skSet *, ExprLis
2a60: 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  t *);.static Bit
2a70: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
2a80: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2a90: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
2aa0: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
2ab0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
2ac0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2ad0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
2ae0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
2af0: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
2b00: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
2b10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
2b20: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
2b30: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2b40: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
2b50: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
2b60: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2b70: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
2b80: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
2b90: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2ba0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2bb0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ist);.  if( p->p
2bc0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 53 65  Select ){.    Se
2bd0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 2d 3e 70 53  lect *pS = p->pS
2be0: 65 6c 65 63 74 3b 0a 20 20 20 20 6d 61 73 6b 20  elect;.    mask 
2bf0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2c00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2c10: 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  pS->pEList);.   
2c20: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2c30: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2c40: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
2c50: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2c60: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2c70: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2c80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
2c90: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2ca0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2cb0: 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , pS->pWhere);. 
2cc0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
2cd0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2ce0: 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29  et, pS->pHaving)
2cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
2d00: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
2d10: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
2d20: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
2d30: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2d40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2d50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
2d60: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
2d70: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2d80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
2d90: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
2da0: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
2db0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2dc0: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
2dd0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2de0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
2df0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
2e00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2e10: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
2e20: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
2e30: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
2e40: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
2e50: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
2e60: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
2e70: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
2e80: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
2e90: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
2ea0: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
2eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ec0: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
2ed0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
2ee0: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
2ef0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
2f00: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
2f10: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
2f20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
2f30: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
2f40: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
2f50: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
2f60: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
2f70: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
2f80: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
2f90: 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K_GE);.}../*.** 
2fa0: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
2fb0: 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23   of type T..*/.#
2fc0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2fd0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2fe0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ff0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
3000: 70 61 72 69 73 69 6f 6e 20 6f 70 65 72 61 74 6f  parision operato
3010: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
3020: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
3030: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
3040: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
3050: 20 58 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   X"..*/.static v
3060: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
3070: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3080: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
3090: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
30a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
30b0: 20 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53   );.  SWAP(CollS
30c0: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
30d0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
30e0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
30f0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
3100: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
3110: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
3120: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3140: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3160: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3170: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3180: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
3190: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
31a0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
31b0: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
31c0: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
31d0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
31e0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
31f0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
3200: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
3210: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
3220: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3230: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3240: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
3250: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3260: 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  t op){.  int c;.
3270: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
3280: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
3290: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
32a0: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
32b0: 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 57 4f  else{.    c = WO
32c0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 3b  _EQ<<(op-TK_EQ);
32d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
32e0: 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57  p!=TK_IN || c==W
32f0: 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  O_IN );.  assert
3300: 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63  ( op!=TK_EQ || c
3310: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73  ==WO_EQ );.  ass
3320: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c  ert( op!=TK_LT |
3330: 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  | c==WO_LT );.  
3340: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
3350: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b  E || c==WO_LE );
3360: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3370: 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54  K_GT || c==WO_GT
3380: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3390: 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GE || c==WO
33a0: 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _GE );.  return 
33b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  c;.}../*.** Sear
33c0: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
33d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33e0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
33f0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
3400: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
3410: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
3420: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
3430: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
3440: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
3450: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
3460: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
3470: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
3480: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
3490: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
34a0: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
34b0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
34c0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  nd..*/.static Wh
34d0: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
34e0: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
34f0: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
3500: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
3510: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
3520: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
3540: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
3550: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
3560: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
3570: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3580: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
3590: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
35a0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
35b0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
35c0: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f   mask */.  u16 o
35d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
35e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
35f0: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
3600: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
3610: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
3620: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
3630: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
3640: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
3650: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
3660: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3670: 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  erm;.  int k;.  
3680: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
3690: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
36a0: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
36b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
36c0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
36d0: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
36e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
36f0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
3700: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
3710: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
3720: 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70  umn.       && (p
3730: 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26  Term->operator &
3740: 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20   op)!=0.    ){. 
3750: 20 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d 30       if( iCur>=0
3760: 20 26 26 20 70 49 64 78 20 29 7b 0a 20 20 20 20   && pIdx ){.    
3770: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
3780: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
3790: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
37a0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
37b0: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
37c0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
37d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
37e0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
37f0: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
3800: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3810: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
3820: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
3830: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
3840: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
3850: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
3860: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
3870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3880: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
3890: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
38a0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
38b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d           if( pX-
38c0: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
38d0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
38e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
38f0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  q(pParse, pX->pR
3900: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3920: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
3930: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
3940: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
3950: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
3960: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3970: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
3980: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
3990: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
39a0: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  ]!=iColumn; k++)
39b0: 7b 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  {}.        asser
39c0: 74 28 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  t( k<pIdx->nColu
39d0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  mn );.        if
39e0: 28 20 70 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b  ( pColl!=pIdx->k
39f0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
3a00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3a10: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
3a20: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
3a30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3a40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
3a50: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
3a60: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
3a70: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
3a80: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
3a90: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
3aa0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
3ab0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
3ac0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
3ad0: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
3ae0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
3af0: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
3b00: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
3b10: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
3b20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
3b30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
3b40: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
3b50: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
3b60: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
3b70: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
3b80: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
3b90: 70 72 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78  pr>".  If the ex
3ba0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a  pression is of.*
3bb0: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
3bc0: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
3bd0: 20 58 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c   X and Y are col
3be0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
3bf0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65  riginal.** expre
3c00: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
3c10: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
3c20: 74 75 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  tual expression 
3c30: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
3c40: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
3c50: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
3c60: 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61  clause.  .*/.sta
3c70: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
3c80: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
3c90: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
3ca0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
3cb0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
3cc0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
3cd0: 20 20 20 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73      /* table mas
3ce0: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ks */.  WhereTer
3cf0: 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20 20 20  m *pTerm        
3d00: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
3d10: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 62 65  lause term to be
3d20: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
3d30: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
3d40: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
3d50: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
3d60: 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72  ft;.  Bitmask pr
3d70: 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 69  ereqAll;.  int i
3d80: 64 78 52 69 67 68 74 3b 0a 0a 20 20 70 72 65 72  dxRight;..  prer
3d90: 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62  eqLeft = exprTab
3da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
3db0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
3dc0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
3dd0: 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c  Right = exprTabl
3de0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3df0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
3e00: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
3e10: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 20  All = prereqAll 
3e20: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3e30: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
3e40: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  );.  pTerm->left
3e50: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
3e60: 54 65 72 6d 2d 3e 69 50 61 72 74 6e 65 72 20 3d  Term->iPartner =
3e70: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 6f 70   -1;.  pTerm->op
3e80: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 64  erator = 0;.  id
3e90: 78 52 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 69  xRight = -1;.  i
3ea0: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  f( allowedOp(pEx
3eb0: 70 72 2d 3e 6f 70 29 20 26 26 20 28 70 54 65 72  pr->op) && (pTer
3ec0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
3ed0: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
3ee0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
3ef0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
3f00: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  t;.    Expr *pRi
3f10: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
3f20: 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ght;.    if( pLe
3f30: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
3f40: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
3f50: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
3f60: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
3f70: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
3f80: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
3f90: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
3fa0: 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20  erm->operator = 
3fb0: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 45 78  operatorMask(pEx
3fc0: 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20 20 20 69  pr->op);.      i
3fd0: 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74  f( pTerm->operat
3fe0: 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  or==WO_IN ){.   
3ff0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
4000: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
4010: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6f 70 65 72       pTerm->oper
4020: 61 74 6f 72 20 7c 3d 20 57 4f 5f 53 45 4c 45 43  ator |= WO_SELEC
4030: 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
4040: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
4050: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
4060: 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 7c  Term->operator |
4070: 3d 20 57 4f 5f 4c 49 53 54 3b 0a 20 20 20 20 20  = WO_LIST;.     
4080: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4090: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
40a0: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
40b0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
40c0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
40d0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
40e0: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
40f0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
4100: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
4110: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
4120: 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20  xprDup(pExpr);. 
4130: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 77 68         pNew = wh
4140: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
4150: 70 54 65 72 6d 2d 3e 70 57 43 2c 20 70 44 75 70  pTerm->pWC, pDup
4160: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
4170: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
4180: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
4190: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
41a0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 74 6e      pNew->iPartn
41b0: 65 72 20 3d 20 70 54 65 72 6d 2d 3e 69 64 78 3b  er = pTerm->idx;
41c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
41d0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
41e0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
41f0: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
4200: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
4210: 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ute(pDup);.     
4220: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
4230: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
4240: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
4250: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
4260: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f      pNew->leftCo
4270: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
4280: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
4290: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
42a0: 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20   prereqLeft;.   
42b0: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
42c0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
42d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72        pNew->oper
42e0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
42f0: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20  ask(pDup->op);. 
4300: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
4310: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4320: 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20  decides if pIdx 
4330: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
4340: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
4350: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20   BY.** clause.  
4360: 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65  If it can, it re
4370: 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64  turns 1.  If pId
4380: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
4390: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
43a0: 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f   clause, this ro
43b0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
43c0: 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
43d0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
43e0: 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c  lause from a SEL
43f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
4400: 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c  pTab is the.** l
4410: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft-most table i
4420: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
4430: 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53  e of that same S
4440: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4450: 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  and.** the table
4460: 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75   has a cursor nu
4470: 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20  mber of "base". 
4480: 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65   pIdx is an inde
4490: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  x on pTab..**.**
44a0: 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e   nEqCol is the n
44b0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
44c0: 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72   of pIdx that ar
44d0: 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69  e used as equali
44e0: 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  ty.** constraint
44f0: 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65  s.  Any of these
4500: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20   columns may be 
4510: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65  missing from the
4520: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
4530: 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63  use and the matc
4540: 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61  h can still be a
4550: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
4560: 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
4570: 55 4e 49 51 55 45 2c 20 74 68 65 6e 20 74 68 65  UNIQUE, then the
4580: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4590: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 68   is allowed to h
45a0: 61 76 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  ave.** additiona
45b0: 6c 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  l terms past the
45c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
45d0: 78 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20  x and the match 
45e0: 77 69 6c 6c 20 73 74 69 6c 6c 0a 2a 2a 20 62 65  will still.** be
45f0: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
4600: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
4610: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
4620: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
4630: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
4640: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
4650: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
4660: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
4670: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
4680: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
4690: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
46a0: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
46b0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
46c0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
46d0: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
46e0: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
46f0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
4700: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
4710: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
4720: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4730: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
4740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
4750: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
4760: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4770: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
4780: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
4790: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
47a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
47b0: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
47c0: 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ng */.  Table *p
47d0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
47e0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
47f0: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69  be sorted */.  i
4800: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
4810: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
4820: 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62   number for pTab
4830: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4840: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4850: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
4860: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
4870: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
4880: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
4890: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
48a0: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
48b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
48d0: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
48e0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
48f0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
4920: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ers */.  int sor
4930: 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  tOrder;         
4940: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 64        /* Which d
4950: 69 72 65 63 74 69 6f 6e 20 77 65 20 61 72 65 20  irection we are 
4960: 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  sorting */.  int
4970: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
4980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4990: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
49a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
49b0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
49c0: 2a 70 54 65 72 6d 3b 20 2f 2a 20 41 20 74 65 72  *pTerm; /* A ter
49d0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
49e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
49f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4a00: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
4a10: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
4a20: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
4a30: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
4a40: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
4a50: 3b 0a 0a 20 20 2f 2a 20 41 20 55 4e 49 51 55 45  ;..  /* A UNIQUE
4a60: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 66   index that is f
4a70: 75 6c 6c 79 20 73 70 65 63 69 66 69 65 64 20 69  ully specified i
4a80: 73 20 61 6c 77 61 79 73 20 61 20 73 6f 72 74 69  s always a sorti
4a90: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20  ng.  ** index.. 
4aa0: 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 2d 3e   */.  if( pIdx->
4ab0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
4ac0: 20 26 26 20 6e 45 71 43 6f 6c 3d 3d 70 49 64 78   && nEqCol==pIdx
4ad0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
4ae0: 20 2a 70 62 52 65 76 20 3d 20 30 3b 0a 20 20 20   *pbRev = 0;.   
4af0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
4b00: 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73    /* Match terms
4b10: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
4b20: 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20   clause against 
4b30: 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
4b40: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  the index..  */.
4b50: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
4b60: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
4b70: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 70 49 64  j<nTerm && i<pId
4b80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
4b90: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
4ba0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
4bb0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
4bc0: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
4bd0: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
4be0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
4bf0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
4c00: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
4c10: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
4c20: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
4c30: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
4c40: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
4c50: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
4c60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
4c70: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
4c80: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
4c90: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
4ca0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
4cb0: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
4cc0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
4cd0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
4ce0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4cf0: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
4d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
4d10: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
4d20: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
4d30: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
4d40: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  DfltColl;.    if
4d50: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
4d60: 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  !=pIdx->aiColumn
4d70: 5b 69 5d 20 7c 7c 20 70 43 6f 6c 6c 21 3d 70 49  [i] || pColl!=pI
4d80: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
4d90: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  l[i] ){.      /*
4da0: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
4db0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
4dc0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
4dd0: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
4de0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
4df0: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
4e00: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
4e10: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
4e20: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
4e30: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
4e40: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
4e50: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
4e60: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
4e70: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
4e80: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
4e90: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
4ea0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ec0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
4ed0: 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73  dex column fails
4ee0: 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73   to match and is
4ef0: 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
4f00: 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a   by ==.        *
4f10: 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78  * then the index
4f20: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
4f30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e  the ORDER BY con
4f40: 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20  straint..       
4f50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
4f60: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
4f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 6e 45    }.    if( i>nE
4f80: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  qCol ){.      if
4f90: 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ( pTerm->sortOrd
4fa0: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
4fb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
4fc0: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
4fd0: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
4fe0: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
4ff0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
5000: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5010: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
5020: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
5030: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
5040: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
5050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
5060: 72 74 4f 72 64 65 72 20 3d 20 70 54 65 72 6d 2d  rtOrder = pTerm-
5070: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
5080: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70  }.    j++;.    p
5090: 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  Term++;.  }..  /
50a0: 2a 20 54 68 65 20 69 6e 64 65 78 20 63 61 6e 20  * The index can 
50b0: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
50c0: 69 6e 67 20 69 66 20 61 6c 6c 20 74 65 72 6d 73  ing if all terms
50d0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
50e0: 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 6f 72 20   clause.  ** or 
50f0: 63 6f 76 65 72 65 64 20 6f 72 20 69 66 20 77 65  covered or if we
5100: 20 72 61 6e 20 6f 75 74 20 6f 66 20 69 6e 64 65   ran out of inde
5110: 78 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  x columns and th
5120: 65 20 69 74 20 69 73 20 61 20 55 4e 49 51 55 45  e it is a UNIQUE
5130: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a  .  ** index..  *
5140: 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d  /.  if( j>=nTerm
5150: 20 7c 7c 20 28 69 3e 3d 70 49 64 78 2d 3e 6e 43   || (i>=pIdx->nC
5160: 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 6f  olumn && pIdx->o
5170: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29  nError!=OE_None)
5180: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
5190: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
51a0: 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 20 20  TE_SO_DESC;.    
51b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
51c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
51d0: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
51e0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
51f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
5200: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
5210: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
5220: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
5230: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
5240: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
5250: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
5260: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
5270: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
5280: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
5290: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
52a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
52b0: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
52c0: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
52d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
52e0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
52f0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
5300: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5310: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
5320: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
5330: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ause */.  int *p
5340: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
5350: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
5360: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
5370: 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  C */.){.  Expr *
5380: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p;..  assert( pO
5390: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
53a0: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
53b0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20  >nExpr>0 );.  p 
53c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
53d0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 2d  .pExpr;.  if( p-
53e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
53f0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73  & p->iTable==bas
5400: 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
5410: 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  =-1 ){.    *pbRe
5420: 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  v = pOrderBy->a[
5430: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
5440: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
5450: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5460: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
5470: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
5480: 20 74 68 65 20 6c 6f 67 6f 72 69 74 68 6d 20 6f   the logorithm o
5490: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
54a0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
54b0: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
54c0: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
54d0: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
54e0: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
54f0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
5500: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  orming operating
5510: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
5520: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
5530: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
5540: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
5550: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
5560: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
5570: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
5580: 74 6c 65 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 57  tle off..**.** W
5590: 65 20 63 61 6e 20 61 73 73 75 6d 65 20 4e 3e 3d  e can assume N>=
55a0: 31 2e 30 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 64  1.0;.*/.static d
55b0: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
55c0: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
55d0: 20 6c 6f 67 4e 20 3d 20 31 2e 30 3b 0a 20 20 64   logN = 1.0;.  d
55e0: 6f 75 62 6c 65 20 78 20 3d 20 31 30 2e 30 3b 0a  ouble x = 10.0;.
55f0: 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
5600: 20 20 20 20 6c 6f 67 4e 20 3d 20 6c 6f 67 4e 2b      logN = logN+
5610: 31 2e 30 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  1.0;.    x *= 10
5620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
5630: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ogN;.}../*.** Fi
5640: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  nd the best inde
5650: 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  x for accessing 
5660: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
5670: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
5680: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
5690: 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61  index, flags tha
56a0: 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74  t describe how t
56b0: 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
56c0: 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20  be used, the.** 
56d0: 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
56e0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ty constraints a
56f0: 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f  nd the "cost" fo
5700: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a  r this index..**
5710: 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63  .** The lowest c
5720: 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20  ost index wins. 
5730: 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20   The cost is an 
5740: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
5750: 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55  amount of.** CPU
5760: 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65   and disk I/O ne
5770: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
5780: 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20  e request using 
5790: 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64  the selected ind
57a0: 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  ex..** Factors t
57b0: 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
57c0: 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
57d0: 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
57e0: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
57f0: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
5800: 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
5810: 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
5820: 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
5830: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
5840: 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
5850: 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
5860: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
5870: 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
5880: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
5890: 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
58a0: 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
58b0: 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
58c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ble..**.*/.stati
58d0: 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64  c double bestInd
58e0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
58f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
5900: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
5910: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
5920: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
5930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5940: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5950: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5960: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
5970: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
5980: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
5990: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
59a0: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
59b0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
59c0: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
59d0: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
59e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
59f0: 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
5a00: 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61  The order by cla
5a10: 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  use */.  Index *
5a20: 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20  *ppIndex,       
5a30: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70       /* Make *pp
5a40: 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74  Index point to t
5a50: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f  he best index */
5a60: 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  .  int *pFlags, 
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a80: 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73 63  * Put flags desc
5a90: 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69  ribing this choi
5aa0: 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f  ce in *pFlags */
5ab0: 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20  .  int *pnEq    
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ad0: 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72  * Put the number
5ae0: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
5af0: 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f  straints here */
5b00: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
5b10: 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20  *pTerm;.  Index 
5b20: 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20  *bestIdx = 0;   
5b30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
5b40: 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f  hat gives the lo
5b50: 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64  west cost */.  d
5b60: 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74  ouble lowestCost
5b70: 20 3d 20 31 2e 30 65 39 39 3b 20 2f 2a 20 54 68   = 1.0e99; /* Th
5b80: 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
5b90: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
5ba0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20   bestFlags = 0; 
5bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
5bc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5bd0: 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69  h bestIdx */.  i
5be0: 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20  nt bestNEq = 0; 
5bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
5c00: 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71  st value for nEq
5c10: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
5c20: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
5c30: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
5c40: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5c50: 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
5c60: 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c80: 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
5c90: 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
5ca0: 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20  int rev;        
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5cc0: 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  rue to scan in r
5cd0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
5ce0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d00: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
5d10: 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f  d with pProbe */
5d20: 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
5d50: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
5d60: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
5d70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5d80: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69    /* Cost of usi
5d90: 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20  ng pProbe */..  
5da0: 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65  TRACE(("bestInde
5db0: 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61  x: tbl=%s notRea
5dc0: 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e  dy=%x\n", pSrc->
5dd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74  pTab->zName, not
5de0: 52 65 61 64 79 29 29 3b 0a 0a 20 20 2f 2a 20 43  Ready));..  /* C
5df0: 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64  heck for a rowid
5e00: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
5e10: 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69  N (...) constrai
5e20: 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  nts.  */.  pTerm
5e30: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
5e40: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
5e50: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
5e60: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
5e70: 6d 20 29 7b 0a 20 20 20 20 2a 70 70 49 6e 64 65  m ){.    *ppInde
5e80: 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46  x = 0;.    bestF
5e90: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
5ea0: 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70  ID_EQ;.    if( p
5eb0: 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26  Term->operator &
5ec0: 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20   WO_EQ ){.      
5ed0: 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c  /* Rowid== is al
5ee0: 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69  ways the best pi
5ef0: 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72  ck.  Look no fur
5f00: 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f  ther.  Because o
5f10: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  nly.      ** a s
5f20: 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e  ingle row is gen
5f30: 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69  erated, output i
5f40: 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74  s always in sort
5f50: 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
5f60: 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52    *pFlags = WHER
5f70: 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20  E_ROWID_EQ;.    
5f80: 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20    *pnEq = 1;.   
5f90: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5fa0: 29 20 2a 70 46 6c 61 67 73 20 7c 3d 20 57 48 45  ) *pFlags |= WHE
5fb0: 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
5fc0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65    TRACE(("... be
5fd0: 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29  st is rowid\n"))
5fe0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
5ff0: 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .0;.    }else if
6000: 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f  ( pTerm->operato
6010: 72 20 26 20 57 4f 5f 4c 49 53 54 20 29 7b 0a 20  r & WO_LIST ){. 
6020: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e       /* Rowid IN
6030: 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73   (LIST): cost is
6040: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
6050: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6060: 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c  list.      ** el
6070: 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20  ements.  */.    
6080: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70    lowestCost = p
6090: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  Term->pExpr->pLi
60a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
60b0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65   lowestCost *= e
60c0: 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74  stLog(lowestCost
60d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
60e0: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
60f0: 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69  (SELECT): cost i
6100: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
6110: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
6120: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69   rows.      ** i
6130: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
6140: 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74  the inner select
6150: 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61  .  We have no wa
6160: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20  y to estimate.  
6170: 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75      ** that valu
6180: 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64  e so make a wild
6190: 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20   guess. */.     
61a0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30   lowestCost = 20
61b0: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  0.0;.    }.    T
61c0: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
61d0: 20 49 4e 20 63 6f 73 74 3a 20 25 67 5c 6e 22 2c   IN cost: %g\n",
61e0: 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20   lowestCost));. 
61f0: 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74   }..  /* Estimat
6200: 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
6210: 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20  table scan.  If 
6220: 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68  we do not know h
6230: 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74  ow many.  ** ent
6240: 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ries are in the 
6250: 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c  table, use 1 mil
6260: 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e  lion as a guess.
6270: 0a 20 20 2a 2f 0a 20 20 70 50 72 6f 62 65 20 3d  .  */.  pProbe =
6280: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
6290: 64 65 78 3b 0a 20 20 63 6f 73 74 20 3d 20 70 50  dex;.  cost = pP
62a0: 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61  robe ? pProbe->a
62b0: 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30  iRowEst[0] : 100
62c0: 30 30 30 30 2e 30 3b 0a 20 20 54 52 41 43 45 28  0000.0;.  TRACE(
62d0: 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e  ("... table scan
62e0: 20 62 61 73 65 20 63 6f 73 74 3a 20 25 67 5c 6e   base cost: %g\n
62f0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61  ", cost));.  fla
6300: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
6310: 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68  _RANGE;..  /* Ch
6320: 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  eck for constrai
6330: 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f  nts on a range o
6340: 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61  f rowids in a ta
6350: 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20  ble scan..  */. 
6360: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
6370: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
6380: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
6390: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
63a0: 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  GE, 0);.  if( pT
63b0: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66  erm ){.    if( f
63c0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
63d0: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
63e0: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
63f0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
6400: 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
6410: 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2a  IT;.      cost *
6420: 3d 20 30 2e 33 33 33 3b 20 20 2f 2a 20 47 75 65  = 0.333;  /* Gue
6430: 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58  ss that rowid<EX
6440: 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77  PR eliminates tw
6450: 6f 2d 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73  o-thirds or rows
6460: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
6470: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
6480: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
6490: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
64a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61   0) ){.      fla
64b0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
64c0: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73  LIMIT;.      cos
64d0: 74 20 2a 3d 20 30 2e 33 33 33 3b 20 20 2f 2a 20  t *= 0.333;  /* 
64e0: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
64f0: 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  >EXPR eliminates
6500: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72   two-thirds of r
6510: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
6520: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77   TRACE(("... row
6530: 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  id range reduces
6540: 20 63 6f 73 74 20 74 6f 20 25 67 5c 6e 22 2c 20   cost to %g\n", 
6550: 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  cost));.  }else{
6560: 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a  .    flags = 0;.
6570: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
6580: 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73   table scan does
6590: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
65a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
65b0: 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20  , increase.  ** 
65c0: 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67  the cost by Nlog
65d0: 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65  N to cover the e
65e0: 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e  xpense of sortin
65f0: 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  g. */.  if( pOrd
6600: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
6610: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
6620: 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
6630: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66  &rev) ){.      f
6640: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
6650: 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
6660: 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69  D_RANGE;.      i
6670: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
6680: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
6690: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
66a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
66b0: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
66c0: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
66d0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
66e0: 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
66f0: 73 20 63 6f 73 74 20 74 6f 20 25 67 5c 6e 22 2c  s cost to %g\n",
6700: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   cost));.    }. 
6710: 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f   }.  if( cost<lo
6720: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
6730: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
6740: 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73  t;.    bestFlags
6750: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
6760: 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68   /* Look at each
6770: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
6780: 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72  or(; pProbe; pPr
6790: 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
67a0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20  t){.    int i;  
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
67d0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62  nter */.    doub
67e0: 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20  le inMultiplier 
67f0: 3d 20 31 2e 30 3b 0a 0a 20 20 20 20 54 52 41 43  = 1.0;..    TRAC
6800: 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73  E(("... index %s
6810: 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  :\n", pProbe->zN
6820: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
6830: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6840: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
6850: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
6860: 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a   satisfied.    *
6870: 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73  * by x=EXPR cons
6880: 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20  traints or x IN 
6890: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
68a0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c  s..    */.    fl
68b0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
68c0: 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e  (i=0; i<pProbe->
68d0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
68e0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
68f0: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  obe->aiColumn[i]
6900: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
6910: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
6920: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
6930: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50   WO_EQ|WO_IN, pP
6940: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
6950: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
6960: 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  k;.      flags |
6970: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
6980: 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
6990: 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57  rm->operator & W
69a0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
69b0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
69c0: 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
69d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65    if( pTerm->ope
69e0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 45 4c 45 43  rator & WO_SELEC
69f0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  T ){.          i
6a00: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 31  nMultiplier *= 1
6a10: 30 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  00.0;.        }e
6a20: 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f  lse if( pTerm->o
6a30: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 49 53  perator & WO_LIS
6a40: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  T ){.          i
6a50: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70  nMultiplier *= p
6a60: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  Term->pExpr->pLi
6a70: 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 2e 30 3b  st->nExpr + 1.0;
6a80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73   }.    }.    cos
6aa0: 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
6ab0: 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74  wEst[i] * inMult
6ac0: 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28  iplier * estLog(
6ad0: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20  inMultiplier);. 
6ae0: 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20     nEq = i;.    
6af0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e  TRACE(("...... n
6b00: 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 67 20  Eq=%d inMult=%g 
6b10: 63 6f 73 74 3d 25 67 5c 6e 22 2c 20 6e 45 71 2c  cost=%g\n", nEq,
6b20: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63   inMultiplier, c
6b30: 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ost));..    /* L
6b40: 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f  ook for range co
6b50: 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f  nstraints.    */
6b60: 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
6b70: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
6b80: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
6b90: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
6ba0: 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
6bb0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
6bc0: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
6bd0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
6be0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
6bf0: 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
6c00: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  pTerm ){.       
6c10: 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43   flags = WHERE_C
6c20: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
6c30: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
6c40: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
6c50: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
6c60: 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_LE, pProbe) )
6c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
6c80: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
6c90: 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
6ca0: 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 0a 20  cost *= 0.333;. 
6cb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6cc0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
6cd0: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
6ce0: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
6cf0: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
6d00: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
6d10: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
6d20: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
6d30: 20 2a 3d 20 30 2e 33 33 33 3b 0a 20 20 20 20 20   *= 0.333;.     
6d40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
6d50: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
6d60: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
6d70: 6f 20 25 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  o %g\n", cost));
6d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6d90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61      /* Add the a
6da0: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f  dditional cost o
6db0: 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61  f sorting if tha
6dc0: 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20  t is a factor.. 
6dd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
6de0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6df0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
6e00: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
6e10: 20 26 26 0a 20 20 20 20 20 20 20 20 69 73 53 6f   &&.        isSo
6e20: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
6e30: 65 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  e, pProbe, pSrc-
6e40: 3e 70 54 61 62 2c 20 69 43 75 72 2c 20 70 4f 72  >pTab, iCur, pOr
6e50: 64 65 72 42 79 2c 20 6e 45 71 2c 20 26 72 65 76  derBy, nEq, &rev
6e60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
6e70: 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20   flags==0 ){.   
6e80: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
6e90: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
6ea0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
6eb0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
6ec0: 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
6ed0: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
6ee0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
6ef0: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
6f00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6f20: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
6f30: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
6f40: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e      TRACE(("....
6f50: 2e 2e 20 6f 72 64 65 72 62 79 20 72 65 64 75 63  .. orderby reduc
6f60: 65 73 20 63 6f 73 74 20 74 6f 20 25 67 5c 6e 22  es cost to %g\n"
6f70: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
6f80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
6f90: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
6fa0: 77 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20  we can get away 
6fb0: 77 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20  with using just 
6fc0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75  the index withou
6fd0: 74 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65  t.    ** ever re
6fe0: 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ading the table.
6ff0: 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
7000: 20 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76   case, then halv
7010: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  e the.    ** cos
7020: 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  t of this index.
7030: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7040: 66 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63  flags && pSrc->c
7050: 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d  olUsed < (((Bitm
7060: 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
7070: 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
7080: 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
7090: 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
70a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
70b0: 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   j<pProbe->nColu
70c0: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
70d0: 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65    int x = pProbe
70e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
70f0: 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
7100: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
7110: 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
7120: 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
7130: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7140: 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
7150: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
7160: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
7170: 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e        cost *= 0.
7180: 35 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  5;.        TRACE
7190: 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e  (("...... idx-on
71a0: 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ly reduces cost 
71b0: 74 6f 20 25 67 5c 6e 22 2c 20 63 6f 73 74 29 29  to %g\n", cost))
71c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
71d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
71e0: 69 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76  index has achiev
71f0: 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ed the lowest co
7200: 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20  st so far, then 
7210: 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
7220: 20 20 20 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f     if( cost < lo
7230: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
7240: 20 20 62 65 73 74 49 64 78 20 3d 20 70 50 72 6f    bestIdx = pPro
7250: 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74  be;.      lowest
7260: 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
7270: 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20     if( flags==0 
7280: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
7290: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
72a0: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20  RANGE;.      }. 
72b0: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
72c0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65   flags;.      be
72d0: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
72e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
72f0: 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
7300: 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e  ult.  */.  *ppIn
7310: 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20  dex = bestIdx;. 
7320: 20 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e   TRACE(("best in
7330: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
7340: 25 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45  %g, flags=%x, nE
7350: 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  q=%d\n",.       
7360: 20 62 65 73 74 49 64 78 20 3f 20 62 65 73 74 49   bestIdx ? bestI
7370: 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f  dx->zName : "(no
7380: 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74  ne)", lowestCost
7390: 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73  , bestFlags, bes
73a0: 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67  tNEq));.  *pFlag
73b0: 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20  s = bestFlags;. 
73c0: 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71   *pnEq = bestNEq
73d0: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73  ;.  return lowes
73e0: 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tCost;.}.../*.**
73f0: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
7400: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
7410: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
7420: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
7430: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
7440: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
7450: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
7460: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
7470: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
7480: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
7490: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
74a0: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
74b0: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
74c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
74d0: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
74e0: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
74f0: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
7500: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
7510: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
7520: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
7530: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
7540: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
7550: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
7560: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
7570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
7580: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
7590: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
75a0: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
75b0: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
75c0: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
75d0: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
75e0: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
75f0: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
7600: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
7610: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
7620: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
7630: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
7640: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
7650: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
7660: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
7670: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
7680: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
7690: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
76a0: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
76b0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
76c0: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
76d0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
76e0: 69 6f 6e 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  ion.  We would g
76f0: 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  et the correct.*
7700: 2a 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  * results if not
7710: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
7720: 69 73 61 62 6c 65 64 2c 20 62 75 74 20 6a 6f 69  isabled, but joi
7730: 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
7740: 69 74 74 6c 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e  ittle.** slower.
7750: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
7760: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
7770: 68 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  h as we can with
7780: 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 0a 2a 2a  out disabling.**
7790: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
77a0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
77b0: 29 2c 20 77 65 27 64 20 67 65 74 20 74 68 65 20  ), we'd get the 
77c0: 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 0a 2a 2a  wrong answer..**
77d0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
77e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
77f0: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
7800: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
7810: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7820: 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
7830: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
7840: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
7850: 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
7860: 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
7870: 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
7880: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
7890: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
78a0: 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
78b0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
78c0: 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
78d0: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 74 6e  f( pTerm->iPartn
78e0: 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  er>=0 ){.      d
78f0: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
7900: 6c 2c 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  l, &pTerm->pWC->
7910: 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 74 6e 65  a[pTerm->iPartne
7920: 72 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r]);.    }.  }.}
7930: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7940: 20 63 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64   code that build
7950: 73 20 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e  s a probe for an
7960: 20 69 6e 64 65 78 2e 20 20 44 65 74 61 69 6c 73   index.  Details
7970: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68  :.**.**    *  Ch
7980: 65 63 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c  eck the top nCol
7990: 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20 74  umn entries on t
79a0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 61 6e  he stack.  If an
79b0: 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  y.**       of th
79c0: 6f 73 65 20 65 6e 74 72 69 65 73 20 61 72 65 20  ose entries are 
79d0: 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  NULL, jump immed
79e0: 69 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a  iately to brk,.*
79f0: 2a 20 20 20 20 20 20 20 77 68 69 63 68 20 69 73  *       which is
7a00: 20 74 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20   the loop exit, 
7a10: 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20 65  since no index e
7a20: 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a  ntry will match.
7a30: 2a 2a 20 20 20 20 20 20 20 69 66 20 61 6e 79 20  **       if any 
7a40: 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
7a50: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  is NULL..**.**  
7a60: 20 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61    *  Construct a
7a70: 20 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f   probe entry fro
7a80: 6d 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d  m the top nColum
7a90: 6e 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  n entries in.** 
7aa0: 20 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20        the stack 
7ab0: 77 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20  with affinities 
7ac0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7ad0: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73  index pIdx..*/.s
7ae0: 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c 64  tatic void build
7af0: 49 6e 64 65 78 50 72 6f 62 65 28 56 64 62 65 20  IndexProbe(Vdbe 
7b00: 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  *v, int nColumn,
7b10: 20 69 6e 74 20 62 72 6b 2c 20 49 6e 64 65 78 20   int brk, Index 
7b20: 2a 70 49 64 78 29 7b 0a 20 20 73 71 6c 69 74 65  *pIdx){.  sqlite
7b30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7b40: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75  _NotNull, -nColu
7b50: 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  mn, sqlite3VdbeC
7b60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
7b70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
7b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
7b90: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73  nColumn, 0);.  s
7ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7bb0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62  v, OP_Goto, 0, b
7bc0: 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rk);.  sqlite3Vd
7bd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
7be0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
7bf0: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
7c00: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
7c10: 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f  (v, pIdx);.}.../
7c20: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7c30: 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
7c40: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
7c50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7c60: 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
7c70: 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
7c80: 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
7c90: 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
7ca0: 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
7cb0: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
7cc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
7cd0: 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
7ce0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
7cf0: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
7d00: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
7d10: 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
7d20: 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
7d30: 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
7d40: 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
7d50: 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
7d60: 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
7d70: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
7d80: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
7d90: 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
7da0: 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
7db0: 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
7dc0: 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
7dd0: 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
7de0: 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
7df0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71  atic void codeEq
7e00: 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
7e10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7e20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7e30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
7e40: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
7e50: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
7e60: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7e70: 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
7e80: 0a 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20  .  int brk,     
7e90: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
7ea0: 65 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  ere to abandon t
7eb0: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  he loop */.  Whe
7ec0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
7ed0: 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
7ee0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
7ef0: 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
7f00: 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72   on */.){.  Expr
7f10: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
7f20: 78 70 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  xpr;.  if( pX->o
7f30: 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p!=TK_IN ){.    
7f40: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
7f50: 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c  TK_EQ );.    sql
7f60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
7f70: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
7f80: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7f90: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7fa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7fb0: 69 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61  iTab;.    int *a
7fc0: 49 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  In;.    Vdbe *v 
7fd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7fe0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ..    sqlite3Cod
7ff0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
8000: 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62  e, pX);.    iTab
8010: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
8020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8030: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
8040: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
8050: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
8060: 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e  , "# %.*s", pX->
8070: 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e  span.n, pX->span
8080: 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  .z));.    pLevel
8090: 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  ->nIn++;.    pLe
80a0: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 61  vel->aInLoop = a
80b0: 49 6e 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  In = sqliteReall
80c0: 6f 63 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f  oc(pLevel->aInLo
80d0: 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
8100: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  el->aInLoop[0])*
8110: 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a  3*pLevel->nIn);.
8120: 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20      if( aIn ){. 
8130: 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76       aIn += pLev
8140: 65 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20  el->nIn*3 - 3;. 
8150: 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 4f 50       aIn[0] = OP
8160: 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 49 6e  _Next;.      aIn
8170: 5b 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  [1] = iTab;.    
8180: 20 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c 69 74    aIn[2] = sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
81a0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
81b0: 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
81c0: 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
81d0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
81e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
81f0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
8200: 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
8210: 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
8220: 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
8230: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c   index.  The val
8240: 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ues for all cons
8250: 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74  traints are left
8260: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
8270: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
8280: 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
8290: 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
82a0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
82b0: 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
82c0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
82d0: 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
82e0: 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
82f0: 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
8300: 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
8310: 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
8320: 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
8330: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
8340: 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
8350: 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
8360: 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
8370: 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
8380: 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
8390: 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
83a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
83b0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
83c0: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
83d0: 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
83e0: 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
83f0: 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
8400: 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
8410: 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20   left.** on the 
8420: 73 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65  stack - a is the
8430: 20 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74   deepest and b t
8440: 68 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a  he shallowest..*
8450: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
8460: 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
8470: 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
8480: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
8490: 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
84a0: 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
84b0: 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
84c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
84d0: 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
84e0: 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
84f0: 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
8500: 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
8510: 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
8520: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8530: 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f  tine always allo
8540: 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f  cates at least o
8550: 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  ne memory cell a
8560: 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61  nd puts.** the a
8570: 64 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d  ddress of that m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c  emory cell in pL
8590: 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65  evel->iMem.  The
85a0: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
85b0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
85c0: 20 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c   will use pLevel
85d0: 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20  ->iMem to store 
85e0: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
85f0: 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
8600: 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
8610: 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
8620: 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
8630: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
8640: 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
8650: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
8660: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
8670: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
8680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8690: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
86a0: 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
86b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
86c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
86d0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
86e0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
86f0: 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
8700: 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
8710: 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
8720: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
8730: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
8740: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
8750: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
8760: 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70  ,     /* Which p
8770: 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76  arts of FROM hav
8780: 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
8790: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72  oded */.  int br
87a0: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
87b0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
87c0: 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  end the loop */.
87d0: 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  ){.  int nEq = p
87e0: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20  Level->nEq;     
87f0: 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
8800: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
8810: 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
8820: 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49   */.  int termsI
8830: 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  nMem = 0;       
8840: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
8850: 73 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d  store value in m
8860: 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  em[] cells */.  
8870: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
8880: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
8890: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
88a0: 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
88b0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
88c0: 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
88d0: 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68  l->pIdx;   /* Th
88e0: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
88f0: 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
8900: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
8910: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
8920: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
8930: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
8940: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
8950: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
8960: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
8970: 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
8980: 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
89b0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
89c0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
89d0: 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
89e0: 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
89f0: 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a  ocate them..  **
8a00: 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20   We always need 
8a10: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65  at least one use
8a20: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c  d to store the l
8a30: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20  oop terminator. 
8a40: 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74   ** value.  If t
8a50: 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72  here are IN oper
8a60: 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64  ators we'll need
8a70: 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d   one for each ==
8a80: 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73   or.  ** IN cons
8a90: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70  traint..  */.  p
8aa0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
8ab0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
8ac0: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
8ad0: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
8ae0: 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _IN ){.    pPars
8af0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65  e->nMem += pLeve
8b00: 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d  l->nEq;.    term
8b10: 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a  sInMem = 1;.  }.
8b20: 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
8b30: 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
8b40: 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66  traints.  */.  f
8b50: 6f 72 28 6a 3d 30 3b 20 31 3b 20 6a 2b 2b 29 7b  or(j=0; 1; j++){
8b60: 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
8b70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
8b80: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
8b90: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
8ba0: 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  k, notReady, WO_
8bb0: 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b  EQ|WO_IN, pIdx);
8bc0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  .    if( pTerm==
8bd0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  0 ) break;.    a
8be0: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
8bf0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
8c00: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  D)==0 );.    cod
8c10: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
8c20: 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b  arse, pTerm, brk
8c30: 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69  , pLevel);.    i
8c40: 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b  f( termsInMem ){
8c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8c60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
8c70: 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
8c80: 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20  iMem+j+1, 1);.  
8c90: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
8ca0: 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f  ( j==nEq );..  /
8cb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
8cc0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  the constraint v
8cd0: 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68 65  alues are on the
8ce0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
8cf0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65 72  k.  */.  if( ter
8d00: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66  msInMem ){.    f
8d10: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
8d20: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
8d30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8d40: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
8d50: 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b  l->iMem+j+1, 0);
8d60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
8d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8d80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8d90: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
8da0: 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
8db0: 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
8dc0: 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
8dd0: 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
8de0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
8df0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
8e00: 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
8e10: 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
8e20: 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
8e30: 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
8e40: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
8e50: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
8e60: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
8e70: 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
8e80: 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
8e90: 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
8ea0: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
8eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
8ec0: 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
8ed0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
8ee0: 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
8ef0: 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
8f00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
8f10: 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  T */..../*.** Ge
8f20: 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
8f30: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
8f40: 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
8f50: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
8f60: 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
8f70: 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
8f80: 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
8f90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8fa0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
8fb0: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
8fc0: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
8fd0: 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
8fe0: 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
8ff0: 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
9000: 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
9010: 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
9020: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
9030: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
9040: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
9050: 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
9060: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
9070: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
9080: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
9090: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
90a0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
90b0: 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
90c0: 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
90d0: 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
90e0: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
90f0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9100: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
9110: 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
9120: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
9130: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
9140: 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
9150: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
9160: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
9170: 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
9180: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
9190: 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
91a0: 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
91b0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
91c0: 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
91d0: 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
91e0: 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
91f0: 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
9200: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
9210: 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
9220: 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
9230: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
9240: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
9250: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
9260: 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
9270: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
9280: 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
9290: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
92a0: 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
92b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
92c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
92f0: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
9300: 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
9320: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
9330: 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
9340: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
9350: 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
9360: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
9370: 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
9380: 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
9390: 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
93a0: 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
93b0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
93c0: 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
93d0: 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
93e0: 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
93f0: 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
9400: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
9410: 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
9420: 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
9430: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
9440: 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
9450: 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
9460: 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
9470: 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
9480: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
9490: 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
94a0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
94b0: 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
94c0: 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
94d0: 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
94e0: 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
94f0: 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
9500: 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
9510: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
9520: 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
9530: 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
9540: 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
9550: 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
9560: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
9570: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
9580: 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
9590: 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
95a0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
95b0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
95c0: 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
95d0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
95e0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
95f0: 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
9600: 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
9610: 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
9620: 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
9630: 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
9640: 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
9650: 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
9660: 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
9670: 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
9680: 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
9690: 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
96a0: 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
96b0: 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
96c0: 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
96d0: 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
96e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
96f0: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
9700: 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
9710: 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
9720: 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
9730: 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
9740: 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
9750: 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
9760: 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
9770: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
9780: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
9790: 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
97a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
97b0: 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
97c0: 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
97d0: 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
97e0: 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
97f0: 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
9800: 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
9810: 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
9820: 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
9830: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
9840: 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
9850: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
9860: 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
9870: 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
9880: 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
9890: 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
98a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
98b0: 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
98c0: 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
98d0: 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
98e0: 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
98f0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
9900: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
9910: 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
9920: 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
9930: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9940: 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
9950: 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
9960: 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
9970: 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
9980: 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
9990: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
99a0: 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
99b0: 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
99c0: 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
99d0: 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
99e0: 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
99f0: 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
9a00: 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
9a10: 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
9a20: 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
9a30: 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
9a40: 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
9a50: 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
9a60: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
9a70: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
9a80: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
9a90: 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
9aa0: 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
9ab0: 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
9ac0: 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
9ad0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
9ae0: 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
9af0: 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
9b00: 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
9b10: 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
9b20: 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
9b30: 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
9b40: 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
9b50: 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
9b60: 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
9b70: 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
9b80: 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
9b90: 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
9ba0: 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
9bb0: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
9bc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
9bd0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
9be0: 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
9bf0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
9c00: 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
9c10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
9c20: 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
9c30: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
9c40: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
9c50: 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
9c60: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
9c70: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
9c80: 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
9c90: 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
9ca0: 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
9cb0: 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
9cc0: 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
9cd0: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
9ce0: 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
9cf0: 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
9d00: 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
9d10: 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
9d20: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
9d30: 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
9d40: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
9d50: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
9d60: 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
9d70: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
9d80: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
9d90: 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
9da0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
9db0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
9dc0: 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
9dd0: 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
9de0: 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
9df0: 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
9e00: 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
9e10: 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
9e20: 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
9e30: 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
9e40: 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
9e50: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
9e60: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
9e70: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
9e80: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
9e90: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
9ea0: 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
9eb0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
9ec0: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
9ed0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
9ee0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
9ef0: 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20  **ppOrderBy  /* 
9f00: 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
9f10: 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  se, or NULL */.)
9f20: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
9f50: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
9f60: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
9f70: 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
9f80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
9f90: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
9fa0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
9fb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
9fc0: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
9fd0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
9fe0: 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e  /.  int brk, con
9ff0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
a000: 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64  * Addresses used
a010: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
a020: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  eration */.  Bit
a030: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
a040: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
a050: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
a060: 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
a070: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
a080: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
a090: 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
a0a0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
a0b0: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  use */.  ExprMas
a0c0: 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20 20  kSet maskSet;   
a0d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
a0e0: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
a0f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a100: 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  wc;            /
a110: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
a120: 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  se is divided in
a130: 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20 2a  to these terms *
a140: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
a150: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
a160: 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20  m;  /* A single 
a170: 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c  entry from pTabL
a180: 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ist */.  WhereLe
a190: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
a1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
a1b0: 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74 68  ngle level in th
a1c0: 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f  e pWInfo list */
a1d0: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20  .  int iFrom;   
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
a200: 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ed FROM clause e
a210: 6c 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  lement */..  /* 
a220: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
a230: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
a240: 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
a250: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
a260: 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
a270: 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
a280: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
a290: 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
a2a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a2b0: 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
a2c0: 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
a2d0: 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
a2e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a2f0: 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
a300: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
a310: 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
a320: 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
a330: 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
a340: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
a350: 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
a360: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
a370: 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73  initMaskSet(&mas
a380: 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
a390: 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50  auseInit(&wc, pP
a3a0: 61 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53 70  arse);.  whereSp
a3b0: 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 29  lit(&wc, pWhere)
a3c0: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.    .  /* Allo
a3d0: 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
a3e0: 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
a3f0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
a400: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
a410: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
a420: 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  ue..  */.  pWInf
a430: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
a440: 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  ( sizeof(WhereIn
a450: 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e  fo) + pTabList->
a460: 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72  nSrc*sizeof(Wher
a470: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20  eLevel));.  if( 
a480: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
a490: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
a4a0: 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
a4b0: 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  m;.  }.  pWInfo-
a4c0: 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
a4d0: 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
a4e0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
a4f0: 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
a500: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
a510: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
a520: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
a530: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
a540: 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
a550: 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
a560: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
a570: 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
a580: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
a590: 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
a5a0: 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
a5b0: 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73  here && (pTabLis
a5c0: 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71  t->nSrc==0 || sq
a5d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a5e0: 61 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a  ant(pWhere)) ){.
a5f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a600: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
a610: 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
a620: 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70  Break, 1);.    p
a630: 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
a640: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
a650: 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
a660: 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
a670: 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
a680: 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
a690: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
a6a0: 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
a6b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
a6c0: 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
a6d0: 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
a6e0: 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
a6f0: 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
a700: 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
a710: 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
a720: 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
a730: 74 68 61 74 20 74 68 65 79 20 61 64 64 65 64 20  that they added 
a740: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
a750: 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
a760: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
a770: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
a780: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
a790: 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53  reateMask(&maskS
a7a0: 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
a7b0: 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
a7c0: 0a 20 20 66 6f 72 28 69 3d 77 63 2e 6e 54 65 72  .  for(i=wc.nTer
a7d0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
a7e0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
a7f0: 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b  (pTabList, &mask
a800: 53 65 74 2c 20 26 77 63 2e 61 5b 69 5d 29 3b 0a  Set, &wc.a[i]);.
a810: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
a820: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
a830: 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
a840: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
a850: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
a860: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
a870: 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
a880: 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
a890: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
a8a0: 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
a8b0: 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
a8c0: 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
a8d0: 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
a8e0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c    pWInfo->a[].fl
a8f0: 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78 78  ags     WHERE_xx
a900: 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
a910: 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
a920: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
a930: 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
a940: 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
a950: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
a960: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
a970: 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e 20  .iFrom     When 
a980: 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
a990: 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67   clause is being
a9a0: 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57   coded.  **   pW
a9b0: 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75  Info->a[].iTabCu
a9c0: 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
a9d0: 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
a9e0: 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20  base table.  ** 
a9f0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49    pWInfo->a[].iI
aa00: 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45  dxCur   The VDBE
aa10: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
aa20: 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20  index.  **.  ** 
aa30: 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
aa40: 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
aa50: 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
aa60: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
aa70: 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
aa80: 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
aa90: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
aaa0: 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62   pTabItem = pTab
aab0: 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65  List->a;.  pLeve
aac0: 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
aad0: 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
aae0: 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
aaf0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
ab00: 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
ab10: 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  +){.    Index *p
ab20: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
ab30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
ab40: 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70   FROM table at p
ab50: 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69  TabItem */.    i
ab60: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
ab70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
ab80: 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20  ags asssociated 
ab90: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20  with pIdx */.   
aba0: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
abc0: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
abd0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
abe0: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73  /.    double cos
abf0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
ac00: 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f    /* The cost fo
ac10: 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e  r pIdx */.    in
ac20: 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
ac30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
ac40: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52   looping over FR
ac50: 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  OM tables */.   
ac60: 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
ac70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
ac80: 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73  The best index s
ac90: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
aca0: 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20    int bestFlags 
acb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
acc0: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
acd0: 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a  d with pBest */.
ace0: 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20      int bestNEq 
acf0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ad00: 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65  /* nEq associate
ad10: 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a  d with pBest */.
ad20: 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73      double lowes
ad30: 74 43 6f 73 74 20 3d 20 31 2e 30 65 39 39 3b 20  tCost = 1.0e99; 
ad40: 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70  /* Cost of the p
ad50: 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
ad60: 62 65 73 74 4a 3b 20 20 20 20 20 20 20 20 20 20  bestJ;          
ad70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
ad80: 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
ad90: 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
adb0: 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
adc0: 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
add0: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
ade0: 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
adf0: 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
ae00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
ae10: 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
ae20: 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
ae30: 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
ae40: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
ae50: 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
ae60: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
ae70: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
ae80: 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
ae90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
aea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
aeb0: 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28  ost = bestIndex(
aec0: 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61  pParse, &wc, pTa
aed0: 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
aee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aef0: 20 20 20 20 20 20 20 20 28 6a 3d 3d 30 20 26 26          (j==0 &&
af00: 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70   ppOrderBy) ? *p
af10: 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20  pOrderBy : 0,.  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61       &pIdx, &fla
af40: 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20  gs, &nEq);.     
af50: 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
af60: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
af70: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
af80: 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  t;.        pBest
af90: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
afa0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
afb0: 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  gs;.        best
afc0: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  NEq = nEq;.     
afd0: 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
afe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
aff0: 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
b000: 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
b010: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 6a  0.         || (j
b020: 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
b030: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
b040: 54 5f 4c 45 46 54 29 21 3d 30 29 0a 20 20 20 20  T_LEFT)!=0).    
b050: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
b060: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b070: 7d 0a 20 20 20 20 69 66 28 20 62 65 73 74 46 6c  }.    if( bestFl
b080: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
b090: 52 42 59 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  RBY ){.      *pp
b0a0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
b0b0: 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66   }.    pLevel->f
b0c0: 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73  lags = bestFlags
b0d0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49  ;.    pLevel->pI
b0e0: 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20  dx = pBest;.    
b0f0: 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65  pLevel->nEq = be
b100: 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65  stNEq;.    pLeve
b110: 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a  l->aInLoop = 0;.
b120: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20      pLevel->nIn 
b130: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65  = 0;.    if( pBe
b140: 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  st ){.      pLev
b150: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
b160: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b180: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
b190: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
b1a0: 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
b1b0: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
b1c0: 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
b1d0: 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
b1e0: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62  Level->iFrom = b
b1f0: 65 73 74 4a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  estJ;.  }..  /* 
b200: 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
b210: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
b220: 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
b230: 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
b240: 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
b250: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
b260: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
b270: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
b280: 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
b290: 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
b2a0: 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c  ier Goto */.  pL
b2b0: 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
b2c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
b2d0: 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
b2e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
b2f0: 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
b300: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
b310: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78  ;.    Index *pIx
b320: 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  ;.    int iIdxCu
b330: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
b340: 43 75 72 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  Cur;..    pTabIt
b350: 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
b360: 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
b370: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
b380: 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
b390: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
b3a0: 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e  nsient || pTab->
b3b0: 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
b3c0: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  ue;.    if( (pLe
b3d0: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
b3e0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
b3f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b400: 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
b410: 69 6e 67 28 76 2c 20 70 54 61 62 49 74 65 6d 2d  ing(v, pTabItem-
b420: 3e 69 43 75 72 73 6f 72 2c 20 70 54 61 62 29 3b  >iCursor, pTab);
b430: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
b440: 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61  l->iTabCur = pTa
b450: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
b460: 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70      if( (pIx = p
b470: 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20  Level->pIdx)!=0 
b480: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b490: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b4a0: 49 6e 74 65 67 65 72 2c 20 70 49 78 2d 3e 69 44  Integer, pIx->iD
b4b0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  b, 0);.      Vdb
b4c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
b4d0: 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
b4e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b4f0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
b500: 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
b510: 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20   pIx->tnum,.    
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 28 63 68 61 72 2a 29 26 70 49 78 2d 3e 6b 65   (char*)&pIx->ke
b540: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
b550: 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  O);.    }.    if
b560: 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
b570: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
b580: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)!=0 ){.      s
b590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b5a0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
b5b0: 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49  mns, iIdxCur, pI
b5c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20  x->nColumn+1);. 
b5d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b5e0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
b5f0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
b600: 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
b610: 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
b620: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b630: 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  (v);..  /* Gener
b640: 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
b650: 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
b660: 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
b670: 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
b680: 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
b690: 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
b6a0: 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
b6b0: 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
b6c0: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
b6d0: 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
b6e0: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
b6f0: 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
b700: 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
b710: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
b720: 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
b730: 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20  j;.    int iCur 
b740: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
b750: 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  sor;  /* The VDB
b760: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
b770: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e   table */.    In
b780: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
b790: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
b7a0: 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
b7b0: 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
b7c0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
b7d0: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
b7e0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
b7f0: 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
b800: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
b810: 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
b820: 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  only */.    int 
b830: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
b840: 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
b850: 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
b860: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20  erse order */.. 
b870: 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
b880: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
b890: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69  l->iFrom];.    i
b8a0: 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
b8b0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49 64  iCursor;.    pId
b8c0: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
b8d0: 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
b8e0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
b8f0: 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c 65  .    bRev = (pLe
b900: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
b910: 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
b920: 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20      omitTable = 
b930: 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
b940: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
b950: 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  !=0;..    /* Cre
b960: 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
b970: 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
b980: 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
b990: 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f  ctions.    ** fo
b9a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
b9b0: 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b  op.  Jump to brk
b9c0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
b9d0: 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20   a loop..    ** 
b9e0: 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
b9f0: 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
ba00: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
ba10: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20  tion of the.    
ba20: 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  ** loop..    */.
ba30: 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c      brk = pLevel
ba40: 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  ->brk = sqlite3V
ba50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ba60: 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76  .    cont = pLev
ba70: 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74  el->cont = sqlit
ba80: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ba90: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  v);..    /* If t
baa0: 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
bab0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
bac0: 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
bad0: 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a  ocate and.    **
bae0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
baf0: 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
bb00: 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
bb10: 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
bb20: 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  .    ** row of t
bb30: 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
bb40: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a   the join..    *
bb50: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
bb60: 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
bb70: 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74  abItem[-1].joint
bb80: 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
bb90: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
bba0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70  pParse->nMem ) p
bbb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
bbc0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65       pLevel->iLe
bbd0: 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d  ftJoin = pParse-
bbe0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73  >nMem++;.      s
bbf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bc00: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
bc10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bc30: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
bc40: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 31 29 3b  ->iLeftJoin, 1);
bc50: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
bc60: 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c  nt((v, "# init L
bc70: 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
bc80: 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d  h flag"));.    }
bc90: 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ..    if( pLevel
bca0: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
bcb0: 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
bcc0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65    /* Case 1:  We
bcd0: 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
bce0: 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
bcf0: 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
bd00: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
bd10: 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
bd20: 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
bd30: 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
bd40: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
bd50: 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
bd60: 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
bd70: 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
bd80: 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20  (...)".      ** 
bd90: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
bda0: 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
bdb0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
bdc0: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
bdd0: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
bde0: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
bdf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
be00: 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  m!=0 );.      as
be10: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
be20: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pr!=0 );.      a
be30: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65  ssert( pTerm->le
be40: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
be50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
be60: 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
be70: 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
be80: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
be90: 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65  Term, brk, pLeve
bea0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
beb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bec0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 62  _MustBeInt, 1, b
bed0: 72 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rk);.      sqlit
bee0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bef0: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
bf00: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 56  r, brk);.      V
bf10: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
bf20: 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65  pk"));.      pLe
bf30: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
bf40: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
bf50: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
bf60: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
bf70: 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  GE ){.      /* C
bf80: 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
bf90: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
bfa0: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
bfb0: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
bfc0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bfd0: 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
bfe0: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74  _Noop;.      int
bff0: 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57 68   start;.      Wh
c000: 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
c010: 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61   *pEnd;..      a
c020: 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
c030: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
c040: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
c050: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
c060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 61   ){.        pSta
c070: 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rt = findTerm(&w
c080: 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  c, iCur, -1, not
c090: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
c0a0: 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  GE, 0);.        
c0b0: 61 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d  assert( pStart!=
c0c0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0 );.      }else
c0d0: 7b 0a 20 20 20 20 20 20 20 20 70 53 74 61 72 74  {.        pStart
c0e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
c0f0: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
c100: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  flags & WHERE_TO
c110: 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
c120: 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
c130: 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31  rm(&wc, iCur, -1
c140: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
c150: 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
c160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
c170: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65  d!=0 );.      }e
c180: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45 6e  lse{.        pEn
c190: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 0;.      }. 
c1a0: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
c1b0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
c1c0: 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   pStart;.       
c1d0: 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
c1e0: 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
c1f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
c200: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
c210: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
c220: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
c230: 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
c240: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c250: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
c260: 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
c270: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
c280: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
c290: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c2a0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
c2b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c2c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c2d0: 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f  _ForceInt, pX->o
c2e0: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e  p==TK_LE || pX->
c2f0: 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b  op==TK_GT, brk);
c300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65  VdbeAddOp(v, bRe
c320: 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20  v ? OP_MoveLt : 
c330: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
c340: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56   brk);.        V
c350: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c360: 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64  pk"));.        d
c370: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
c380: 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
c390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3b0: 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  p(v, bRev ? OP_L
c3c0: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
c3d0: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
c3e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c3f0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45  End ){.        E
c400: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
c410: 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
c420: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
c430: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
c440: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
c450: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
c460: 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
c470: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c480: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
c490: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
c4a0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
c4b0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
c4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c4d0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
c4e0: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
c4f0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
c500: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
c510: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
c520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
c530: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
c540: 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
c550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c560: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
c570: 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
c580: 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Gt;.        }.  
c590: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
c5a0: 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
c5b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c5c0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
c5d0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c5e0: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
c5f0: 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
c600: 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
c610: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
c620: 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
c630: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
c640: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  ;.      if( test
c650: 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
c660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
c680: 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  wid, iCur, 0);. 
c690: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c6a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c6b0: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
c6c0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
c6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c6e0: 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27  p(v, testOp, 'n'
c6f0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
c700: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
c710: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
c720: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
c730: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
c740: 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
c750: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
c760: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
c770: 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
c780: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
c790: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
c7a0: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
c7b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
c7c0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
c7d0: 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
c7e0: 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
c7f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
c800: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
c810: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
c820: 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
c830: 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
c840: 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
c850: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
c860: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
c870: 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
c880: 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
c890: 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
c8a0: 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
c8b0: 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
c8c0: 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
c8d0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
c8e0: 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
c8f0: 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
c900: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
c910: 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
c920: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
c930: 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
c940: 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
c950: 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
c960: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
c970: 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
c980: 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
c990: 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
c9a0: 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
c9b0: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
c9c0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
c9d0: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
c9e0: 20 20 20 20 69 6e 74 20 6c 65 46 6c 61 67 3d 30      int leFlag=0
c9f0: 2c 20 67 65 46 6c 61 67 3d 30 3b 0a 20 20 20 20  , geFlag=0;.    
ca00: 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20    int testOp;.  
ca10: 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74      int topLimit
ca20: 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
ca30: 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
ca40: 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  MIT)!=0;.      i
ca50: 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70  nt btmLimit = (p
ca60: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
ca70: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
ca80: 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  =0;..      /* Ge
ca90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
caa0: 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
cab0: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
cac0: 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
cad0: 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74    ** and level t
cae0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
caf0: 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
cb00: 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
cb10: 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
cb20: 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
cb30: 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
cb40: 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a  notReady, brk);.
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63  .      /* Duplic
cb60: 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
cb70: 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63   term values bec
cb80: 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ause they will a
cb90: 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75  ll be.      ** u
cba0: 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20  sed twice: once 
cbb0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d  to make the term
cbc0: 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20  ination key and 
cbd0: 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  once to make the
cbe0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20  .      ** start 
cbf0: 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
cc00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
cc10: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; j++){.      
cc20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc30: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45  Op(v, OP_Dup, nE
cc40: 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  q-1, 0);.      }
cc50: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
cc60: 61 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ate the terminat
cc70: 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69  ion key.  This i
cc80: 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
cc90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  that.      ** wi
cca0: 6c 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63  ll end the searc
ccb0: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
ccc0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20  termination key 
ccd0: 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  if there.      *
cce0: 2a 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74  * are no equalit
ccf0: 79 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22  y terms and no "
cd00: 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20  X<..." term..   
cd10: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
cd20: 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61  002-Dec-04: On a
cd30: 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73   reverse-order s
cd40: 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c  can, the so-call
cd50: 65 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22  ed "termination"
cd60: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f  .      ** key co
cd70: 6d 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c  mputed here real
cd80: 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
cd90: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a   the start key..
cda0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
cdb0: 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20  f( topLimit ){. 
cdc0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
cdd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
cde0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
cdf0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
ce00: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
ce10: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
ce20: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
ce30: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
ce40: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
ce50: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
ce60: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
ce70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ce80: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
ce90: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
cea0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ceb0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cec0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
ced0: 20 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20         leFlag = 
cee0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20  pX->op==TK_LE;. 
cef0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
cf00: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  );.        testO
cf20: 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20  p = OP_IdxGE;.  
cf30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf40: 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e     testOp = nEq>
cf50: 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f  0 ? OP_IdxGE : O
cf60: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
cf70: 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  leFlag = 1;.    
cf80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
cf90: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
cfa0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
cfb0: 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
cfc0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  it;.        pLev
cfd0: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
cfe0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
cff0: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
d000: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c  be(v, nCol, brk,
d010: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
d020: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
d030: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 6c        int op = l
d040: 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 4c  eFlag ? OP_MoveL
d050: 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  e : OP_MoveLt;. 
d060: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d070: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
d080: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
d090: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d0a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d0b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d0c0: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
d0d0: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
d0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
d0f0: 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
d100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73  eAddOp(v, OP_Las
d120: 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  t, iIdxCur, brk)
d130: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d140: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
d150: 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69   start key.  Thi
d160: 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61  s is the key tha
d170: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f  t defines the lo
d180: 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75  wer.      ** bou
d190: 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  nd on the search
d1a0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73  .  There is no s
d1b0: 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72  tart key if ther
d1c0: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a  e are no.      *
d1d0: 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  * equality terms
d1e0: 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73   and if there is
d1f0: 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d   no "X>..." term
d200: 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74  .  In.      ** t
d210: 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61  hat case, genera
d220: 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e  te a "Rewind" in
d230: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61  struction in pla
d240: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
d250: 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61  ** start key sea
d260: 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rch..      **.  
d270: 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
d280: 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20  04: In the case 
d290: 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  of a reverse-ord
d2a0: 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73  er search, the s
d2b0: 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a  o-called.      *
d2c0: 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65  * "start" key re
d2d0: 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69  ally ends up bei
d2e0: 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74  ng used as the t
d2f0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a  ermination key..
d300: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
d310: 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20  f( btmLimit ){. 
d320: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
d330: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
d340: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d350: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
d360: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
d370: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
d380: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
d390: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
d3a0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
d3b0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
d3c0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
d3d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d3e0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
d3f0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
d400: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d410: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d420: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
d430: 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20         geFlag = 
d440: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20  pX->op==TK_GE;. 
d450: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
d460: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
d470: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d480: 20 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d          geFlag =
d490: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d4a0: 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62    if( nEq>0 || b
d4b0: 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
d4c0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
d4d0: 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20  q + btmLimit;.  
d4e0: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
d4f0: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62  Probe(v, nCol, b
d500: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
d510: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
d520: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
d530: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
d540: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
d550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d560: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
d570: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
d580: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74   1);.          t
d590: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54  estOp = OP_IdxLT
d5a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
d5c0: 70 20 3d 20 67 65 46 6c 61 67 20 3f 20 4f 50 5f  p = geFlag ? OP_
d5d0: 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
d5e0: 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
d5f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d600: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
d610: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rk);.        }. 
d620: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
d630: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
d640: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
d650: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d670: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
d680: 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
d690: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
d6a0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
d6b0: 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
d6c0: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
d6d0: 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
d6e0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
d6f0: 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
d700: 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
d710: 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
d720: 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
d730: 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
d740: 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
d750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d760: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
d770: 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
d780: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
d790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d7a0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
d7b0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
d7c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d7d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
d7e0: 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72  tOp, iIdxCur, br
d7f0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
d800: 28 6c 65 46 6c 61 67 20 26 26 20 21 62 52 65 76  (leFlag && !bRev
d810: 29 20 7c 7c 20 28 21 67 65 46 6c 61 67 20 26 26  ) || (!geFlag &&
d820: 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20   bRev) ){.      
d830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d840: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
d850: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
d860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d870: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d880: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
d890: 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
d8a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d8b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d8c0: 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 20  _IdxIsNull, nEq 
d8d0: 2b 20 74 6f 70 4c 69 6d 69 74 2c 20 63 6f 6e 74  + topLimit, cont
d8e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
d8f0: 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
d900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d910: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
d920: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
d930: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d950: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
d960: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d970: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
d980: 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
d990: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
d9a0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
d9b0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
d9c0: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
d9d0: 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
d9e0: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
d9f0: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70  iIdxCur;.      p
da00: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
da10: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
da20: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
da30: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
da40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
da50: 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61  e 4:  There is a
da60: 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20  n index and all 
da70: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
da80: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20  RE clause that. 
da90: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
daa0: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e   refer to the in
dab0: 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d  dex using the "=
dac0: 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
dad0: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tors..      */. 
dae0: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
daf0: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
db00: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20  pLevel->nEq;..  
db10: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
db20: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
db30: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
db40: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
db50: 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
db60: 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75  d level the valu
db70: 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
db80: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
db90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
dba0: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
dbb0: 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
dbc0: 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
dbd0: 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20  y, brk);..      
dbe0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 69  /* Generate a si
dbf0: 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69  ngle key that wi
dc00: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f  ll be used to bo
dc10: 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  th start and ter
dc20: 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  minate.      ** 
dc30: 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20  the search.     
dc40: 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64 49   */.      buildI
dc50: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71  ndexProbe(v, nEq
dc60: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
dc70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dc80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
dc90: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
dca0: 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
dcb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
dcc0: 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
dcd0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
dce0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
dcf0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
dd00: 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
dd10: 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
dd20: 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
dd30: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
dd40: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
dd50: 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
dd60: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
dd70: 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
dd80: 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
dd90: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
dda0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
ddb0: 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
ddc0: 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
ddd0: 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
dde0: 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
ddf0: 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
de00: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
de10: 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
de20: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
de30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
de40: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
de50: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
de60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
de70: 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78   OP_MoveLe, iIdx
de80: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
de90: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
dea0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
deb0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
dec0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
ded0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c  AddOp(v, OP_IdxL
def0: 54 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  T, iIdxCur, brk)
df00: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
df10: 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
df20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
df30: 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
df40: 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65  the forward orde
df50: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
df60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
df70: 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78   OP_MoveGe, iIdx
df80: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
df90: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
dfa0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
dfb0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
dfc0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
dfd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dfe0: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c  Op3(v, OP_IdxGE,
dff0: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22   iIdxCur, brk, "
e000: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
e010: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
e020: 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
e030: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e040: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e050: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
e060: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
e070: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e080: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
e090: 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  nEq, cont);.    
e0a0: 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e0c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e0d0: 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
e0e0: 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e100: 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
e110: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
e120: 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
e130: 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
e140: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
e150: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
e160: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
e170: 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
e180: 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
e190: 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
e1a0: 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
e1b0: 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
e1c0: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
e1d0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
e1e0: 20 20 69 6e 74 20 6f 70 52 65 77 69 6e 64 3b 0a    int opRewind;.
e1f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
e200: 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
e210: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
e220: 0a 20 20 20 20 20 20 20 20 6f 70 52 65 77 69 6e  .        opRewin
e230: 64 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 20  d = OP_Last;.   
e240: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
e250: 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20  = OP_Prev;.     
e260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e270: 6f 70 52 65 77 69 6e 64 20 3d 20 4f 50 5f 52 65  opRewind = OP_Re
e280: 77 69 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 4c  wind;.        pL
e290: 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
e2a0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
e2b0: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
e2c0: 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
e2d0: 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
e2e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e2f0: 6f 70 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  opRewind, iCur, 
e300: 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  brk);.    }.    
e310: 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
e320: 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69  Mask(&maskSet, i
e330: 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Cur);..    /* In
e340: 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
e350: 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
e360: 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
e370: 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20  e completely.   
e380: 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
e390: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
e3a0: 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
e3b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65    */.    for(pTe
e3c0: 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54  rm=wc.a, j=wc.nT
e3d0: 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
e3e0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
e3f0: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
e400: 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
e410: 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
e420: 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
e430: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
e440: 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
e450: 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
e460: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
e470: 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d       pE = pTerm-
e480: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
e490: 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
e4a0: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
e4b0: 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
e4c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e4d0: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
e4e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
e4f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
e500: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
e510: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
e520: 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
e530: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
e540: 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
e550: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
e560: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
e570: 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
e580: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
e590: 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
e5a0: 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
e5b0: 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
e5c0: 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
e5d0: 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
e5e0: 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a  table.  .    */.
e5f0: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
e600: 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
e610: 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d     pLevel->top =
e620: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e630: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
e640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e650: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
e660: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
e670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e680: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e690: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
e6a0: 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 1);.      Vdb
e6b0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
e6c0: 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
e6d0: 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66   hit"));.      f
e6e0: 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a  or(pTerm=wc.a, j
e6f0: 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20  =0; j<wc.nTerm; 
e700: 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
e710: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
e720: 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
e730: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
e740: 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
e750: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
e760: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
e770: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
e780: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
e790: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
e7a0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
e7b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
e7c0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
e7d0: 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20  m->pExpr, cont, 
e7e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  1);.        pTer
e7f0: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
e800: 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a  _CODED;.      }.
e810: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
e820: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f  f SQLITE_TEST  /
e830: 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  * For testing an
e840: 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
e850: 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63  only */.  /* Rec
e860: 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79  ord in the query
e870: 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   plan informatio
e880: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72  n about the curr
e890: 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61  ent table.  ** a
e8a0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  nd the index use
e8b0: 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28  d to access it (
e8c0: 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65  if any).  If the
e8d0: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20   table itself.  
e8e0: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20  ** is not used, 
e8f0: 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  its name is just
e900: 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e   '{}'.  If no in
e910: 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  dex is used.  **
e920: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69   the index is li
e930: 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49  sted as "{}".  I
e940: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
e950: 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20  y is used the.  
e960: 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73  ** index name is
e970: 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   '*'..  */.  for
e980: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
e990: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
e9a0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
e9b0: 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
e9c0: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
e9d0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
e9e0: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
e9f0: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
ea00: 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
ea10: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
ea20: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
ea30: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
ea40: 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
ea50: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
ea60: 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
ea70: 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
ea80: 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
ea90: 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
eaa0: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
eab0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  Y ){.        str
eac0: 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
ead0: 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
eae0: 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20 20   "{}");.        
eaf0: 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
eb00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb10: 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
eb20: 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
eb30: 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  lan], z);.      
eb40: 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
eb50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
eb60: 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
eb70: 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
eb80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
eb90: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
eba0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
ebb0: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
ebc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70  ) ){.      strcp
ebd0: 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
ebe0: 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
ebf0: 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  * ");.      nQPl
ec00: 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
ec10: 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
ec20: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
ec30: 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
ec40: 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
ec50: 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20 20  n], "{} ");.    
ec60: 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
ec70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec80: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65  n = strlen(pLeve
ec90: 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
eca0: 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  .      if( n+nQP
ecb0: 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
ecc0: 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
ecd0: 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  -2 ){.        st
ece0: 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
ecf0: 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
ed00: 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e  , pLevel->pIdx->
ed10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
ed20: 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
ed30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
ed40: 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
ed50: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
ed60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
ed70: 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
ed80: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
ed90: 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
eda0: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
edb0: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
edc0: 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
edd0: 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
ede0: 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
edf0: 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
ee00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ee10: 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20  TEST // Testing 
ee20: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
ee30: 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  e only */..  /* 
ee40: 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69  Record the conti
ee50: 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20  nuation address 
ee60: 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  in the WhereInfo
ee70: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
ee80: 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20  n.  ** clean up 
ee90: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
eea0: 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  .  pWInfo->iCont
eeb0: 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77  inue = cont;.  w
eec0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
eed0: 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  &wc);.  return p
eee0: 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
eef0: 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
ef00: 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
ef10: 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65  eginNoMem:.  whe
ef20: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77  reClauseClear(&w
ef30: 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  c);.  sqliteFree
ef40: 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
ef50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
ef60: 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
ef70: 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
ef80: 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
ef90: 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
efa0: 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
efb0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
efc0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
efd0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
efe0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
eff0: 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
f000: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
f010: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
f020: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
f030: 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
f040: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
f050: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20  fo->pTabList;.. 
f060: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
f070: 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
f080: 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  de..  */.  for(i
f090: 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d  =pTabList->nSrc-
f0a0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
f0b0: 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
f0c0: 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
f0d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f0e0: 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
f0f0: 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  ->cont);.    if(
f100: 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
f110: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
f120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f130: 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
f140: 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
f150: 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p2);.    }.   
f160: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f170: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
f180: 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66  el->brk);.    if
f190: 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b  ( pLevel->nIn ){
f1a0: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a 20  .      int *a;. 
f1b0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
f1c0: 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
f1d0: 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d 3e  nIn, a=&pLevel->
f1e0: 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b 20  aInLoop[j*3-3]; 
f1f0: 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29 7b  j>0; j--, a-=3){
f200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 61 5b 30  VdbeAddOp(v, a[0
f220: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
f230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f240: 6c 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d  liteFree(pLevel-
f250: 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  >aInLoop);.    }
f260: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f270: 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
f280: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
f290: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f2a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f2b0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
f2c0: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29  l->iLeftJoin, 0)
f2d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f2e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
f2f0: 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61 64 64 72 2b  otNull, 1, addr+
f300: 34 20 2b 20 28 70 4c 65 76 65 6c 2d 3e 69 49 64  4 + (pLevel->iId
f310: 78 43 75 72 3e 3d 30 29 29 3b 0a 20 20 20 20 20  xCur>=0));.     
f320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f330: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  p(v, OP_NullRow,
f340: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
f350: 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  iCursor, 0);.   
f360: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
f370: 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
f380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
f3a0: 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
f3b0: 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
f3c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f3d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
f3e0: 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
f3f0: 74 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  top);.    }.  }.
f400: 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
f410: 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
f420: 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
f430: 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
f440: 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
f450: 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
f460: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f470: 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
f480: 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
f490: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
f4a0: 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
f4b0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
f4c0: 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
f4d0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
f4e0: 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
f4f0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
f500: 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
f510: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
f520: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
f530: 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
f540: 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
f550: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
f560: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
f570: 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
f580: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
f590: 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
f5a0: 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  ent || pTab->pSe
f5b0: 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
f5c0: 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
f5d0: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
f5e0: 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
f5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
f610: 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
f620: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d  ursor, 0);.    }
f630: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f640: 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
f650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f660: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
f670: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
f680: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
f690: 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20 73  /* Make cursor s
f6a0: 75 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f 72  ubstitutions for
f6b0: 20 63 61 73 65 73 20 77 68 65 72 65 20 77 65 20   cases where we 
f6c0: 77 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20 20  want to use.    
f6d0: 2a 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ** just the inde
f6e0: 78 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66 65  x and never refe
f6f0: 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 2e  rence the table.
f700: 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
f710: 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
f720: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
f730: 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
f740: 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
f750: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
f760: 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
f770: 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
f780: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
f790: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
f7a0: 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
f7b0: 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
f7c0: 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
f7d0: 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
f7e0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
f7f0: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
f800: 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
f810: 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
f820: 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
f830: 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
f840: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
f850: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
f860: 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
f870: 69 6e 74 20 69 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int i, j, last;.
f880: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
f890: 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
f8a0: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
f8b0: 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
f8c0: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
f8d0: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
f8e0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
f8f0: 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
f900: 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
f910: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f920: 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
f930: 69 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  i=pWInfo->iTop; 
f940: 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c 20 70 4f 70  i<last; i++, pOp
f950: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f960: 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
f970: 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
f980: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
f990: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
f9a0: 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
f9b0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
f9c0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
f9d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
f9e0: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
f9f0: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
fa00: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
fa10: 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
fa20: 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
fa30: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
fa40: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
fa50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fa60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
fa70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
fa80: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
fa90: 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
faa0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
fab0: 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
fac0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
fad0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
fae0: 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
faf0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
fb00: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f  pcode==OP_NullRo
fb10: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
fb20: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
fb30: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Noop;.        }.
fb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fb50: 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
fb60: 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 73 71 6c  eanup.  */.  sql
fb70: 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  iteFree(pWInfo);
fb80: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.