/ Hex Artifact Content
Login

Artifact 72f68f996a1fd0139ef0ca77f407406c97b15d0a:


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 39   where.c,v 1.159
0340: 20 32 30 30 35 2f 30 38 2f 30 32 20 31 37 3a 34   2005/08/02 17:4
0350: 38 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a 2a  8:22 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 65 6e   */.  i16 iParen
0c60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
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 65 6e 74 5d 20 77 68 65 6e 20 74 68  iParent] when th
0c90: 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64  is term disabled
0ca0: 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 75   */.  i16 leftCu
0cb0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rsor;         /*
0cc0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
0cd0: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
0ce0: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36 20  expr>" */.  i16 
0cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
0d00: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
0d10: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
0d20: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
0d30: 20 20 75 31 36 20 6f 70 65 72 61 74 6f 72 3b 20    u16 operator; 
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
0d50: 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72  O_xx value descr
0d60: 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20  ibing <op> */.  
0d70: 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  u8 flags;       
0d80: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20 66          /* Bit f
0d90: 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  lags.  See below
0da0: 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b   */.  u8 nChild;
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0dc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
0dd0: 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64 69  ren that must di
0de0: 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68  sable us */.  Wh
0df0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
0e00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 61        /* The cla
0e10: 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69 73  use this term is
0e20: 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69   part of */.  Bi
0e30: 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67 68  tmask prereqRigh
0e40: 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  t;    /* Bitmask
0e50: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
0e60: 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 42  by pRight */.  B
0e70: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
0e80: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
0e90: 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65  k of tables refe
0ea0: 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a 7d  renced by p */.}
0eb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
0ec0: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
0ed0: 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64  Term.flags.*/.#d
0ee0: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
0ef0: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
0f00: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
0f10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0f20: 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65  Expr) */.#define
0f30: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20   TERM_VIRTUAL   
0f40: 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64   0x02   /* Added
0f50: 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
0f60: 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20  r.  Do not code 
0f70: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0f80: 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34 20  CODED      0x04 
0f90: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69    /* This term i
0fa0: 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20  s already coded 
0fb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0fc0: 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38 20  COPIED     0x08 
0fd0: 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64    /* Has a child
0fe0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0ff0: 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31 30  _OR_OK      0x10
1000: 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e     /* Used durin
1010: 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63  g OR-clause proc
1020: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
1030: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1040: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1050: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c  ructure holds al
1060: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
1070: 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63  out a.** WHERE c
1080: 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74  lause.  Mostly t
1090: 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e  his is a contain
10a0: 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  er for one or mo
10b0: 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  re WhereTerms..*
10c0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c  /.struct WhereCl
10d0: 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a  ause {.  Parse *
10e0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
10f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1100: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1110: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1130: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
1140: 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
1150: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1160: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1170: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
1180: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  m *a;           
1190: 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73   /* Each a[] des
11a0: 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66  cribes a term of
11b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73   the WHERE cluas
11c0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
11d0: 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20 20   aStatic[10];   
11e0: 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69  /* Initial stati
11f0: 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20  c space for a[] 
1200: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1210: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1220: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1230: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
1240: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
1250: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
1260: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
1270: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
1280: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
1290: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
12a0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
12b0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
12c0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
12d0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
12e0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
12f0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
1300: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
1310: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
1320: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
1330: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
1340: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
1350: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
1360: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
1370: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
1380: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
1390: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
13a0: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
13b0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
13c0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
13d0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
13e0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
13f0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
1400: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
1410: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
1420: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
1430: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
1440: 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74  * If ExprMaskSet
1450: 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61  .ix[A]==B it mea
1460: 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68  ns that The A-th
1470: 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73   bit of a Bitmas
1480: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  k.** corresponds
1490: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
14a0: 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68  ber B.  The A-th
14b0: 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73   bit of a bitmas
14c0: 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a  k is 1<<A..**.**
14d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
14e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  e expression use
1500: 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20  d these VDBE.** 
1510: 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20  cursors:  4, 5, 
1520: 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20  8, 29, 57, 73.  
1530: 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61  Then the  ExprMa
1540: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a  skSet structure.
1550: 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f  ** would map tho
1560: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1570: 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68  s into bits 0 th
1580: 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e  rough 5..**.** N
1590: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70  ote that the map
15a0: 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ping is not nece
15b0: 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e  ssarily ordered.
15c0: 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65    In the example
15d0: 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d  .** above, the m
15e0: 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20  apping might go 
15f0: 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33  like this:  4->3
1600: 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39  , 5->1, 8->2, 29
1610: 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37  ->0,.** 57->5, 7
1620: 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66  3->4.  Or one of
1630: 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69   719 other combi
1640: 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65  nations might be
1650: 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65   used. It.** doe
1660: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74  s not really mat
1670: 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d  ter.  What is im
1680: 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20  portant is that 
1690: 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a  sparse cursor.**
16a0: 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74   numbers all get
16b0: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74   mapped into bit
16c0: 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65   numbers that be
16d0: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63  gin with 0 and c
16e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70  ontain.** no gap
16f0: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1700: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1710: 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73 74   ExprMaskSet;.st
1720: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1730: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1760: 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20  assigned cursor 
1770: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1780: 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  ix[sizeof(Bitmas
1790: 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75 72  k)*8];    /* Cur
17a0: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
17b0: 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a  each bit */.};..
17c0: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
17d0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
17e0: 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 61  s that indices a
17f0: 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f  re able to explo
1800: 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64  it.  An.** OR-ed
1810: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1820: 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  these values can
1830: 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73 65   be used when se
1840: 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74  arching for.** t
1850: 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72  erms in the wher
1860: 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65  e clause..*/.#de
1870: 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 31  fine WO_IN     1
1880: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
1890: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f     2.#define WO_
18a0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
18b0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
18c0: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
18d0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
18e0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
18f0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
1900: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
1910: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
1920: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
1930: 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a 20  -TK_EQ))../*.** 
1940: 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20  Value for flags 
1950: 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73 74  returned by best
1960: 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66 69  Index().*/.#defi
1970: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  ne WHERE_ROWID_E
1980: 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20 20  Q       0x0001  
1990: 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f   /* rowid=EXPR o
19a0: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
19b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
19c0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 20  E_ROWID_RANGE   
19d0: 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f 77   0x0002   /* row
19e0: 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72  id<EXPR and/or r
19f0: 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65  owid>EXPR */.#de
1a00: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1a10: 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31 30  N_EQ      0x0010
1a20: 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20     /* x=EXPR or 
1a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
1a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
1a50: 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30 32  MN_RANGE   0x002
1a60: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e  0   /* x<EXPR an
1a70: 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23  d/or x>EXPR */.#
1a80: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1a90: 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30 30  UMN_IN      0x00
1aa0: 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  40   /* x IN (..
1ab0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1ac0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20  ERE_TOP_LIMIT   
1ad0: 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20 78     0x0100   /* x
1ae0: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
1af0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
1b00: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
1b10: 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30 32  _LIMIT      0x02
1b20: 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f  00   /* x>EXPR o
1b30: 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x>=EXPR constr
1b40: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
1b50: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
1b60: 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f 2a       0x0800   /*
1b70: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
1b80: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
1b90: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
1ba0: 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78 31  DERBY        0x1
1bb0: 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  000   /* Output 
1bc0: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
1bd0: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
1be0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
1bf0: 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78 32  VERSE        0x2
1c00: 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e  000   /* Scan in
1c10: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1c20: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1c30: 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20 30  UNIQUE         0
1c40: 78 34 30 30 30 20 20 20 2f 2a 20 53 65 6c 65 63  x4000   /* Selec
1c50: 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  ts no more than 
1c60: 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a 2a  one row */../*.*
1c70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70  * Initialize a p
1c80: 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  reallocated Wher
1c90: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1ca0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1cb0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  d whereClauseIni
1cc0: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
1cd0: 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72 73  WC, Parse *pPars
1ce0: 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73  e){.  pWC->pPars
1cf0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
1d00: 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  C->nTerm = 0;.  
1d10: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52 52  pWC->nSlot = ARR
1d20: 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74 61  AYSIZE(pWC->aSta
1d30: 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d  tic);.  pWC->a =
1d40: 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d   pWC->aStatic;.}
1d50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
1d60: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
1d70: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
1d80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1d90: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
1da0: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
1db0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1dc0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
1dd0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
1de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1df0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
1e00: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
1e10: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
1e20: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
1e30: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
1e40: 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e  -1, a=pWC->a; i>
1e50: 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20  =0; i--, a++){. 
1e60: 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20     if( a->flags 
1e70: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
1e80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1e90: 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78  xprDelete(a->pEx
1ea0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
1eb0: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
1ec0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
1ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 43 2d   sqliteFree(pWC-
1ee0: 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >a);.  }.}../*.*
1ef0: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72  * Add a new entr
1f00: 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72 65  ies to the Where
1f10: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1f20: 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  .  Increase the 
1f30: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61  allocated.** spa
1f40: 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ce as necessary.
1f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
1f60: 54 65 72 6d 20 2a 77 68 65 72 65 43 6c 61 75 73  Term *whereClaus
1f70: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
1f80: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
1f90: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
1fa0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1fb0: 6d 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  m;.  if( pWC->nT
1fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
1fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
1fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
1ff0: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
2000: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2010: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
2020: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
2030: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
2040: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2050: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
2060: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
2070: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
2080: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
2090: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
20a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
20b0: 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  ee(pOld);.    }.
20c0: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 2a      pWC->nSlot *
20d0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 2;.  }.  pTerm
20e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
20f0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 54 65 72 6d 2d  nTerm];.  pTerm-
2100: 3e 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  >idx = pWC->nTer
2110: 6d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  m;.  pWC->nTerm+
2120: 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  +;.  pTerm->pExp
2130: 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e  r = p;.  pTerm->
2140: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
2150: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
2160: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
2170: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
2180: 72 6e 20 70 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn pTerm;.}../*.
2190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21a0: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
21b0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
21c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
21d0: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
21e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
21f0: 61 72 61 74 65 20 62 79 20 74 68 65 20 41 4e 44  arate by the AND
2200: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
2210: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
2220: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
2230: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
2240: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
2250: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2260: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
2270: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
2280: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
2290: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
22a0: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
22b0: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
22c0: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
22d0: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
22e0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
22f0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
2300: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
2310: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
2320: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
2330: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
2340: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
2360: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
2370: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
2380: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
2390: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
23a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
23b0: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
23c0: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
23d0: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
23e0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
23f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
2400: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
2410: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
2420: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
2430: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
2440: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
2450: 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72 61  rray.  This arra
2460: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
2470: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
2480: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
24a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24b0: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
24c0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
24d0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
24e0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2500: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
2510: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2520: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
2530: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2540: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2550: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
2560: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
2570: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2580: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
2590: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
25a0: 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73  ialize an expres
25b0: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f  sion mask set.*/
25c0: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
25d0: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
25e0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
25f0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
2600: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2610: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
2620: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
2630: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
2640: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
2650: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
2660: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78  tmask getMask(Ex
2670: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
2680: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2690: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
26a0: 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65  r(i=0; i<pMaskSe
26b0: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
26c0: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  if( pMaskSet->ix
26d0: 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  [i]==iCursor ){.
26e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42        return ((B
26f0: 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  itmask)1)<<i;.  
2700: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2710: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2720: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
2730: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
2740: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
2750: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
2760: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
2770: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
2780: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
2790: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27a0: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
27b0: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
27c0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
27d0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
27e0: 72 6f 75 74 69 65 6e 2e 20 20 53 6f 20 77 65 20  routien.  So we 
27f0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
2800: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
2810: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
2820: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
2830: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
2840: 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74  Mask(ExprMaskSet
2850: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2860: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
2870: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
2880: 3c 20 41 52 52 41 59 53 49 5a 45 28 70 4d 61 73  < ARRAYSIZE(pMas
2890: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
28a0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
28b0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
28c0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
28d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
28e0: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
28f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2900: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
2910: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
2920: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
2930: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
2940: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
2950: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
2960: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
2970: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
2980: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
2990: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
29a0: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
29b0: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
29c0: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
29d0: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
29e0: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
29f0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2a00: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
2a10: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2a20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
2a30: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52  The sqlite3ExprR
2a40: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f  esolveNames() ro
2a50: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
2a60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
2a70: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
2a80: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
2a90: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
2aa0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
2ab0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
2ac0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
2ad0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
2af0: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
2b00: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
2b10: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
2b20: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
2b30: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
2b40: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
2b50: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2b60: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2b70: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
2b80: 20 2a 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b   *, ExprList *);
2b90: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2ba0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 45  exprTableUsage(E
2bb0: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2bc0: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
2bd0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
2be0: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
2bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2c00: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
2c10: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
2c20: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2c30: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
2c40: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
2c50: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
2c60: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2c70: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
2c80: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
2c90: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2ca0: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
2cb0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2cc0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2cd0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b  kSet, p->pList);
2ce0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63  .  if( p->pSelec
2cf0: 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
2d00: 2a 70 53 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74  *pS = p->pSelect
2d10: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
2d20: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2d30: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2d40: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
2d50: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2d60: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2d70: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
2d80: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2d90: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
2da0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
2db0: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
2dc0: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
2dd0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2de0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
2df0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2e00: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2e10: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d  S->pHaving);.  }
2e20: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2e30: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2e40: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2e50: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2e60: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
2e70: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
2e80: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
2e90: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
2ea0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2eb0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
2ec0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2ed0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2ee0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2ef0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
2f00: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2f10: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2f30: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
2f40: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
2f50: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
2f60: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
2f70: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
2f80: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
2f90: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
2fa0: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
2fb0: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
2fc0: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
2fd0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
2fe0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
2ff0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
3000: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
3010: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
3020: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3030: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
3040: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
3050: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
3060: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
3070: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3080: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
3090: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
30a0: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
30b0: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
30c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
30d0: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
30e0: 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ype T..*/.#defin
30f0: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
3100: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
3110: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
3120: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
3130: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45  ion operator.  E
3140: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
3150: 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a  e form "X op Y".
3160: 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ** are converted
3170: 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a   into "Y op X"..
3180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
3190: 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20  xprCommute(Expr 
31a0: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
31b0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
31c0: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
31d0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
31e0: 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70   SWAP(CollSeq*,p
31f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
3200: 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  oll,pExpr->pLeft
3210: 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50  ->pColl);.  SWAP
3220: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3230: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3240: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3250: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3260: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3270: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3280: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3290: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
32a0: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
32b0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
32c0: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
32e0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
32f0: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
3300: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
3310: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
3320: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3330: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3340: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3350: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3360: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3370: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72  .static int oper
3380: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3390: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73  {.  int c;.  ass
33a0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
33b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
33c0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
33d0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b   WO_IN;.  }else{
33e0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c  .    c = WO_EQ<<
33f0: 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a  (op-TK_EQ);.  }.
3400: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3410: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
3420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3430: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
3440: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
3450: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
3460: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
3470: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
3480: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
3490: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
34a0: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
34b0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34c0: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
34d0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
34e0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
34f0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
3500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
3510: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
3520: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3530: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
3540: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
3550: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
3560: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
3570: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
3580: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
3590: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
35a0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
35b0: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
35c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35d0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
35e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
35f0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
3600: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
3610: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3620: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
3630: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
3640: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
3650: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
3660: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3670: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3680: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
3690: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
36a0: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
36b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
36c0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
36d0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
36e0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
36f0: 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20   */.  u16 op,   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3710: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
3720: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
3730: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
3740: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
3750: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
3760: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
3770: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
3780: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
3790: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
37a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70    int k;.  for(p
37b0: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
37c0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
37d0: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
37e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
37f0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
3800: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
3810: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3820: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
3830: 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43   && pTerm->leftC
3840: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
3850: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
3860: 3e 6f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  >operator & op)!
3870: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
3880: 69 66 28 20 69 43 75 72 3e 3d 30 20 26 26 20 70  if( iCur>=0 && p
3890: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 45  Idx ){.        E
38a0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
38b0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
38c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
38d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
38e0: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
38f0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   k;.        Pars
3900: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3910: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
3920: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
3930: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
3940: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
3950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
3960: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
3970: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
3980: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3990: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
39a0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
39b0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
39c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
39d0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
39e0: 20 20 20 20 69 66 28 20 70 58 2d 3e 70 52 69 67      if( pX->pRig
39f0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ht ){.          
3a00: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3a10: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
3a20: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
3a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3a40: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
3a50: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3a60: 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
3a70: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
3a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3aa0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
3ab0: 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d  nColumn && pIdx-
3ac0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 69 43  >aiColumn[k]!=iC
3ad0: 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  olumn; k++){}.  
3ae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
3af0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
3b10: 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66  ll!=pIdx->keyInf
3b20: 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 63 6f 6e  o.aColl[k] ) con
3b30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3b40: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
3b50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
3b60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
3b70: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3b80: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3b90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
3ba0: 69 73 74 2a 2c 20 45 78 70 72 4d 61 73 6b 53 65  ist*, ExprMaskSe
3bb0: 74 2a 2c 20 57 68 65 72 65 54 65 72 6d 2a 29 3b  t*, WhereTerm*);
3bc0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
3bd0: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
3be0: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
3bf0: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
3c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3c10: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
3c20: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3c30: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
3c40: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3c50: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
3c60: 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 74  pMaskSet,   /* t
3c70: 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  able masks */.  
3c80: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
3ca0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
3cb0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
3cc0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3cd0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Term;.  int i;. 
3ce0: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
3cf0: 6d 2d 31 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m-1, pTerm=pWC->
3d00: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 54  a; i>=0; i--, pT
3d10: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 65 78 70 72  erm++){.    expr
3d20: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
3d30: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 54 65 72  , pMaskSet, pTer
3d40: 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  m);.  }.}../*.**
3d50: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
3d60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
3d70: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
3d80: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
3d90: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
3da0: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
3db0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
3dc0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
3dd0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
3de0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
3df0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
3e00: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
3e10: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
3e20: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
3e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
3e40: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
3e50: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
3e60: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
3e70: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
3e80: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
3e90: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20  X <op> <expr>". 
3ea0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
3eb0: 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68 65 20  on is of.** the 
3ec0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
3ed0: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
3ee0: 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20   Y are columns, 
3ef0: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
3f00: 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  l.** expression 
3f10: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
3f20: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 65   a new virtual e
3f30: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
3f40: 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e   form.** "Y <op>
3f50: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
3f60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3f70: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
3f80: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
3f90: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
3fb0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3fc0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
3fd0: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a  *pMaskSet,    /*
3fe0: 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a   table masks */.
3ff0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4000: 72 6d 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  rm          /* t
4010: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4020: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
4030: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  zed */.){.  Expr
4040: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
4050: 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61 73  >pExpr;.  Bitmas
4060: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  k prereqLeft;.  
4070: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
4080: 6c 3b 0a 20 20 69 6e 74 20 69 64 78 52 69 67 68  l;.  int idxRigh
4090: 74 3b 0a 0a 20 20 70 72 65 72 65 71 4c 65 66 74  t;..  prereqLeft
40a0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
40b0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
40c0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 54 65  r->pLeft);.  pTe
40d0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
40e0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
40f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4100: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 54 65  ->pRight);.  pTe
4110: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
4120: 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72  prereqAll = expr
4130: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4140: 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 70  Set, pExpr);.  p
4150: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4160: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
4170: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
4180: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
4190: 3d 20 30 3b 0a 20 20 69 64 78 52 69 67 68 74 20  = 0;.  idxRight 
41a0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 6c 6c 6f  = -1;.  if( allo
41b0: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
41c0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
41d0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
41e0: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
41f0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
4200: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
4210: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4220: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4230: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
4240: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4250: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
4260: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
4270: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
4280: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
4290: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
42a0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6f 70  .      pTerm->op
42b0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
42c0: 72 4d 61 73 6b 28 70 45 78 70 72 2d 3e 6f 70 29  rMask(pExpr->op)
42d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
42e0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
42f0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4300: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
4310: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
4320: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
4330: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4340: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
4350: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
4360: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
4370: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
4380: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
4390: 73 65 72 74 28 70 54 65 72 6d 2d 3e 70 57 43 2c  sert(pTerm->pWC,
43a0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
43b0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
43c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
43d0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
43e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
43f0: 50 61 72 65 6e 74 20 3d 20 70 54 65 72 6d 2d 3e  Parent = pTerm->
4400: 69 64 78 3b 0a 20 20 20 20 20 20 20 20 70 54 65  idx;.        pTe
4410: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
4420: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
4430: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
4440: 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IED;.      }else
4450: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
4460: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
4470: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
4480: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
4490: 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20  Commute(pDup);. 
44a0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75       pLeft = pDu
44b0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
44c0: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
44d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
44e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
44f0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
4500: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4510: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
4520: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b  ht = prereqLeft;
4530: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
4540: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
4550: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
4560: 6f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  operator = opera
4570: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
4580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
4590: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
45a0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
45b0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
45c0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
45d0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
45e0: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
45f0: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
4600: 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  mplements..  */.
4610: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
4620: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
4630: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
4640: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
4650: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  >pList;.    int 
4660: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
4670: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
4680: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
4690: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
46a0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
46b0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
46c0: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
46d0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
46e0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
46f0: 70 72 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  pr;.      WhereT
4700: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
4710: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
4720: 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 73 5b  sqlite3Expr(ops[
4730: 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  i], sqlite3ExprD
4740: 75 70 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  up(pExpr->pLeft)
4750: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4770: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
4780: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
4790: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
47a0: 54 65 72 6d 20 3d 20 77 68 65 72 65 43 6c 61 75  Term = whereClau
47b0: 73 65 49 6e 73 65 72 74 28 70 54 65 72 6d 2d 3e  seInsert(pTerm->
47c0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54    TERM_VIRTUAL|T
4800: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
4810: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
4820: 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20  pSrc, pMaskSet, 
4830: 70 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  pNewTerm);.     
4840: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
4850: 6e 74 20 3d 20 70 54 65 72 6d 2d 3e 69 64 78 3b  nt = pTerm->idx;
4860: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
4870: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
4880: 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  }..  /* Attempt 
4890: 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f  to convert OR-co
48a0: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e  nnected terms in
48b0: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
48c0: 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74  r so that.  ** t
48d0: 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65  hey can make use
48e0: 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a   of indices..  *
48f0: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
4900: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
4910: 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20  .    int ok;.   
4920: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69   int i, j;.    i
4930: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72  nt iColumn, iCur
4940: 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c  sor;.    WhereCl
4950: 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68  ause sOr;.    Wh
4960: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
4970: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
4980: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
4990: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20  ERM_DYNAMIC)==0 
49a0: 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  );.    whereClau
49b0: 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 54 65  seInit(&sOr, pTe
49c0: 72 6d 2d 3e 70 57 43 2d 3e 70 50 61 72 73 65 29  rm->pWC->pParse)
49d0: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
49e0: 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b  (&sOr, pExpr, TK
49f0: 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  _OR);.    exprAn
4a00: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
4a10: 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a  MaskSet, &sOr);.
4a20: 20 20 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e      assert( sOr.
4a30: 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a  nTerm>0 );.    j
4a40: 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 0;.    do{.  
4a50: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f      iColumn = sO
4a60: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d  r.a[j].leftColum
4a70: 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72  n;.      iCursor
4a80: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
4a90: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b  Cursor;.      ok
4aa0: 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20   = iCursor>=0;. 
4ab0: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
4ac0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
4ad0: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
4ae0: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
4af0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4b00: 70 4f 72 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f  pOrTerm->operato
4b10: 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20  r!=WO_EQ ){.    
4b20: 20 20 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f        goto or_no
4b30: 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20  t_possible;.    
4b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4b50: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
4b60: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26  ursor==iCursor &
4b70: 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  & pOrTerm->leftC
4b80: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
4b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
4ba0: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
4bb0: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
4bc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 72    }else if( (pOr
4bd0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
4be0: 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c  RM_COPIED)!=0 ||
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c00: 20 20 20 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e       ((pOrTerm->
4c10: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  flags & TERM_VIR
4c20: 54 55 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  TUAL)!=0 &&.    
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d   (sOr.a[pOrTerm-
4c50: 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20  >iParent].flags 
4c60: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30  & TERM_OR_OK)!=0
4c70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
4c80: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d  OrTerm->flags &=
4c90: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
4ca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4cb0: 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20         ok = 0;. 
4cc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4cd0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b  .    }while( !ok
4ce0: 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e   && (sOr.a[j++].
4cf0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  flags & TERM_COP
4d00: 49 45 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72  IED)!=0 && j<sOr
4d10: 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66  .nTerm );.    if
4d20: 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78  ( ok ){.      Ex
4d30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
4d40: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
4d50: 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  New, *pDup;.    
4d60: 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72    for(i=sOr.nTer
4d70: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72  m-1, pOrTerm=sOr
4d80: 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20  .a; i>=0 && ok; 
4d90: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
4da0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
4db0: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
4dc0: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
4dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4de0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
4df0: 45 78 70 72 44 75 70 28 70 4f 72 54 65 72 6d 2d  ExprDup(pOrTerm-
4e00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
4e10: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
4e20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4e30: 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 70 44  Append(pList, pD
4e40: 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  up, 0);.      }.
4e50: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
4e60: 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55  ite3Expr(TK_COLU
4e70: 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  MN, 0, 0, 0);.  
4e80: 20 20 20 20 69 66 28 20 70 44 75 70 20 29 7b 0a      if( pDup ){.
4e90: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69 54          pDup->iT
4ea0: 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
4eb0: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69 43          pDup->iC
4ec0: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b  olumn = iColumn;
4ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
4ee0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4ef0: 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  r(TK_IN, pDup, 0
4f00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4f10: 70 4e 65 77 20 29 20 70 4e 65 77 2d 3e 70 4c 69  pNew ) pNew->pLi
4f20: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
4f30: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
4f40: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 54 65   pNew;.      pTe
4f50: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
4f60: 4d 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20  M_DYNAMIC;.     
4f70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
4f80: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 54 65  c, pMaskSet, pTe
4f90: 72 6d 29 3b 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f  rm);.    }.or_no
4fa0: 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20  t_possible:.    
4fb0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
4fc0: 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  (&sOr);.  }.}...
4fd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4fe0: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
4ff0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
5000: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
5010: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
5020: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
5030: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
5040: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
5050: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
5060: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
5070: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5080: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
5090: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
50a0: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
50b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
50c0: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
50d0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
50e0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
50f0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
5100: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5110: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
5120: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
5130: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
5140: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
5150: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
5160: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
5170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5180: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
5190: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
51a0: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
51b0: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
51c0: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
51d0: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
51e0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
51f0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
5200: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
5210: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
5220: 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
5230: 69 73 20 55 4e 49 51 55 45 2c 20 74 68 65 6e 20  is UNIQUE, then 
5240: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
5250: 75 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  use is allowed t
5260: 6f 20 68 61 76 65 0a 2a 2a 20 61 64 64 69 74 69  o have.** additi
5270: 6f 6e 61 6c 20 74 65 72 6d 73 20 70 61 73 74 20  onal terms past 
5280: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
5290: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 6d 61 74  ndex and the mat
52a0: 63 68 20 77 69 6c 6c 20 73 74 69 6c 6c 0a 2a 2a  ch will still.**
52b0: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
52c0: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
52d0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
52e0: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
52f0: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
5300: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
5310: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
5320: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
5330: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
5340: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
5350: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
5360: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
5370: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
5380: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
5390: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
53a0: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
53b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
53c0: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
53d0: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
53e0: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
53f0: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
5400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5410: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
5420: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
5440: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5450: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
5460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5470: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
5480: 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65  sting */.  Table
5490: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
54a0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
54b0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
54c0: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
54d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
54e0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  sor number for p
54f0: 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Tab */.  ExprLis
5500: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
5510: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
5520: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
5530: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
5540: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5550: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
5560: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
5570: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
5580: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
5590: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
55a0: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
55b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
55c0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
55d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
55e0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
55f0: 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20  sortOrder;      
5600: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
5610: 68 20 64 69 72 65 63 74 69 6f 6e 20 77 65 20 61  h direction we a
5620: 72 65 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20  re sorting */.  
5630: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5650: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
5660: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
5670: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
5680: 65 6d 20 2a 70 54 65 72 6d 3b 20 2f 2a 20 41 20  em *pTerm; /* A 
5690: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
56a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
56b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
56c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
56d0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
56e0: 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70  0 );.  nTerm = p
56f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
5700: 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e    assert( nTerm>
5710: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68  0 );..  /* Match
5720: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
5730: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 67  DER BY clause ag
5740: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  ainst columns of
5750: 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e  .  ** the index.
5760: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
5770: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
5780: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
5790: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
57a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
57b0: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f   *pExpr;       /
57c0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
57d0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
57e0: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f   pTerm */.    Co
57f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
5800: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e   /* The collatin
5810: 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45  g sequence of pE
5820: 78 70 72 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  xpr */..    pExp
5830: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5840: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
5850: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
5860: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
5870: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
5880: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
5890: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
58a0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
58b0: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
58c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
58d0: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
58e0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
58f0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
5900: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  0;.    }.    pCo
5910: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5920: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5930: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
5940: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
5950: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
5960: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
5970: 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69  Column!=pIdx->ai
5980: 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f  Column[i] || pCo
5990: 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66  ll!=pIdx->keyInf
59a0: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  o.aColl[i] ){.  
59b0: 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
59c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
59d0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
59e0: 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
59f0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
5a00: 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
5a10: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
5a20: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
5a30: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
5a40: 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
5a50: 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
5a60: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
5a70: 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
5a80: 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
5a90: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
5aa0: 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
5ab0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
5ac0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
5ad0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
5ae0: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
5af0: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
5b00: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
5b10: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
5b20: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
5b30: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
5b40: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
5b50: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
5b60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
5b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5b90: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
5ba0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 73      if( pTerm->s
5bb0: 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72  ortOrder!=sortOr
5bc0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  der ){.        /
5bd0: 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e  * Indices can on
5be0: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  ly be used if al
5bf0: 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
5c00: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20   past the.      
5c10: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f    ** equality co
5c20: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c  nstraints are al
5c30: 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72  l either DESC or
5c40: 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20   ASC. */.       
5c50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5c60: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5c70: 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
5c80: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
5c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
5ca0: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
5cb0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
5cc0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
5cd0: 72 20 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c  r sorting if all
5ce0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
5cf0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
5d00: 2a 2a 20 6f 72 20 63 6f 76 65 72 65 64 20 6f 72  ** or covered or
5d10: 20 69 66 20 77 65 20 72 61 6e 20 6f 75 74 20 6f   if we ran out o
5d20: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
5d30: 61 6e 64 20 74 68 65 20 69 74 20 69 73 20 61 20  and the it is a 
5d40: 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65  UNIQUE.  ** inde
5d50: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e  x..  */.  if( j>
5d60: 3d 6e 54 65 72 6d 20 7c 7c 20 28 69 3e 3d 70 49  =nTerm || (i>=pI
5d70: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70  dx->nColumn && p
5d80: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
5d90: 5f 4e 6f 6e 65 29 20 29 7b 0a 20 20 20 20 2a 70  _None) ){.    *p
5da0: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
5db0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  ==SQLITE_SO_DESC
5dc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5dd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
5df0: 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74  able to see if t
5e00: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
5e10: 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63  se in pOrderBy c
5e20: 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a  an be satisfied.
5e30: 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e  ** by sorting in
5e40: 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e   order of ROWID.
5e50: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
5e60: 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52   so and set *pbR
5e70: 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65  ev to be.** true
5e80: 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57   for reverse ROW
5e90: 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  ID and false for
5ea0: 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f   forward ROWID o
5eb0: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
5ec0: 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  int sortableByRo
5ed0: 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c  wid(.  int base,
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ef0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
5f00: 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20  for table to be 
5f10: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
5f20: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
5f30: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
5f40: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
5f50: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
5f60: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
5f70: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
5f80: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
5f90: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
5fa0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
5fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
5fc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
5fd0: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
5fe0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
5ff0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
6000: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
6010: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
6020: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20  olumn==-1 ){.   
6030: 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72   *pbRev = pOrder
6040: 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
6050: 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  er;.    return 1
6060: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
6070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
6080: 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d  re a crude estim
6090: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 6f 72  ate of the logor
60a0: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
60b0: 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  t value..** The 
60c0: 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74  results need not
60d0: 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73   be exact.  This
60e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
60f0: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20  r estimating.** 
6100: 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f  the total cost o
6110: 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65  f performing ope
6120: 72 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c  ratings with O(l
6130: 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29  ogN) or O(NlogN)
6140: 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20  .** complexity. 
6150: 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75   Because N is ju
6160: 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69  st a guess, it i
6170: 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65  s no great trage
6180: 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73  dy if.** logN is
6190: 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a   a little off..*
61a0: 2a 0a 2a 2a 20 57 65 20 63 61 6e 20 61 73 73 75  *.** We can assu
61b0: 6d 65 20 4e 3e 3d 31 2e 30 3b 0a 2a 2f 0a 73 74  me N>=1.0;.*/.st
61c0: 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c  atic double estL
61d0: 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20  og(double N){.  
61e0: 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 2e  double logN = 1.
61f0: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20  0;.  double x = 
6200: 31 30 2e 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e  10.0;.  while( N
6210: 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 3d  >x ){.    logN =
6220: 20 6c 6f 67 4e 2b 31 2e 30 3b 0a 20 20 20 20 78   logN+1.0;.    x
6230: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
6240: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
6250: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73  .** Find the bes
6260: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65  t index for acce
6270: 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
6280: 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  ar table.  Retur
6290: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
62a0: 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61  o the index, fla
62b0: 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
62c0: 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73   how the index s
62d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74  hould be used, t
62e0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
62f0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6300: 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63  ints, and the "c
6310: 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e  ost" for this in
6320: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  dex..**.** The l
6330: 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78  owest cost index
6340: 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
6350: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
6360: 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
6370: 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
6380: 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f   I/O need to pro
6390: 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
63a0: 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63   using the selec
63b0: 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61  ted index..** Fa
63c0: 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
63d0: 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
63e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
63f0: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
6400: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
6410: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
6420: 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
6430: 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
6440: 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
6450: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
6460: 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
6470: 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
6480: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
6490: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
64a0: 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
64b0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
64c0: 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
64d0: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
64e0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
64f0: 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
6500: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6510: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6520: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
6530: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
6540: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
6550: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
6560: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
6570: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
6580: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
6590: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
65a0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
65b0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
65c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
65d0: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
65e0: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
65f0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
6600: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
6610: 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
6620: 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
6630: 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c  Index **ppIndex,
6640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6650: 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69  ake *ppIndex poi
6660: 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69  nt to the best i
6670: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
6680: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
6690: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61        /* Put fla
66a0: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
66b0: 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46  is choice in *pF
66c0: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
66d0: 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20  nEq             
66e0: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65        /* Put the
66f0: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
6700: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
6710: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  here */.){.  Whe
6720: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
6730: 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20   Index *bestIdx 
6740: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
6750: 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73  Index that gives
6760: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
6770: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77   */.  double low
6780: 65 73 74 43 6f 73 74 20 3d 20 31 2e 30 65 39 39  estCost = 1.0e99
6790: 3b 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66  ; /* The cost of
67a0: 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a   using bestIdx *
67b0: 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67  /.  int bestFlag
67c0: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
67d0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
67e0: 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78  ted with bestIdx
67f0: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45   */.  int bestNE
6800: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
6810: 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20    /* Best value 
6820: 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74  for nEq */.  int
6830: 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
6840: 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
6850: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
6860: 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
6870: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
6880: 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
6890: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
68a0: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
68b0: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20  g */.  int rev; 
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
68e0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
68f0: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  der */.  int fla
6900: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
6910: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
6920: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
6930: 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  robe */.  int nE
6940: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
6950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6960: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
6970: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75  traints */.  dou
6980: 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
6990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
69a0: 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
69b0: 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62   */..  TRACE(("b
69c0: 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
69d0: 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c   notReady=%x\n",
69e0: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
69f0: 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a  me, notReady));.
6a00: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
6a10: 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  a rowid=EXPR or 
6a20: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63  rowid IN (...) c
6a30: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
6a40: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
6a50: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
6a60: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
6a70: 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69  Q|WO_IN, 0);.  i
6a80: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
6a90: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
6aa0: 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20   *ppIndex = 0;. 
6ab0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57     bestFlags = W
6ac0: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20  HERE_ROWID_EQ;. 
6ad0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70     if( pTerm->op
6ae0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
6af0: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  {.      /* Rowid
6b00: 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  == is always the
6b10: 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f   best pick.  Loo
6b20: 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42  k no further.  B
6b30: 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20  ecause only.    
6b40: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f    ** a single ro
6b50: 77 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20  w is generated, 
6b60: 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73  output is always
6b70: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
6b80: 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67   */.      *pFlag
6b90: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
6ba0: 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55  EQ | WHERE_UNIQU
6bb0: 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d  E;.      *pnEq =
6bc0: 20 31 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   1;.      TRACE(
6bd0: 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f  ("... best is ro
6be0: 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wid\n"));.      
6bf0: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
6c00: 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72  }else if( (pExpr
6c10: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29   = pTerm->pExpr)
6c20: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
6c30: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
6c40: 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20  (LIST): cost is 
6c50: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
6c60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
6c70: 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ist.      ** ele
6c80: 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
6c90: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45   lowestCost = pE
6ca0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
6cb0: 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  r;.      lowestC
6cc0: 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f  ost *= estLog(lo
6cd0: 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d  westCost);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
6cf0: 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29  owid IN (SELECT)
6d00: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
6d10: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
6d20: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
6d30: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
6d40: 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65  sult of the inne
6d50: 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61  r select.  We ha
6d60: 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74  ve no way to est
6d70: 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  imate.      ** t
6d80: 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b  hat value so mak
6d90: 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20  e a wild guess. 
6da0: 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  */.      lowestC
6db0: 6f 73 74 20 3d 20 32 30 30 2e 30 3b 0a 20 20 20  ost = 200.0;.   
6dc0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
6dd0: 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74  .. rowid IN cost
6de0: 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73  : %.9g\n", lowes
6df0: 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
6e00: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
6e10: 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20  cost of a table 
6e20: 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20  scan.  If we do 
6e30: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e  not know how man
6e40: 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61  y.  ** entries a
6e50: 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  re in the table,
6e60: 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61   use 1 million a
6e70: 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a  s a guess..  */.
6e80: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
6e90: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
6ea0: 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f   cost = pProbe ?
6eb0: 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
6ec0: 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 2e 30  t[0] : 1000000.0
6ed0: 3b 0a 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20  ;.  TRACE(("... 
6ee0: 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20  table scan base 
6ef0: 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63  cost: %.9g\n", c
6f00: 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d  ost));.  flags =
6f10: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
6f20: 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  GE;..  /* Check 
6f30: 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
6f40: 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f  on a range of ro
6f50: 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20  wids in a table 
6f60: 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  scan..  */.  pTe
6f70: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
6f80: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
6f90: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
6fa0: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
6fb0: 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
6fc0: 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54  ){.    if( findT
6fd0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
6fe0: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
6ff0: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a  LT|WO_LE, 0) ){.
7000: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
7010: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
7020: 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e        cost *= 0.
7030: 33 33 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  333;  /* Guess t
7040: 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65  hat rowid<EXPR e
7050: 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
7060: 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a  irds or rows */.
7070: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69      }.    if( fi
7080: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
7090: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
70a0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20  WO_GT|WO_GE, 0) 
70b0: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
70c0: 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
70d0: 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2a 3d  T;.      cost *=
70e0: 20 30 2e 33 33 33 3b 20 20 2f 2a 20 47 75 65 73   0.333;  /* Gues
70f0: 73 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50  s that rowid>EXP
7100: 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
7110: 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20  -thirds of rows 
7120: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  */.    }.    TRA
7130: 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72  CE(("... rowid r
7140: 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73  ange reduces cos
7150: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
7160: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
7170: 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20     flags = 0;.  
7180: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
7190: 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e  able scan does n
71a0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
71b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
71c0: 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68  increase.  ** th
71d0: 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20  e cost by NlogN 
71e0: 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70  to cover the exp
71f0: 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e  ense of sorting.
7200: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
7210: 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f  By ){.    if( so
7220: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43  rtableByRowid(iC
7230: 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72  ur, pOrderBy, &r
7240: 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ev) ){.      fla
7250: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
7260: 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  RBY|WHERE_ROWID_
7270: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28  RANGE;.      if(
7280: 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
7290: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
72a0: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
72b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
72c0: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
72d0: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
72e0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f    TRACE(("... so
72f0: 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20  rting increases 
7300: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
7310: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   cost));.    }. 
7320: 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f   }.  if( cost<lo
7330: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
7340: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
7350: 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73  t;.    bestFlags
7360: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
7370: 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68   /* Look at each
7380: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
7390: 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72  or(; pProbe; pPr
73a0: 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
73b0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20  t){.    int i;  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
73e0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62  nter */.    doub
73f0: 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20  le inMultiplier 
7400: 3d 20 31 2e 30 3b 0a 0a 20 20 20 20 54 52 41 43  = 1.0;..    TRAC
7410: 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73  E(("... index %s
7420: 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  :\n", pProbe->zN
7430: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
7440: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
7450: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
7460: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
7470: 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a   satisfied.    *
7480: 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73  * by x=EXPR cons
7490: 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20  traints or x IN 
74a0: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
74b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c  s..    */.    fl
74c0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
74d0: 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e  (i=0; i<pProbe->
74e0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
74f0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
7500: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  obe->aiColumn[i]
7510: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
7520: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
7530: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
7540: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50   WO_EQ|WO_IN, pP
7550: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
7560: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
7570: 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  k;.      flags |
7580: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
7590: 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
75a0: 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57  rm->operator & W
75b0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
75c0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
75d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
75e0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
75f0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
7600: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7610: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20  >pSelect!=0 ){. 
7620: 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
7630: 70 6c 69 65 72 20 2a 3d 20 31 30 30 2e 30 3b 0a  plier *= 100.0;.
7640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7650: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d  ( pExpr->pList!=
7660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
7670: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70  nMultiplier *= p
7680: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
7690: 70 72 20 2b 20 31 2e 30 3b 0a 20 20 20 20 20 20  pr + 1.0;.      
76a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
76b0: 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72  }.    cost = pPr
76c0: 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d  obe->aiRowEst[i]
76d0: 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20   * inMultiplier 
76e0: 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69  * estLog(inMulti
76f0: 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20  plier);.    nEq 
7700: 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72  = i;.    if( pPr
7710: 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
7720: 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20  _None && (flags 
7730: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
7740: 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  N)==0.         &
7750: 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  & nEq==pProbe->n
7760: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
7770: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  flags |= WHERE_U
7780: 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20  NIQUE;.    }.   
7790: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
77a0: 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e  nEq=%d inMult=%.
77b0: 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c  9g cost=%.9g\n",
77c0: 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69   nEq, inMultipli
77d0: 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20  er, cost));..   
77e0: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e   /* Look for ran
77f0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
7800: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45     */.    if( nE
7810: 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
7820: 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  n ){.      int j
7830: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
7840: 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20  umn[nEq];.      
7850: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
7860: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
7870: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
7880: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
7890: 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  , pProbe);.     
78a0: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
78b0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
78c0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
78d0: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  E;.        if( f
78e0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
78f0: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
7900: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72  WO_LT|WO_LE, pPr
7910: 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
7920: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
7930: 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
7940: 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e        cost *= 0.
7950: 33 33 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  333;.        }. 
7960: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
7970: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
7980: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
7990: 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
79a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
79b0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
79c0: 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
79d0: 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b    cost *= 0.333;
79e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
79f0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
7a00: 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  . range reduces 
7a10: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
7a20: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
7a30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
7a40: 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61  dd the additiona
7a50: 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  l cost of sortin
7a60: 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66  g if that is a f
7a70: 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  actor..    */.  
7a80: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
7a90: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  {.      if( (fla
7aa0: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
7ab0: 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20  N_IN)==0 &&.    
7ac0: 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64      isSortingInd
7ad0: 65 78 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  ex(pParse, pProb
7ae0: 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 69  e, pSrc->pTab, i
7af0: 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 6e  Cur, pOrderBy, n
7b00: 45 71 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20  Eq, &rev) ){.   
7b10: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d       if( flags==
7b20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
7b30: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
7b40: 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
7b50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61     }.        fla
7b60: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
7b70: 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RBY;.        if(
7b80: 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
7b90: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
7ba0: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
7bb0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7bc0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  .        cost +=
7bd0: 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
7be0: 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  t);.        TRAC
7bf0: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72  E(("...... order
7c00: 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  by increases cos
7c10: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
7c20: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
7c30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
7c40: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 63  k to see if we c
7c50: 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74 68  an get away with
7c60: 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
7c70: 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20  index without.  
7c80: 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e    ** ever readin
7c90: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  g the table.  If
7ca0: 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
7cb0: 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68  e, then halve th
7cc0: 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
7cd0: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20   this index..   
7ce0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
7cf0: 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73  s && pSrc->colUs
7d00: 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29  ed < (((Bitmask)
7d10: 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
7d20: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
7d30: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b  = pSrc->colUsed;
7d40: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
7d50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7d60: 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
7d70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
7d80: 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t x = pProbe->ai
7d90: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
7da0: 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
7db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
7dc0: 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
7dd0: 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
7de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7df0: 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
7e00: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
7e10: 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
7e20: 20 20 63 6f 73 74 20 2a 3d 20 30 2e 35 3b 0a 20    cost *= 0.5;. 
7e30: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
7e40: 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72  ..... idx-only r
7e50: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
7e60: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
7e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7e80: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
7e90: 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64  dex has achieved
7ea0: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
7eb0: 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73   so far, then us
7ec0: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
7ed0: 20 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65   if( cost < lowe
7ee0: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  stCost ){.      
7ef0: 62 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65  bestIdx = pProbe
7f00: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
7f10: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20  st = cost;.     
7f20: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d   assert( flags!=
7f30: 30 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46  0 );.      bestF
7f40: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
7f50: 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45      bestNEq = nE
7f60: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  q;.    }.  }..  
7f70: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65  /* Report the be
7f80: 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20  st result.  */. 
7f90: 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74   *ppIndex = best
7fa0: 49 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62  Idx;.  TRACE(("b
7fb0: 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c  est index is %s,
7fc0: 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67   cost=%.9g, flag
7fd0: 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c  s=%x, nEq=%d\n",
7fe0: 0a 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78  .        bestIdx
7ff0: 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d   ? bestIdx->zNam
8000: 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f  e : "(none)", lo
8010: 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c  westCost, bestFl
8020: 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a  ags, bestNEq));.
8030: 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74    *pFlags = best
8040: 46 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d  Flags;.  *pnEq =
8050: 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75   bestNEq;.  retu
8060: 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d  rn lowestCost;.}
8070: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  .../*.** Disable
8080: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
8090: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
80a0: 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
80b0: 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
80c0: 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
80d0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
80e0: 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
80f0: 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
8100: 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
8110: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
8120: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
8130: 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
8140: 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
8150: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
8160: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
8170: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
8180: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
8190: 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
81a0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
81b0: 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
81c0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
81d0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
81e0: 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
81f0: 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
8200: 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
8210: 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
8220: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
8230: 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
8240: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
8250: 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
8260: 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
8270: 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
8280: 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
8290: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
82a0: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
82b0: 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
82c0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
82d0: 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
82e0: 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
82f0: 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
8300: 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
8310: 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
8320: 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
8330: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
8340: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
8350: 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
8360: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 65  ptimization.  We
8370: 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
8380: 6f 72 72 65 63 74 0a 2a 2a 20 72 65 73 75 6c 74  orrect.** result
8390: 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
83a0: 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
83b0: 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
83c0: 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 0a 2a 2a   run a little.**
83d0: 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
83e0: 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
83f0: 65 20 61 73 20 6d 75 63 68 20 61 73 20 77 65 20  e as much as we 
8400: 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
8410: 62 6c 69 6e 67 0a 2a 2a 20 74 6f 6f 20 6d 75 63  bling.** too muc
8420: 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
8430: 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
8440: 67 65 74 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  get the wrong an
8450: 73 77 65 72 2e 0a 2a 2a 20 53 65 65 20 74 69 63  swer..** See tic
8460: 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
8470: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
8480: 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
8490: 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
84a0: 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
84b0: 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
84c0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
84d0: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
84e0: 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
84f0: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
8500: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
8510: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
8520: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
8530: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  ){.    pTerm->fl
8540: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
8550: 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
8560: 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
8570: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
8580: 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
8590: 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
85a0: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
85b0: 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
85c0: 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
85d0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
85e0: 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
85f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
8610: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8620: 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66  builds a probe f
8630: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44 65  or an index.  De
8640: 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
8650: 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f 70  *  Check the top
8660: 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73   nColumn entries
8670: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
8680: 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20  If any.**       
8690: 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  of those entries
86a0: 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20   are NULL, jump 
86b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 62  immediately to b
86c0: 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  rk,.**       whi
86d0: 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20 65  ch is the loop e
86e0: 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e  xit, since no in
86f0: 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d  dex entry will m
8700: 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69 66  atch.**       if
8710: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
8720: 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a   key is NULL..**
8730: 0a 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72  .**    *  Constr
8740: 75 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72  uct a probe entr
8750: 79 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e  y from the top n
8760: 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69  Column entries i
8770: 6e 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73  n.**       the s
8780: 74 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69  tack with affini
8790: 74 69 65 73 20 61 70 70 72 6f 70 72 69 61 74 65  ties appropriate
87a0: 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e   for index pIdx.
87b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
87c0: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
87d0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 43 6f  Vdbe *v, int nCo
87e0: 6c 75 6d 6e 2c 20 69 6e 74 20 62 72 6b 2c 20 49  lumn, int brk, I
87f0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 73  ndex *pIdx){.  s
8800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8810: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
8820: 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33  nColumn, sqlite3
8830: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8840: 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  v)+3);.  sqlite3
8850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8860: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
8870: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
8880: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
8890: 20 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69   0, brk);.  sqli
88a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
88b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
88c0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71  Column, 0);.  sq
88d0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
88e0: 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a  tyStr(v, pIdx);.
88f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
8900: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
8910: 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
8920: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
8930: 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
8940: 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
8950: 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
8960: 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
8970: 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
8980: 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
8990: 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
89a0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
89b0: 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
89c0: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
89d0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
89e0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
89f0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
8a00: 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
8a10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
8a20: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
8a30: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
8a40: 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
8a50: 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
8a60: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
8a70: 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
8a80: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
8a90: 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
8aa0: 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
8ab0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
8ac0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
8ad0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
8ae0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8af0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
8b00: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8b10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
8b20: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
8b30: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
8b40: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
8b50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c  ed */.  int brk,
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
8b70: 75 6d 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e  ump here to aban
8b80: 64 6f 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  don the loop */.
8b90: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
8ba0: 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65  evel  /* When le
8bb0: 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
8bc0: 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
8bd0: 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20  rking on */.){. 
8be0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
8bf0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  m->pExpr;.  if( 
8c00: 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b  pX->op!=TK_IN ){
8c10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
8c20: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
8c30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
8c40: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
8c50: 69 67 68 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  ight);.#ifndef S
8c60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
8c70: 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
8c80: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 69   int iTab;.    i
8c90: 6e 74 20 2a 61 49 6e 3b 0a 20 20 20 20 56 64 62  nt *aIn;.    Vdb
8ca0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8cb0: 56 64 62 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Vdbe;..    sqlit
8cc0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
8cd0: 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20  pParse, pX);.   
8ce0: 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
8cf0: 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
8d00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
8d10: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 62 72 6b  ewind, iTab, brk
8d20: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
8d30: 6e 74 28 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c  nt((v, "# %.*s",
8d40: 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d   pX->span.n, pX-
8d50: 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 70  >span.z));.    p
8d60: 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20  Level->nIn++;.  
8d70: 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f    pLevel->aInLoo
8d80: 70 20 3d 20 61 49 6e 20 3d 20 73 71 6c 69 74 65  p = aIn = sqlite
8d90: 52 65 61 6c 6c 6f 63 28 70 4c 65 76 65 6c 2d 3e  Realloc(pLevel->
8da0: 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
8dd0: 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
8de0: 5b 30 5d 29 2a 33 2a 70 4c 65 76 65 6c 2d 3e 6e  [0])*3*pLevel->n
8df0: 49 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 49 6e  In);.    if( aIn
8e00: 20 29 7b 0a 20 20 20 20 20 20 61 49 6e 20 2b 3d   ){.      aIn +=
8e10: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a 33 20 2d   pLevel->nIn*3 -
8e20: 20 33 3b 0a 20 20 20 20 20 20 61 49 6e 5b 30 5d   3;.      aIn[0]
8e30: 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
8e40: 20 20 61 49 6e 5b 31 5d 20 3d 20 69 54 61 62 3b    aIn[1] = iTab;
8e50: 0a 20 20 20 20 20 20 61 49 6e 5b 32 5d 20 3d 20  .      aIn[2] = 
8e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e70: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
8e80: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Tab, 0);.    }el
8e90: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
8ea0: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nIn = 0;.    }
8eb0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
8ec0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
8ed0: 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  , pTerm);.}../*.
8ee0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8ef0: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
8f00: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
8f10: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
8f20: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  r an.** index.  
8f30: 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  The values for a
8f40: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
8f50: 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  re left on the s
8f60: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
8f70: 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
8f80: 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
8f90: 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
8fa0: 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
8fb0: 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
8fc0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
8fd0: 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
8fe0: 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
8ff0: 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
9000: 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
9010: 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
9020: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9030: 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
9040: 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
9050: 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
9060: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
9070: 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
9080: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
9090: 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
90a0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
90b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
90c0: 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
90d0: 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
90e0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
90f0: 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
9100: 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20  will be left.** 
9110: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61  on the stack - a
9120: 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20   is the deepest 
9130: 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f  and b the shallo
9140: 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  west..**.** In t
9150: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
9160: 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
9170: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
9180: 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
9190: 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
91a0: 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
91b0: 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
91c0: 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
91d0: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
91e0: 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
91f0: 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
9200: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
9210: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ry cell..**.** T
9220: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
9230: 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
9240: 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
9250: 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a   cell and puts.*
9260: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
9270: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
9280: 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  l in pLevel->iMe
9290: 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61  m.  The code tha
92a0: 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
92b0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
92c0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f   pLevel->iMem to
92d0: 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
92e0: 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
92f0: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
9300: 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
9310: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
9320: 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
9330: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
9340: 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
9350: 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
9360: 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
9370: 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
9380: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45  ic void codeAllE
9390: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
93a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
93b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
93c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
93d0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
93e0: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
93f0: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
9400: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
9410: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
9420: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
9430: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
9440: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
9450: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
9460: 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
9470: 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
9480: 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
9490: 20 69 6e 74 20 62 72 6b 20 20 20 20 20 20 20 20   int brk        
94a0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
94b0: 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20 6c  ere to end the l
94c0: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
94d0: 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
94e0: 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
94f0: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
9500: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
9510: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  to code */.  int
9520: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b   termsInMem = 0;
9530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
9540: 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76 61 6c   true, store val
9550: 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c  ue in mem[] cell
9560: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
9570: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
9580: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
9590: 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
95a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
95b0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
95c0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20  = pLevel->pIdx; 
95d0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
95e0: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
95f0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
9600: 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
9610: 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
9620: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
9630: 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
9640: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
9660: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
9670: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
96a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
96b0: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
96c0: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
96d0: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
96e0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
96f0: 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77 61 79  m..  ** We alway
9700: 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73 74 20  s need at least 
9710: 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  one used to stor
9720: 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69  e the loop termi
9730: 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65  nator.  ** value
9740: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
9750: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77 65 27  IN operators we'
9760: 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20  ll need one for 
9770: 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20  each == or.  ** 
9780: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  IN constraint.. 
9790: 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d   */.  pLevel->iM
97a0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
97b0: 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c 65 76 65  m++;.  if( pLeve
97c0: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
97d0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20  _COLUMN_IN ){.  
97e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
97f0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
9800: 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20     termsInMem = 
9810: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
9820: 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
9830: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
9840: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 31   */.  for(j=0; 1
9850: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
9860: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
9870: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d  mn[j];.    pTerm
9880: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
9890: 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
98a0: 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
98b0: 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
98c0: 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
98d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
98e0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
98f0: 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
9900: 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
9910: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
9920: 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29  rm, brk, pLevel)
9930: 3b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73 49  ;.    if( termsI
9940: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  nMem ){.      sq
9950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9960: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
9970: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c  Level->iMem+j+1,
9980: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
9990: 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71 20   assert( j==nEq 
99a0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
99b0: 72 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74  re all the const
99c0: 72 61 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65  raint values are
99d0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
99e0: 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20  he stack.  */.  
99f0: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
9a00: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
9a10: 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
9a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9a30: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
9a40: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a  , pLevel->iMem+j
9a50: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  +1, 0);.    }.  
9a60: 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  }.}..#ifdef SQLI
9a70: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
9a80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
9a90: 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
9aa0: 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
9ab0: 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
9ac0: 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
9ad0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
9ae0: 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
9af0: 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
9b00: 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
9b10: 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
9b20: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
9b30: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
9b40: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
9b50: 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
9b60: 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
9b70: 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
9b80: 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
9b90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
9ba0: 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
9bb0: 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9bd0: 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
9be0: 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
9bf0: 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
9c00: 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f  ITE_TEST */..../
9c10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
9c20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
9c30: 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
9c40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
9c50: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
9c60: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
9c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
9c80: 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
9c90: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
9ca0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
9cb0: 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
9cc0: 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
9cd0: 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
9ce0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
9cf0: 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
9d00: 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
9d10: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9d20: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
9d30: 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
9d40: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
9d50: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
9d60: 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
9d70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9d80: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
9d90: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
9da0: 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
9db0: 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
9dc0: 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
9dd0: 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
9de0: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
9df0: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
9e00: 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
9e10: 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
9e20: 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
9e30: 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
9e40: 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
9e50: 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
9e60: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
9e70: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
9e80: 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
9e90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
9ea0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
9eb0: 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
9ec0: 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
9ed0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
9ee0: 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
9ef0: 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
9f00: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
9f10: 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
9f20: 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
9f30: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
9f40: 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
9f50: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
9f60: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
9f70: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
9f80: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
9f90: 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
9fa0: 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
9fb0: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
9fc0: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
9fe0: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
9ff0: 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
a020: 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
a030: 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
a060: 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
a070: 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
a080: 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
a090: 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
a0a0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
a0b0: 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
a0c0: 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
a0d0: 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
a0e0: 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
a0f0: 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
a100: 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
a110: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
a120: 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
a130: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
a140: 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
a150: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
a160: 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
a170: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
a180: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
a190: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
a1a0: 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
a1b0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
a1c0: 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
a1d0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
a1e0: 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
a1f0: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
a200: 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
a210: 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
a220: 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
a230: 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
a240: 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
a250: 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
a260: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
a270: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
a280: 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
a290: 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
a2a0: 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
a2b0: 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
a2c0: 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
a2d0: 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
a2e0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
a2f0: 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
a300: 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
a310: 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
a320: 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
a330: 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
a340: 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
a350: 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
a360: 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
a370: 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
a380: 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
a390: 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
a3a0: 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
a3b0: 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
a3c0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
a3d0: 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
a3e0: 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
a3f0: 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
a400: 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
a410: 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
a420: 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
a430: 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
a440: 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
a450: 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
a460: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
a470: 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
a480: 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
a490: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
a4a0: 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
a4b0: 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
a4c0: 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
a4d0: 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
a4e0: 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
a4f0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
a500: 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
a510: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
a520: 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
a530: 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
a540: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
a550: 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
a560: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
a570: 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
a580: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
a590: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
a5a0: 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
a5b0: 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
a5c0: 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
a5d0: 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
a5e0: 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
a5f0: 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
a600: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
a610: 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
a620: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
a630: 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
a640: 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
a650: 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
a660: 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
a670: 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
a680: 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
a690: 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
a6a0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
a6b0: 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
a6c0: 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
a6d0: 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
a6e0: 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
a6f0: 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
a700: 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
a710: 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
a720: 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
a730: 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
a740: 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
a750: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a760: 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
a770: 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
a780: 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
a790: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
a7a0: 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
a7b0: 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
a7c0: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
a7d0: 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
a7e0: 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
a7f0: 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
a800: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
a810: 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
a820: 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
a830: 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
a840: 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
a850: 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
a860: 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
a870: 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
a880: 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
a890: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
a8a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
a8b0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
a8c0: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
a8d0: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
a8e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
a8f0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
a900: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
a910: 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
a920: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
a930: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
a940: 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
a950: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
a960: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
a970: 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
a980: 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
a990: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
a9a0: 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
a9b0: 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
a9c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
a9d0: 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
a9e0: 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
a9f0: 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
aa00: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
aa10: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
aa20: 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
aa30: 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
aa40: 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
aa50: 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
aa60: 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
aa70: 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
aa80: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
aa90: 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
aaa0: 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
aab0: 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
aac0: 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
aad0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
aae0: 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
aaf0: 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
ab00: 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
ab10: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
ab20: 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
ab30: 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
ab40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ab50: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
ab60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
ab70: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
ab80: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
ab90: 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
aba0: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
abb0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
abd0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
abe0: 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
abf0: 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By  /* An ORDER 
ac00: 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
ac10: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  LL */.){.  int i
ac20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac30: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ac40: 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  unter */.  Where
ac50: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
ac60: 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
ac70: 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
ac80: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
ac90: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
aca0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
acb0: 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
acc0: 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
acd0: 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62  ngine */.  int b
ace0: 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20  rk, cont = 0;   
acf0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ad00: 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63  es used during c
ad10: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ode generation *
ad20: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
ad30: 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
ad40: 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
ad50: 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
ad60: 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
ad70: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
ad80: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
ad90: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  e term in the WH
ada0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
adb0: 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b  ExprMaskSet mask
adc0: 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Set;       /* Th
add0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
ade0: 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
adf0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
ae00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
ae10: 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76  RE clause is div
ae20: 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20  ided into these 
ae30: 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
ae40: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
ae50: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
ae60: 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
ae70: 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
ae80: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
ae90: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
aea0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
aeb0: 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
aec0: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
aed0: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
aee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
aef0: 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
af00: 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
af10: 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af30: 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
af40: 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b  ion of all wc.a[
af50: 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a  ].flags */..  /*
af60: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
af70: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
af80: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
af90: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
afa0: 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
afb0: 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
afc0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
afd0: 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
afe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
aff0: 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
b000: 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
b010: 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
b020: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b030: 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
b040: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
b050: 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
b060: 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
b070: 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
b080: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
b090: 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
b0a0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
b0b0: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61   initMaskSet(&ma
b0c0: 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
b0d0: 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70  lauseInit(&wc, p
b0e0: 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53  Parse);.  whereS
b0f0: 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65  plit(&wc, pWhere
b100: 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
b110: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
b120: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
b130: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
b140: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
b150: 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
b160: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a  eturn value..  *
b170: 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
b180: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
b190: 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
b1a0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
b1b0: 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
b1c0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
b1d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
b1e0: 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
b1f0: 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a  BeginNoMem;.  }.
b200: 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
b210: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
b220: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
b230: 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
b240: 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
b250: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b260: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  l(v);..  /* Spec
b270: 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
b280: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
b290: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
b2a0: 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
b2b0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
b2c0: 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
b2d0: 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
b2e0: 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
b2f0: 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
b300: 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
b310: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
b320: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 68  prIsConstant(pWh
b330: 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
b340: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
b350: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
b360: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
b370: 31 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  1);.    pWhere =
b380: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   0;.  }..  /* An
b390: 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
b3a0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
b3b0: 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
b3c0: 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
b3d0: 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
b3e0: 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
b3f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
b400: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
b410: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
b420: 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
b430: 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
b440: 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
b450: 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
b460: 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
b470: 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
b480: 65 79 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  ey added virtual
b490: 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
b4a0: 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
b4b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
b4c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
b4d0: 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
b4e0: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
b4f0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
b500: 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72  sor);.  }.  expr
b510: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c  AnalyzeAll(pTabL
b520: 69 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20 26  ist, &maskSet, &
b530: 77 63 29 3b 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  wc);..  /* Chose
b540: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
b550: 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
b560: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
b570: 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
b580: 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
b590: 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
b5a0: 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
b5b0: 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
b5c0: 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
b5d0: 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
b5e0: 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
b5f0: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
b600: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66     pWInfo->a[].f
b610: 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78  lags     WHERE_x
b620: 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
b630: 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
b640: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
b650: 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
b660: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
b670: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
b680: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
b690: 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e  ].iFrom     When
b6a0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
b6b0: 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
b6c0: 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
b6d0: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
b6e0: 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
b6f0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
b700: 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
b710: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
b720: 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
b730: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
b740: 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a   index.  **.  **
b750: 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
b760: 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
b770: 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
b780: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
b790: 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
b7a0: 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
b7b0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
b7c0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
b7d0: 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
b7e0: 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
b7f0: 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
b800: 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
b810: 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
b820: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
b830: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
b840: 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
b850: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
b860: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
b870: 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
b880: 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
b890: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8b0: 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65  Flags asssociate
b8c0: 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
b8d0: 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
b900: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
b910: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63   */.    double c
b920: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
b930: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
b940: 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
b950: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b970: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
b980: 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
b990: 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
b9a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
b9b0: 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
b9c0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
b9d0: 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67      int bestFlag
b9e0: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
b9f0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
ba00: 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
ba10: 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45  /.    int bestNE
ba20: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
ba30: 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61    /* nEq associa
ba40: 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
ba50: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77  /.    double low
ba60: 65 73 74 43 6f 73 74 20 3d 20 31 2e 30 65 39 39  estCost = 1.0e99
ba70: 3b 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65  ; /* Cost of the
ba80: 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e   pBest */.    in
ba90: 74 20 62 65 73 74 4a 3b 20 20 20 20 20 20 20 20  t bestJ;        
baa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bab0: 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20   value of j */. 
bac0: 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20     Bitmask m;   
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bae0: 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20  * Bitmask value 
baf0: 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a  for j or bestJ *
bb00: 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  /..    for(j=iFr
bb10: 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
bb20: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
bb30: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
bb40: 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
bb50: 7b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d  {.      m = getM
bb60: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
bb70: 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
bb80: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20 26  ;.      if( (m &
bb90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
bba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
bbb0: 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
bbc0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
bbd0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
bbe0: 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65   cost = bestInde
bbf0: 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70  x(pParse, &wc, p
bc00: 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
bc10: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
bc20: 20 20 20 20 20 20 20 20 20 20 28 6a 3d 3d 30 20            (j==0 
bc30: 26 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20  && ppOrderBy) ? 
bc40: 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a  *ppOrderBy : 0,.
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66         &pIdx, &f
bc70: 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20  lags, &nEq);.   
bc80: 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65     if( cost<lowe
bc90: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  stCost ){.      
bca0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
bcb0: 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65  ost;.        pBe
bcc0: 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
bcd0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
bce0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65  lags;.        be
bcf0: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
bd00: 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a       bestJ = j;.
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
bd20: 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69  ( (pTabItem->joi
bd30: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
bd40: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  !=0.         || 
bd50: 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  (j>0 && (pTabIte
bd60: 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  m[-1].jointype &
bd70: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 29 0a 20 20   JT_LEFT)!=0).  
bd80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
bd90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bda0: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 62 65 73    }.    if( (bes
bdb0: 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  tFlags & WHERE_O
bdc0: 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
bdd0: 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
bde0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
bdf0: 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c  dFlags &= bestFl
be00: 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
be10: 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  >flags = bestFla
be20: 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
be30: 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20  pIdx = pBest;.  
be40: 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20    pLevel->nEq = 
be50: 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65  bestNEq;.    pLe
be60: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30  vel->aInLoop = 0
be70: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
be80: 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
be90: 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c  Best ){.      pL
bea0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
beb0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
bec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bed0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
bee0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
bef0: 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
bf00: 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
bf10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
bf20: 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
bf30: 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
bf40: 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 0a 20 20 2f   bestJ;.  }..  /
bf50: 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
bf60: 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
bf70: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
bf80: 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
bf90: 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
bfa0: 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
bfb0: 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
bfc0: 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
bfd0: 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
bfe0: 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
bff0: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
c000: 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
c010: 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
c020: 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
c030: 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
c040: 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
c050: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
c060: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
c070: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
c080: 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
c090: 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
c0a0: 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
c0b0: 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
c0c0: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
c0d0: 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
c0e0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
c0f0: 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
c100: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
c110: 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  Tab;.    Index *
c120: 70 49 78 3b 0a 20 20 20 20 69 6e 74 20 69 49 64  pIx;.    int iId
c130: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
c140: 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 70 54 61  IdxCur;..    pTa
c150: 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
c160: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
c170: 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
c180: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
c190: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
c1a0: 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61  Transient || pTa
c1b0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
c1c0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
c1d0: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
c1e0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
c1f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c200: 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52  te3OpenTableForR
c210: 65 61 64 69 6e 67 28 76 2c 20 70 54 61 62 49 74  eading(v, pTabIt
c220: 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 54 61  em->iCursor, pTa
c230: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  b);.    }.    pL
c240: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
c250: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
c260: 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78 20  r;.    if( (pIx 
c270: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
c280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c290: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c2a0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 78 2d  OP_Integer, pIx-
c2b0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
c2c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c2d0: 22 23 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  "# %s", pIx->zNa
c2e0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
c2f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c300: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
c310: 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20  ur, pIx->tnum,. 
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 78 2d      (char*)&pIx-
c340: 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
c350: 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INFO);.    }.   
c360: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
c370: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
c380: 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
c390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c3a0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
c3b0: 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c  olumns, iIdxCur,
c3c0: 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29   pIx->nColumn+1)
c3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c3e0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
c3f0: 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
c400: 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  ->iDb);.  }.  pW
c410: 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
c420: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c430: 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65  ddr(v);..  /* Ge
c440: 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
c450: 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
c460: 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
c470: 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
c480: 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
c490: 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
c4a0: 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
c4b0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
c4c0: 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
c4d0: 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
c4e0: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
c4f0: 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
c500: 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
c510: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
c520: 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69  pLevel++){.    i
c530: 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  nt j;.    int iC
c540: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
c550: 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20  Cursor;  /* The 
c560: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
c570: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
c580: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
c590: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
c5a0: 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
c5b0: 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
c5c0: 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  xCur;       /* T
c5d0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
c5e0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
c5f0: 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c      int omitTabl
c600: 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e;     /* True i
c610: 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
c620: 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69  ex only */.    i
c630: 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
c640: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
c650: 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
c660: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
c670: 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
c680: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
c690: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
c6a0: 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
c6b0: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
c6c0: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
c6d0: 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72  Idx;.    iIdxCur
c6e0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
c6f0: 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28  ur;.    bRev = (
c700: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
c710: 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
c720: 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65  0;.    omitTable
c730: 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
c740: 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
c750: 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  LY)!=0;..    /* 
c760: 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
c770: 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
c780: 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
c790: 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  tructions.    **
c7a0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
c7b0: 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
c7c0: 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  brk to break out
c7d0: 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20   of a loop..    
c7e0: 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
c7f0: 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
c800: 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
c810: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
c820: 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
c830: 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65  */.    brk = pLe
c840: 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74  vel->brk = sqlit
c850: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c860: 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70  v);.    cont = p
c870: 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71  Level->cont = sq
c880: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
c890: 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  el(v);..    /* I
c8a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
c8b0: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
c8c0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
c8d0: 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20  allocate and.   
c8e0: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
c8f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
c900: 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
c910: 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
c920: 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f  any.    ** row o
c930: 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
c940: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
c950: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
c960: 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
c970: 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f  (pTabItem[-1].jo
c980: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
c990: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
c9a0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  ( !pParse->nMem 
c9b0: 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  ) pParse->nMem++
c9c0: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
c9d0: 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72  iLeftJoin = pPar
c9e0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
c9f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca00: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
ca10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ca20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ca30: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
ca40: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20  vel->iLeftJoin, 
ca50: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
ca60: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69  mment((v, "# ini
ca70: 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
ca80: 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
ca90: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 65    }..    if( pLe
caa0: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
cab0: 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
cac0: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
cad0: 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
cae0: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
caf0: 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
cb00: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
cb10: 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
cb20: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
cb30: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
cb40: 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   Or.      **    
cb50: 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
cb60: 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
cb70: 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
cb80: 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20  IN (...)".      
cb90: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
cba0: 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  truct..      */.
cbb0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
cbc0: 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
cbd0: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
cbe0: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
cbf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cc00: 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20  Term!=0 );.     
cc10: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
cc20: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
cc30: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
cc40: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
cc50: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
cc60: 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
cc70: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75  );.      codeEqu
cc80: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
cc90: 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
cca0: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  evel);.      sql
ccb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ccc0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31   OP_MustBeInt, 1
ccd0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71  , brk);.      sq
cce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ccf0: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
cd00: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
cd10: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cd20: 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
cd30: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
cd40: 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
cd50: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
cd60: 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
cd70: 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
cd80: 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
cd90: 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
cda0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
cdb0: 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
cdc0: 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eld..      */.  
cdd0: 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d      int testOp =
cde0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
cdf0: 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
ce00: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
ce10: 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
ce20: 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
ce30: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
ce40: 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
ce50: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
ce60: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
ce70: 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
ce80: 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
ce90: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
cea0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
ceb0: 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
cec0: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
ced0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
cee0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53  tart;.        pS
cef0: 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
cf00: 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
cf10: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
cf20: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
cf30: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
cf40: 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53  .        pX = pS
cf50: 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
cf60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
cf70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
cf80: 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
cf90: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
cfa0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cfb0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cfc0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
cfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cfe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
cff0: 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d  rceInt, pX->op==
d000: 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LE || pX->op=
d010: 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20  =TK_GT, brk);.  
d020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d030: 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f  eAddOp(v, bRev ?
d040: 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f   OP_MoveLt : OP_
d050: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72  MoveGe, iCur, br
d060: 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
d070: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
d080: 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  ));.        disa
d090: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
d0a0: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  pStart);.      }
d0b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d0c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d0d0: 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
d0e0: 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
d0f0: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
d100: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  }.      if( pEnd
d110: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
d120: 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58   *pX;.        pX
d130: 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
d140: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d150: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
d160: 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
d170: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
d180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d190: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d1a0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
d1b0: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
d1c0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
d1d0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Mem++;.        s
d1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d1f0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
d200: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
d210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
d220: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
d230: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
d240: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
d250: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
d260: 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
d270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d280: 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
d290: 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
d2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d2b0: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
d2c0: 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
d2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
d2e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
d2f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d300: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
d310: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
d320: 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
d330: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
d340: 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
d350: 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
d360: 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
d370: 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
d380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d390: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
d3a0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
d3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
d3d0: 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
d3e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
d3f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d400: 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27 2c 20 62  , testOp, 'n', b
d410: 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rk);.      }.   
d420: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
d430: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
d440: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
d450: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33  .      /* Case 3
d460: 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  : The WHERE clau
d470: 73 65 20 74 65 72 6d 20 74 68 61 74 20 72 65 66  se term that ref
d480: 65 72 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  ers to the right
d490: 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20  -most.      **  
d4a0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66         column of
d4b0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e   the index is an
d4c0: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f   inequality.  Fo
d4d0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20  r example, if.  
d4e0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
d4f0: 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28  he index is on (
d500: 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57  x,y,z) and the W
d510: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f  HERE clause is o
d520: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20  f the.      **  
d530: 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35         form "x=5
d540: 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20   AND y<10" then 
d550: 74 68 69 73 20 63 61 73 65 20 69 73 20 75 73 65  this case is use
d560: 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20  d.  Only the.   
d570: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69     **         ri
d580: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
d590: 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
d5a0: 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
d5b0: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  must.      **   
d5c0: 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
d5d0: 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
d5e0: 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  ators..      **.
d5f0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
d600: 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
d610: 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
d620: 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
d630: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  clause.      ** 
d640: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
d650: 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
d660: 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
d670: 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
d680: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
d690: 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
d6a0: 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
d6b0: 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
d6c0: 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  BY..      */.   
d6d0: 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
d6e0: 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
d6f0: 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20  evel->nEq;.     
d700: 20 69 6e 74 20 6c 65 46 6c 61 67 3d 30 2c 20 67   int leFlag=0, g
d710: 65 46 6c 61 67 3d 30 3b 0a 20 20 20 20 20 20 69  eFlag=0;.      i
d720: 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20  nt testOp;.     
d730: 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20   int topLimit = 
d740: 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
d750: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
d760: 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20  )!=0;.      int 
d770: 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76  btmLimit = (pLev
d780: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
d790: 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b  E_BTM_LIMIT)!=0;
d7a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
d7b0: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
d7c0: 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
d7d0: 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
d7e0: 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
d7f0: 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20  * and level the 
d800: 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
d810: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
d820: 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
d830: 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
d840: 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
d850: 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
d860: 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20  Ready, brk);..  
d870: 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65      /* Duplicate
d880: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
d890: 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75 73  rm values becaus
d8a0: 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20  e they will all 
d8b0: 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  be.      ** used
d8c0: 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20   twice: once to 
d8d0: 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61  make the termina
d8e0: 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63  tion key and onc
d8f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20  e to make the.  
d900: 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
d910: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d920: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
d930: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
d940: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d950: 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31  v, OP_Dup, nEq-1
d960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
d970: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
d980: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
d990: 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20 74   key.  This is t
d9a0: 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 61  he key value tha
d9b0: 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
d9c0: 65 6e 64 20 74 68 65 20 73 65 61 72 63 68 2e 20  end the search. 
d9d0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65 72   There is no ter
d9e0: 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69 66 20  mination key if 
d9f0: 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  there.      ** a
da00: 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79 20 74  re no equality t
da10: 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e  erms and no "X<.
da20: 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20 20 20  .." term..      
da30: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32  **.      ** 2002
da40: 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65  -Dec-04: On a re
da50: 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e  verse-order scan
da60: 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20  , the so-called 
da70: 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20  "termination".  
da80: 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75      ** key compu
da90: 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c 79 20  ted here really 
daa0: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 68  ends up being th
dab0: 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  e start key..   
dac0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
dad0: 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  topLimit ){.    
dae0: 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
daf0: 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
db00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
db10: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
db20: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
db30: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
db40: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
db50: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
db60: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
db70: 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
db80: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
db90: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
dba0: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
dbb0: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
dbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dbd0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dbe0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
dbf0: 20 20 20 20 6c 65 46 6c 61 67 20 3d 20 70 58 2d      leFlag = pX-
dc00: 3e 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20 20 20 20  >op==TK_LE;.    
dc10: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
dc20: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
dc30: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
dc40: 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20   OP_IdxGE;.     
dc50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc60: 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f  testOp = nEq>0 ?
dc70: 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e   OP_IdxGE : OP_N
dc80: 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 6c 65 46  oop;.        leF
dc90: 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lag = 1;.      }
dca0: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
dcb0: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
dcc0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
dcd0: 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b   nEq + topLimit;
dce0: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
dcf0: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
dd00: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
dd10: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
dd20: 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c 20 70 49  v, nCol, brk, pI
dd30: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
dd40: 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
dd50: 20 20 20 69 6e 74 20 6f 70 20 3d 20 6c 65 46 6c     int op = leFl
dd60: 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a  ag ? OP_MoveLe :
dd70: 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20   OP_MoveLt;.    
dd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd90: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49  eAddOp(v, op, iI
dda0: 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
ddb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ddc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ddd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
dde0: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
ddf0: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Mem, 1);.       
de00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
de10: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
de20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de30: 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  dOp(v, OP_Last, 
de40: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
de50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
de60: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 74   Generate the st
de70: 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69  art key.  This i
de80: 73 20 74 68 65 20 6b 65 79 20 74 68 61 74 20 64  s the key that d
de90: 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72  efines the lower
dea0: 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20  .      ** bound 
deb0: 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  on the search.  
dec0: 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72  There is no star
ded0: 74 20 6b 65 79 20 69 66 20 74 68 65 72 65 20 61  t key if there a
dee0: 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65  re no.      ** e
def0: 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e  quality terms an
df00: 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  d if there is no
df10: 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20   "X>..." term.  
df20: 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  In.      ** that
df30: 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20   case, generate 
df40: 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72  a "Rewind" instr
df50: 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20  uction in place 
df60: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
df70: 73 74 61 72 74 20 6b 65 79 20 73 65 61 72 63 68  start key search
df80: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
df90: 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
dfa0: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
dfb0: 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  a reverse-order 
dfc0: 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63  search, the so-c
dfd0: 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22  alled.      ** "
dfe0: 73 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c  start" key reall
dff0: 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
e000: 75 73 65 64 20 61 73 20 74 68 65 20 74 65 72 6d  used as the term
e010: 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20  ination key..   
e020: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
e030: 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
e040: 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
e050: 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
e060: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
e070: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
e080: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
e090: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
e0a0: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  , WO_GT|WO_GE, p
e0b0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
e0c0: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
e0d0: 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
e0e0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
e0f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
e100: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
e110: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
e120: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
e130: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e140: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
e150: 20 20 20 20 67 65 46 6c 61 67 20 3d 20 70 58 2d      geFlag = pX-
e160: 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20 20 20 20  >op==TK_GE;.    
e170: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
e180: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
e190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e1a0: 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20 31 3b       geFlag = 1;
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e1c0: 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c  f( nEq>0 || btmL
e1d0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e1e0: 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
e1f0: 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20   btmLimit;.     
e200: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
e210: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c  be(v, nCol, brk,
e220: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
e230: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
e240: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
e250: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
e260: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  m++;.          s
e270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e280: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e290: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
e2a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
e2b0: 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20  Op = OP_IdxLT;. 
e2c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e2d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
e2e0: 20 67 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76   geFlag ? OP_Mov
e2f0: 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b  eGe : OP_MoveGt;
e300: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
e320: 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  p, iIdxCur, brk)
e330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
e350: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
e360: 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
e370: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e390: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
e3a0: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
e3b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e3c0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
e3d0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
e3e0: 6f 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20 69  oop.  If there i
e3f0: 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  s a termination.
e400: 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20        ** key we 
e410: 68 61 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72  have to test for
e420: 20 74 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62   that key and ab
e430: 6f 72 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ort at the top o
e440: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  f the.      ** l
e450: 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
e460: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
e470: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e480: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  dr(v);.      if(
e490: 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
e4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e4c0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
e4d0: 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
e4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e4f0: 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70  eAddOp(v, testOp
e500: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
e510: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6c 65  .        if( (le
e520: 46 6c 61 67 20 26 26 20 21 62 52 65 76 29 20 7c  Flag && !bRev) |
e530: 7c 20 28 21 67 65 46 6c 61 67 20 26 26 20 62 52  | (!geFlag && bR
e540: 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ev) ){.         
e550: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e560: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22 2c  geP3(v, -1, "+",
e570: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e590: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b  AddOp(v, OP_RowK
e5b0: 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  ey, iIdxCur, 0);
e5c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
e5e0: 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 20 2b 20 74  xIsNull, nEq + t
e5f0: 6f 70 4c 69 6d 69 74 2c 20 63 6f 6e 74 29 3b 0a  opLimit, cont);.
e600: 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
e610: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
e620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e630: 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
e640: 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
e650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e660: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
e670: 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
e680: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e690: 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
e6a0: 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
e6b0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
e6c0: 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
e6d0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
e6e0: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
e6f0: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
e700: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
e710: 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  xCur;.      pLev
e720: 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
e730: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
e740: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e750: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b  ERE_COLUMN_EQ ){
e760: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34  .      /* Case 4
e770: 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
e780: 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72  ndex and all ter
e790: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
e7a0: 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20 20  clause that.    
e7b0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65    **          re
e7c0: 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78  fer to the index
e7d0: 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20   using the "==" 
e7e0: 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
e7f0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
e800: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
e810: 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
e820: 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20 20 20  vel->nEq;..     
e830: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e840: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
e850: 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
e860: 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
e870: 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c  N.      ** and l
e880: 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73 20  evel the values 
e890: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f  of those terms o
e8a0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  n the stack..   
e8b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65     */.      code
e8c0: 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
e8d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
e8e0: 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20   &wc, notReady, 
e8f0: 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  brk);..      /* 
e900: 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c  Generate a singl
e910: 65 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20  e key that will 
e920: 62 65 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20  be used to both 
e930: 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e  start and termin
e940: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
e950: 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f   search.      */
e960: 0a 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65  .      buildInde
e970: 78 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 62  xProbe(v, nEq, b
e980: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
e990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9a0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
e9b0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
e9c0: 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  0);..      /* Ge
e9d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 28 31 29 20  nerate code (1) 
e9e0: 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66  to move to the f
e9f0: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c  irst matching el
ea00: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
ea10: 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  le..      ** The
ea20: 6e 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  n generate code 
ea30: 28 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74  (2) that jumps t
ea40: 6f 20 22 62 72 6b 22 20 61 66 74 65 72 20 74 68  o "brk" after th
ea50: 65 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  e cursor is past
ea60: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
ea70: 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d  st matching elem
ea80: 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
ea90: 2e 20 20 54 68 65 20 63 6f 64 65 20 28 31 29 20  .  The code (1) 
eaa0: 69 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20  is executed.    
eab0: 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69    ** once to ini
eac0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72  tialize the sear
ead0: 63 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29  ch, the code (2)
eae0: 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66   is executed bef
eaf0: 6f 72 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a  ore each.      *
eb00: 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  * iteration of t
eb10: 68 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69  he scan to see i
eb20: 66 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66  f the scan has f
eb30: 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20  inished. */.    
eb40: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
eb50: 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e        /* Scan in
eb60: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
eb70: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
eb80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
eb90: 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72  _MoveLe, iIdxCur
eba0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
ebb0: 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
ebc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ebd0: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
ebe0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
ebf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ec00: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20  Op(v, OP_IdxLT, 
ec10: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
ec20: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f         pLevel->o
ec30: 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
ec40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec50: 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65    /* Scan in the
ec60: 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a   forward order *
ec70: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
ec80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ec90: 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72  _MoveGe, iIdxCur
eca0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
ecb0: 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
ecc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ecd0: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
ece0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
ecf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ed00: 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49  (v, OP_IdxGE, iI
ed10: 64 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c  dxCur, brk, "+",
ed20: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
ed30: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
ed40: 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
ed50: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ed60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ed70: 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c  RowKey, iIdxCur,
ed80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ed90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eda0: 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71  P_IdxIsNull, nEq
edb0: 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69  , cont);.      i
edc0: 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
edd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ede0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
edf0: 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
ee00: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r, 0);.        s
ee10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ee20: 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
ee30: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
ee40: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
ee50: 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
ee60: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
ee70: 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tart;.    }else{
ee80: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35  .      /* Case 5
ee90: 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
eea0: 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
eeb0: 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
eec0: 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ete.      **    
eed0: 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
eee0: 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
eef0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
ef00: 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
ef10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
ef20: 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a  ert( bRev==0 );.
ef30: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
ef40: 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
ef50: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
ef60: 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
ef70: 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
ef80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ef90: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
efa0: 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20   brk);.    }.   
efb0: 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
efc0: 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
efd0: 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  iCur);..    /* I
efe0: 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
eff0: 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
f000: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
f010: 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
f020: 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
f030: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
f040: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
f050: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54     */.    for(pT
f060: 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e  erm=wc.a, j=wc.n
f070: 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
f080: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
f090: 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
f0a0: 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
f0b0: 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
f0c0: 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
f0d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
f0e0: 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
f0f0: 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
f100: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
f110: 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
f120: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
f130: 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
f140: 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
f150: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
f160: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f170: 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
f180: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
f190: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
f1a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f1b0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
f1c0: 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  E, cont, 1);.   
f1d0: 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
f1e0: 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
f1f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
f200: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
f210: 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
f220: 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
f230: 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
f240: 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
f250: 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
f260: 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
f270: 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
f280: 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
f290: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f2a0: 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
f2b0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
f2c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
f2d0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
f2e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f2f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
f300: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
f310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f320: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
f330: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
f340: 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  in, 1);.      Vd
f350: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
f360: 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49   record LEFT JOI
f370: 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20  N hit"));.      
f380: 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
f390: 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b  j=0; j<wc.nTerm;
f3a0: 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
f3b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
f3c0: 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
f3d0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
f3e0: 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
f3f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
f400: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
f410: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
f420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f430: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
f440: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
f450: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
f460: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
f470: 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c  rm->pExpr, cont,
f480: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   1);.        pTe
f490: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
f4a0: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d  M_CODED;.      }
f4b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
f4c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  ef SQLITE_TEST  
f4d0: 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61  /* For testing a
f4e0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
f4f0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65   only */.  /* Re
f500: 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72  cord in the quer
f510: 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69  y plan informati
f520: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
f530: 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  rent table.  ** 
f540: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73  and the index us
f550: 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20  ed to access it 
f560: 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68  (if any).  If th
f570: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20  e table itself. 
f580: 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c   ** is not used,
f590: 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73   its name is jus
f5a0: 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69  t '{}'.  If no i
f5b0: 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a  ndex is used.  *
f5c0: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c  * the index is l
f5d0: 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20  isted as "{}".  
f5e0: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  If the primary k
f5f0: 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20  ey is used the. 
f600: 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69   ** index name i
f610: 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s '*'..  */.  fo
f620: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
f630: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
f640: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
f650: 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65  int n;.    pLeve
f660: 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
f670: 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ];.    pTabItem 
f680: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
f690: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
f6a0: 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d     z = pTabItem-
f6b0: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28  >zAlias;.    if(
f6c0: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62   z==0 ) z = pTab
f6d0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
f6e0: 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  e;.    n = strle
f6f0: 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  n(z);.    if( n+
f700: 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
f710: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
f720: 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
f730: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
f740: 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
f750: 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  LY ){.        st
f760: 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
f770: 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
f780: 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20  , "{}");.       
f790: 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
f7a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f7b0: 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
f7c0: 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
f7d0: 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  Plan], z);.     
f7e0: 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f800: 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
f810: 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
f820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f830: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
f840: 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
f850: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
f860: 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  E) ){.      strc
f870: 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
f880: 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
f890: 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50  "* ");.      nQP
f8a0: 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
f8b0: 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
f8c0: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
f8d0: 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
f8e0: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
f8f0: 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20  an], "{} ");.   
f900: 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
f910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f920: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76   n = strlen(pLev
f930: 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  el->pIdx->zName)
f940: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
f950: 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
f960: 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
f970: 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  )-2 ){.        s
f980: 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
f990: 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
f9a0: 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  ], pLevel->pIdx-
f9b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
f9c0: 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
f9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
f9e0: 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
f9f0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
fa00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
fa10: 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
fa20: 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
fa30: 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
fa40: 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
fa50: 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
fa60: 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
fa70: 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
fa80: 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
fa90: 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
faa0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fab0: 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
fac0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
fad0: 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
fae0: 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
faf0: 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
fb00: 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
fb10: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
fb20: 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
fb30: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
fb40: 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
fb50: 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
fb60: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
fb70: 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
fb80: 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
fb90: 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
fba0: 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
fbb0: 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
fbc0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
fbd0: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  wc);.  sqliteFre
fbe0: 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  e(pWInfo);.  ret
fbf0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fc00: 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
fc10: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
fc20: 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
fc30: 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
fc40: 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
fc50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
fc60: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
fc70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
fc80: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
fc90: 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
fca0: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
fcb0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
fcc0: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
fcd0: 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
fce0: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
fcf0: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a  nfo->pTabList;..
fd00: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
fd10: 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
fd20: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ode..  */.  for(
fd30: 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i=pTabList->nSrc
fd40: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
fd50: 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
fd60: 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
fd70: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
fd80: 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
fd90: 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66  l->cont);.    if
fda0: 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
fdb0: 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
fdc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fdd0: 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
fde0: 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
fdf0: 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p2);.    }.  
fe00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
fe10: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
fe20: 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69  vel->brk);.    i
fe30: 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29  f( pLevel->nIn )
fe40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a  {.      int *a;.
fe50: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
fe60: 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
fe70: 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d  >nIn, a=&pLevel-
fe80: 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b  >aInLoop[j*3-3];
fe90: 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29   j>0; j--, a-=3)
fea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
feb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 61 5b  3VdbeAddOp(v, a[
fec0: 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b  0], a[1], a[2]);
fed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fee0: 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c  qliteFree(pLevel
fef0: 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->aInLoop);.    
ff00: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
ff10: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
ff20: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
ff30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
ff40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ff50: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
ff60: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30  el->iLeftJoin, 0
ff70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ff80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ff90: 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61 64 64 72  NotNull, 1, addr
ffa0: 2b 34 20 2b 20 28 70 4c 65 76 65 6c 2d 3e 69 49  +4 + (pLevel->iI
ffb0: 64 78 43 75 72 3e 3d 30 29 29 3b 0a 20 20 20 20  dxCur>=0));.    
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ffd0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
ffe0: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
fff0: 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  .iCursor, 0);.  
10000 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
10010 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20  iIdxCur>=0 ){.  
10020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10030 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
10040 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
10050 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
10060 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10070 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10080 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
10090 3e 74 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >top);.    }.  }
100a0 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
100b0 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
100c0 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
100d0 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
100e0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
100f0 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
10100 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10110 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
10120 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  reak);..  /* Clo
10130 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
10140 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
10150 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
10160 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a  3WhereBegin..  *
10170 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  /.  for(i=0, pLe
10180 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
10190 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
101a0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
101b0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
101c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
101d0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
101e0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
101f0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
10200 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
10210 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
10220 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
10230 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
10240 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53  ient || pTab->pS
10250 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
10260 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
10270 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
10280 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
10290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
102a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
102b0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
102c0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
102d0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
102e0 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20  ->pIdx!=0 ){.   
102f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10300 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
10310 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
10320 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
10330 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20   /* Make cursor 
10340 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f  substitutions fo
10350 72 20 63 61 73 65 73 20 77 68 65 72 65 20 77 65  r cases where we
10360 20 77 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20   want to use.   
10370 20 2a 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64   ** just the ind
10380 65 78 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66  ex and never ref
10390 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
103a0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
103b0 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
103c0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
103d0 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
103e0 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
103f0 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
10400 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
10410 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
10420 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
10430 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
10440 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
10450 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
10460 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
10470 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
10480 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
10490 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
104a0 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
104b0 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
104c0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
104d0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
104e0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
104f0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
10500 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
10510 20 69 6e 74 20 69 2c 20 6a 2c 20 6c 61 73 74 3b   int i, j, last;
10520 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
10530 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  Op;.      Index 
10540 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
10550 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73  pIdx;..      ass
10560 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
10570 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
10580 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
10590 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20  pWInfo->iTop);. 
105a0 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
105b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
105c0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
105d0 28 69 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b  (i=pWInfo->iTop;
105e0 20 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c 20 70 4f   i<last; i++, pO
105f0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
10600 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
10610 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
10620 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
10630 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
10640 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
10650 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
10660 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
10670 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
10680 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
10690 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
106a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
106b0 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
106c0 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
106d0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
106e0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
106f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10710 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
10720 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
10730 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
10740 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
10750 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
10760 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
10770 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
10780 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
10790 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
107a0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
107b0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
107c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
107d0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
107e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
107f0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
10800 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 73 71  leanup.  */.  sq
10810 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29  liteFree(pWInfo)
10820 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.