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

Artifact f79bc17f6228f69181da3dfc97986a690bce25ce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 30 32   where.c,v 1.202
0340: 20 32 30 30 36 2f 30 31 2f 32 33 20 31 33 3a 32   2006/01/23 13:2
0350: 32 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a 2a  2:10 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 69 31 36 20 69 50 61 72 65  n */.  i16 iPare
0c20: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
0c30: 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61  * Disable pWC->a
0c40: 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74  [iParent] when t
0c50: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0c60: 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43  d */.  i16 leftC
0c70: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0c80: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0c90: 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20  of X in "X <op> 
0ca0: 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36  <expr>" */.  i16
0cb0: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
0cc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0cd0: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0ce0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0cf0: 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72  .  u16 eOperator
0d00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
0d10: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
0d20: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
0d30: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20           /* Bit 
0d50: 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f  flags.  See belo
0d60: 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64  w */.  u8 nChild
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0d80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  * Number of chil
0d90: 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64  dren that must d
0da0: 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57  isable us */.  W
0db0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c         /* The cl
0dd0: 61 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69  ause this term i
0de0: 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42  s part of */.  B
0df0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67  itmask prereqRig
0e00: 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ht;    /* Bitmas
0e10: 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  k of tables used
0e20: 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20   by pRight */.  
0e30: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
0e40: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
0e50: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
0e60: 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a  erenced by p */.
0e70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
0e80: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
0e90: 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23  eTerm.flags.*/.#
0ea0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
0eb0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
0ec0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
0ed0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ee0: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
0ef0: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
0f00: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
0f10: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
0f20: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
0f30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f40: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
0f50: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
0f60: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
0f70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f80: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
0f90: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
0fa0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
0fb0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31  M_OR_OK      0x1
0fc0: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
0fd0: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
0fe0: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
0ff0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1010: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1020: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1030: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1040: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1050: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1060: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1070: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1080: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1090: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
10a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
10b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
10c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
10d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
10e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10f0: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
1100: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
1110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1120: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1130: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
1140: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
1150: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
1160: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
1170: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
1180: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1190: 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20  m aStatic[10];  
11a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
11b0: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
11c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
11e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
11f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1200: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1210: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1220: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1230: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1240: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1250: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1260: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1270: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1280: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1290: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
12a0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
12b0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
12c0: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
12d0: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
12e0: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
12f0: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1310: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1320: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1330: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1340: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1350: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1360: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1370: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1380: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1390: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
13a0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
13b0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
13c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
13d0: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
13e0: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
13f0: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1400: 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65  ** If ExprMaskSe
1410: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
1420: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
1430: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
1440: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
1450: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
1460: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
1470: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
1480: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
1490: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
14a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
14c0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
14d0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
14e0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
14f0: 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d   Then the  ExprM
1500: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
1510: 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68  .** would map th
1520: 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ose cursor numbe
1530: 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74  rs into bits 0 t
1540: 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20  hrough 5..**.** 
1550: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  Note that the ma
1560: 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  pping is not nec
1570: 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64  essarily ordered
1580: 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  .  In the exampl
1590: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20  e.** above, the 
15a0: 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f  mapping might go
15b0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e   like this:  4->
15c0: 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32  3, 5->1, 8->2, 2
15d0: 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20  9->0,.** 57->5, 
15e0: 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f  73->4.  Or one o
15f0: 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62  f 719 other comb
1600: 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62  inations might b
1610: 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f  e used. It.** do
1620: 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61  es not really ma
1630: 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69  tter.  What is i
1640: 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74  mportant is that
1650: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a   sparse cursor.*
1660: 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65  * numbers all ge
1670: 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69  t mapped into bi
1680: 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62  t numbers that b
1690: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
16a0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61  contain.** no ga
16b0: 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ps..*/.typedef s
16c0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16d0: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73  t ExprMaskSet;.s
16e0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16f0: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1720: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1730: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1740: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
1750: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
1760: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1770: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
1780: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
1790: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
17a0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
17b0: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
17c0: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
17d0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
17e0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
17f0: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1800: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1810: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1820: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1830: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1840: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
1850: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
1860: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
1870: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
1880: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
1890: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
18a0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
18b0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
18c0: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
18d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
18e0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18f0: 45 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a  E-TK_EQ))../*.**
1900: 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73   Value for flags
1910: 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73   returned by bes
1920: 74 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66  tIndex().*/.#def
1930: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1940: 45 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20  EQ       0x0001 
1950: 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20    /* rowid=EXPR 
1960: 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  or rowid IN (...
1970: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
1980: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20  RE_ROWID_RANGE  
1990: 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f    0x0002   /* ro
19a0: 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  wid<EXPR and/or 
19b0: 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64  rowid>EXPR */.#d
19c0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
19d0: 4d 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31  MN_EQ      0x001
19e0: 30 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72  0   /* x=EXPR or
19f0: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
1a00: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1a10: 55 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30  UMN_RANGE   0x00
1a20: 32 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  20   /* x<EXPR a
1a30: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
1a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
1a50: 4c 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30  LUMN_IN      0x0
1a60: 30 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e  040   /* x IN (.
1a70: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
1a80: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20  HERE_TOP_LIMIT  
1a90: 20 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20      0x0100   /* 
1aa0: 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50  x<EXPR or x<=EXP
1ab0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1ac0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54  #define WHERE_BT
1ad0: 4d 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30  M_LIMIT      0x0
1ae0: 32 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20  200   /* x>EXPR 
1af0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
1b00: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
1b10: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1b20: 20 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f        0x0800   /
1b30: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
1b40: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
1b50: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f  .#define WHERE_O
1b60: 52 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78  RDERBY        0x
1b70: 31 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74  1000   /* Output
1b80: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
1b90: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
1ba0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1bb0: 45 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78  EVERSE        0x
1bc0: 32 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69  2000   /* Scan i
1bd0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1bf0: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20  _UNIQUE         
1c00: 30 78 34 30 30 30 20 20 20 2f 2a 20 53 65 6c 65  0x4000   /* Sele
1c10: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
1c20: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a   one row */../*.
1c30: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1c40: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1c50: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1c60: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1c70: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1c80: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
1c90: 70 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72  pWC, Parse *pPar
1ca0: 73 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  se){.  pWC->pPar
1cb0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
1cc0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
1cd0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52   pWC->nSlot = AR
1ce0: 52 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74  RAYSIZE(pWC->aSt
1cf0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
1d00: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
1d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
1d20: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1d30: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1d40: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1d50: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1d60: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1d70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d80: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1d90: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1da0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1db0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1dc0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
1dd0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
1de0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
1df0: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
1e00: 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69  m-1, a=pWC->a; i
1e10: 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a  >=0; i--, a++){.
1e20: 20 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73      if( a->flags
1e30: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
1e40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e50: 45 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45  ExprDelete(a->pE
1e60: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
1e70: 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57    if( pWC->a!=pW
1e80: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
1e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 43    sqliteFree(pWC
1ea0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
1eb0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
1ec0: 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72  ries to the Wher
1ed0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1ee0: 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65  e.  Increase the
1ef0: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70   allocated.** sp
1f00: 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  ace as necessary
1f10: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
1f20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1f30: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
1f40: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
1f50: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
1f60: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
1f70: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
1f80: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
1f90: 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a 2a 20  alided after.** 
1fa0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1fb0: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
1fc0: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
1fd0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
1fe0: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
1ff0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
2000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2010: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
2040: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
2050: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
2060: 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43 2d   idx;.  if( pWC-
2070: 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c  >nTerm>=pWC->nSl
2080: 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54  ot ){.    WhereT
2090: 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d  erm *pOld = pWC-
20a0: 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  >a;.    pWC->a =
20b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
20c0: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
20d0: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
20e0: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
20f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2100: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
2110: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
2120: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
2130: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
2140: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
2150: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2160: 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20  eFree(pOld);.   
2170: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
2180: 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54  t *= 2;.  }.  pT
2190: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
21a0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  x = pWC->nTerm];
21b0: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b  .  pWC->nTerm++;
21c0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
21d0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c  = p;.  pTerm->fl
21e0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
21f0: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
2200: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
2210: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2220: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
2240: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
2250: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
2260: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
2270: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
2280: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
2290: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
22a0: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
22b0: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
22c0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22d0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
22e0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
22f0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
2300: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
2310: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
2320: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
2330: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2340: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
2350: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
2360: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
2370: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
2380: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
2390: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
23a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
23b0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23c0: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
23d0: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
23e0: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
23f0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2400: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
2410: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
2420: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
2430: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
2440: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
2450: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
2460: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
2470: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
2480: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
2490: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
24a0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
24b0: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
24c0: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
24d0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
24e0: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
24f0: 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67  y.  This array g
2500: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
2510: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2520: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2530: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2540: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2550: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
2560: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
2570: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
2580: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
2590: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
25a0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
25b0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
25c0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
25d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
25e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
25f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
2600: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
2610: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2620: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
2630: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2640: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
2650: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
2660: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
2670: 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20  t(P)  memset(P, 
2680: 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a  0, sizeof(*P))..
2690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26a0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
26b0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
26c0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
26d0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
26e0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2700: 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d  sk getMask(ExprM
2710: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2720: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
2730: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2740: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
2750: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
2760: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
2770: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
2780: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
2790: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
27a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
27c0: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
27d0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
27e0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
27f0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
2800: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2810: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
2820: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
2830: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2840: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2850: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
2860: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2870: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
2880: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
2890: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
28a0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
28b0: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
28c0: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
28d0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
28e0: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
28f0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2900: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
2910: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
2920: 52 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65  RRAYSIZE(pMaskSe
2930: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
2940: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
2950: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
2960: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2970: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
2980: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
2990: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
29a0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
29b0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
29c0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
29d0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
29e0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
29f0: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
2a00: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
2a10: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
2a20: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2a30: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
2a40: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
2a50: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70  voked sqlite3Exp
2a60: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2a70: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2a80: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
2a90: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
2aa0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
2ab0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ac0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
2ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2ae0: 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  lveNames() routi
2af0: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
2b00: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
2b10: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
2b20: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
2b30: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
2b40: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
2b50: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
2b60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
2b70: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
2b80: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
2b90: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
2ba0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2bb0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
2bc0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
2bd0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
2be0: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
2bf0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2c00: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2c10: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
2c20: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
2c30: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
2c40: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
2c50: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65  ExprMaskSet*, Se
2c60: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
2c70: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
2c80: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2c90: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2ca0: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
2cb0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
2cc0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
2cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
2ce0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
2cf0: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
2d00: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
2d10: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
2d20: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
2d30: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
2d40: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
2d50: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
2d60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2d70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2d80: 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  eft);.  mask |= 
2d90: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2da0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
2db0: 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pList);.  mask |
2dc0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
2dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2de0: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
2df0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
2e00: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2e10: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2e20: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2e30: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
2e40: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2e50: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
2e60: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
2e70: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
2e80: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2e90: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
2ea0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2eb0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2ec0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2ed0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2ee0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
2ef0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2f00: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2f10: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
2f20: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
2f30: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
2f40: 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d   mask;.  if( pS=
2f50: 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  =0 ){.    mask =
2f60: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2f70: 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74   mask = exprList
2f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2f90: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
2fa0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
2fb0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2fc0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2fd0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
2fe0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
2ff0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3000: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
3010: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3020: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3030: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
3040: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
3050: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3060: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
3070: 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ving);.  }.  ret
3080: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
3090: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
30a0: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
30b0: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
30c0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
30d0: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
30e0: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
30f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3100: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
3110: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
3120: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
3130: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64   "<=", ">=", and
3140: 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "IN"..*/.static
3150: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
3160: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
3170: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
3180: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
3190: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
31a0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
31b0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
31c0: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
31d0: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
31e0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
31f0: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
3200: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
3210: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
3220: 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f  op<=TK_GE);.}../
3230: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
3240: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 2e  jects of type T.
3250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
3260: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
3270: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
3280: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
3290: 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f 70  a comparision op
32a0: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
32b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
32c0: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
32d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
32e0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74 61  "Y op X"..*/.sta
32f0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
3300: 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78 70 72  mute(Expr *pExpr
3310: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  ){.  assert( all
3320: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
3330: 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ) && pExpr->op!=
3340: 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28  TK_IN );.  SWAP(
3350: 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e  CollSeq*,pExpr->
3360: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45  pRight->pColl,pE
3370: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
3380: 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  l);.  SWAP(Expr*
3390: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
33a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
33b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
33c0: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
33d0: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
33e0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
33f0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
3400: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3410: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
3420: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3430: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
3440: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
3450: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
3460: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
3470: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
3480: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
3490: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
34a0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
34b0: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
34c0: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
34d0: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
34e0: 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61  c int operatorMa
34f0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  sk(int op){.  in
3500: 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t c;.  assert( a
3510: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
3520: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
3530: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
3540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3550: 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b   = WO_EQ<<(op-TK
3560: 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _EQ);.  }.  asse
3570: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
3580: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
3590: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
35a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
35b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
35c0: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
35d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
35e0: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
35f0: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
3600: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
3610: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3620: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3630: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3640: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3650: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
3660: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
3670: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
3680: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
3690: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
36a0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
36b0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
36c0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
36d0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
36e0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
36f0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
3700: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
3710: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
3720: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3730: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
3740: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
3750: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
3760: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
3770: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3780: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3790: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
37a0: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
37b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
37c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
37d0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37e0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37f0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3800: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3810: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
3820: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3830: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3840: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3850: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3860: 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u16 op,         
3870: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3880: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3890: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
38a0: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
38b0: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
38c0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
38d0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38e0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38f0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
3900: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
3910: 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  k;.  for(pTerm=p
3920: 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
3930: 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65  erm; k; k--, pTe
3940: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
3950: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
3960: 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26  ==iCur.       &&
3970: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
3980: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3990: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
39a0: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  erm->leftColumn=
39b0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
39c0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
39d0: 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20  ator & op)!=0.  
39e0: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69    ){.      if( i
39f0: 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20 29  Cur>=0 && pIdx )
3a00: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
3a10: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3a20: 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  r;.        CollS
3a30: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
3a40: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
3a50: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
3a60: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
3a70: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
3a80: 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78  se;..        idx
3a90: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
3aa0: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
3ab0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
3ac0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
3ad0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
3ae0: 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f  pX, idxaff) ) co
3af0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
3b00: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
3b10: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
3b20: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  e, pX->pLeft);. 
3b30: 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
3b40: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
3b50: 66 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b  f( pX->pRight ){
3b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
3b70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
3b80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3b90: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
3bd0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
3be0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
3bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3c00: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  }.        for(k=
3c10: 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; k<pIdx->nColu
3c20: 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f  mn && pIdx->aiCo
3c30: 6c 75 6d 6e 5b 6b 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[k]!=iColumn
3c40: 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; k++){}.       
3c50: 20 61 73 73 65 72 74 28 20 6b 3c 70 49 64 78 2d   assert( k<pIdx-
3c60: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
3c70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
3c80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
3c90: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
3ca0: 6c 5b 6b 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  l[k]) ) continue
3cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3cc0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3cd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3ce0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3cf0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3d00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
3d10: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
3d20: 20 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57   ExprMaskSet*, W
3d30: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
3d40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
3d50: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
3d60: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
3d70: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a  RE clause.  .**.
3d80: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
3d90: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
3da0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
3db0: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
3dc0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3dd0: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
3de0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a   *pMaskSet,   /*
3df0: 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a   table masks */.
3e00: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3e10: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
3e20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
3e30: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
3e40: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
3e50: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
3e60: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3e70: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
3e80: 54 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65  TabList, pMaskSe
3e90: 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a  t, pWC, i);.  }.
3ea0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3eb0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
3ec0: 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43  MIZATION./*.** C
3ed0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
3ee0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
3ef0: 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72  ion is a LIKE or
3f00: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74   GLOB operator t
3f10: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70  hat.** can be op
3f20: 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e  timized using in
3f30: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
3f40: 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52  ints.  Return TR
3f50: 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73  UE if it is.** s
3f60: 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  o and false if n
3f70: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ot..**.** In ord
3f80: 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  er for the opera
3f90: 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69  tor to be optimi
3fa0: 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d  zible, the RHS m
3fb0: 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a  ust be a string.
3fc0: 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ** literal that 
3fd0: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
3fe0: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20  ith a wildcard. 
3ff0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4000: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20  isLikeOrGlob(.  
4010: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
4020: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
4030: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
4040: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
4050: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
4060: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74   */.  int *pnPat
4070: 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65  tern,   /* Numbe
4080: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
4090: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
40a0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ers */.  int *pi
40b0: 73 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72  sComplete  /* Tr
40c0: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
40d0: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
40e0: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
40f0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  er */.){.  const
4100: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72   char *z;.  Expr
4110: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
4120: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ;.  ExprList *pL
4130: 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e  ist;.  int c, cn
4140: 74 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b  t;.  int noCase;
4150: 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20  .  char wc[3];. 
4160: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
4170: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
4180: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
4190: 62 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73  b, pExpr, &noCas
41a0: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
41b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
41c0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
41d0: 73 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70  st;.  pRight = p
41e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
41f0: 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e  ;.  if( pRight->
4200: 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op!=TK_STRING ){
4210: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4220: 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69   }.  pLeft = pLi
4230: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
4240: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21    if( pLeft->op!
4250: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4270: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
4280: 3e 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43  >pColl;.  if( pC
4290: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oll==0 ){.    pC
42a0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
42b0: 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  oll;.  }.  if( (
42c0: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
42d0: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20  ITE_COLL_BINARY 
42e0: 7c 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20  || noCase) &&.  
42f0: 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65      (pColl->type
4300: 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  !=SQLITE_COLL_NO
4310: 43 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29  CASE || !noCase)
4320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4330: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4340: 65 71 75 6f 74 65 45 78 70 72 28 70 52 69 67 68  equoteExpr(pRigh
4350: 74 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20  t);.  z = (char 
4360: 2a 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  *)pRight->token.
4370: 7a 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20  z;.  for(cnt=0; 
4380: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
4390: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
43a0: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
43b0: 5d 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66  ]; cnt++){}.  if
43c0: 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d  ( cnt==0 || 255=
43d0: 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20  =(u8)z[cnt] ){. 
43e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
43f0: 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20  .  *pisComplete 
4400: 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20  = z[cnt]==wc[0] 
4410: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
4420: 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63    *pnPattern = c
4430: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  nt;.  return 1;.
4440: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4450: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
4460: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
4470: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
4480: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
4490: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
44a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
44b0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
44c0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
44d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
44e0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
44f0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
4500: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
4510: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
4520: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
4530: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
4540: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
4550: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
4560: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
4570: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
4580: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
4590: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
45a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  }.../*.** The in
45b0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
45c0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
45d0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
45e0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
45f0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
4600: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
4610: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
4620: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
4630: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
4640: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
4650: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
4660: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
4670: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
4680: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
4690: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
46a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
46b0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
46c0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
46d0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
46e0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
46f0: 3c 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68 65  <expr>".  If the
4700: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
4710: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
4720: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
4730: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 20  oth X and Y are 
4740: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
4750: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78  e original.** ex
4760: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
4770: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
4780: 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 69  virtual expressi
4790: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  on of the form.*
47a0: 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20  * "Y <op> X" is 
47b0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45  added to the WHE
47c0: 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61 6e  RE clause and an
47d0: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
47e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
47f0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
4800: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
4810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
4820: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
4830: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
4840: 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20  pMaskSet,    /* 
4850: 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  table masks */. 
4860: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4870: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
4880: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
4890: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
48b0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
48c0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
48d0: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
48e0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
48f0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
4900: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
4910: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42  Term->pExpr;.  B
4920: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
4930: 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  t;.  Bitmask pre
4940: 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 6e 50  reqAll;.  int nP
4950: 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73  attern;.  int is
4960: 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20 69 66 28  Complete;..  if(
4970: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
4980: 69 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b  iled() ) return;
4990: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
49a0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
49b0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
49c0: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45  pLeft);.  if( pE
49d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
49e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
49f0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
4a00: 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  ;.    pTerm->pre
4a10: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
4a20: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4a30: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
4a40: 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20 20  List).          
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  | exprSelectTabl
4a70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4a80: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29   pExpr->pSelect)
4a90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4aa0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
4ab0: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
4ac0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
4ad0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
4ae0: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
4af0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4b00: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
4b10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4b20: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
4b30: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
4b40: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67 65   prereqAll |= ge
4b50: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
4b60: 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
4b70: 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 70  nTable);.  }.  p
4b80: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
4b90: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
4ba0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4bb0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
4bc0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
4bd0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
4be0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
4bf0: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4c00: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
4c10: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
4c20: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
4c30: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
4c40: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
4c50: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4c60: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4c70: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
4c80: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4c90: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
4ca0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
4cb0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
4cc0: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
4cd0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
4ce0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
4cf0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
4d00: 6f 72 4d 61 73 6b 28 70 45 78 70 72 2d 3e 6f 70  orMask(pExpr->op
4d10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4d20: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
4d30: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
4d40: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
4d50: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
4d60: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
4d70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
4d80: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
4d90: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
4da0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
4db0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4dc0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
4dd0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
4de0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
4df0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
4e00: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
4e10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
4e20: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
4e30: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
4e40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
4e50: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
4e60: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
4e70: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
4e80: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
4e90: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
4ea0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
4eb0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
4ec0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
4ed0: 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PIED;.      }els
4ee0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
4ef0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
4f00: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
4f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
4f20: 72 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a  rCommute(pDup);.
4f30: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44        pLeft = pD
4f40: 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  up->pLeft;.     
4f50: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
4f60: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
4f70: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  e;.      pNew->l
4f80: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
4f90: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
4fa0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
4fb0: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
4fc0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
4fd0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
4fe0: 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  All;.      pNew-
4ff0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
5000: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
5010: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  op);.    }.  }..
5020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5030: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
5040: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
5050: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
5060: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
5070: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
5080: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
5090: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
50a0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
50b0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
50c0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ents..  */.  els
50d0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
50e0: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20  =TK_BETWEEN ){. 
50f0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
5100: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
5110: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
5120: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
5130: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
5140: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
5150: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
5160: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
5170: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
5180: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5190: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
51a0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
51b0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
51c0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
51d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70  = sqlite3Expr(op
51e0: 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70  s[i], sqlite3Exp
51f0: 72 44 75 70 28 70 45 78 70 72 2d 3e 70 4c 65 66  rDup(pExpr->pLef
5200: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5230: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
5240: 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  r), 0);.      id
5250: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
5260: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
5270: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
5280: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
5290: 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  C);.      exprAn
52a0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
52b0: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
52c0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
52d0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
52e0: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
52f0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
5300: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
5310: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
5320: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
5330: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5340: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
5350: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
5360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5370: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
5380: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
5390: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
53a0: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74  BQUERY).  /* Att
53b0: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
53c0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
53d0: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
53e0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
53f0: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
5400: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
5410: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  .  Example:.  **
5420: 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  .  **      x = e
5430: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
5440: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
5450: 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  r3.  **.  ** is 
5460: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20  converted into. 
5470: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
5480: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
5490: 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  expr3).  **.  **
54a0: 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
54b0: 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74  on must be omitt
54c0: 65 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55  ed if OMIT_SUBQU
54d0: 45 52 59 20 69 73 20 64 65 66 69 6e 65 64 20 62  ERY is defined b
54e0: 65 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  ecause.  ** the 
54f0: 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65  compiler for the
5500: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
5510: 20 69 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d   is part of sub-
5520: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
5530: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
5540: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
5550: 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74   int ok;.    int
5560: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69   i, j;.    int i
5570: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b  Column, iCursor;
5580: 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
5590: 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54   sOr;.    WhereT
55a0: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20  erm *pOrTerm;.. 
55b0: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
55c0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
55d0: 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20  DYNAMIC)==0 );. 
55e0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
55f0: 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50  it(&sOr, pWC->pP
5600: 61 72 73 65 29 3b 0a 20 20 20 20 77 68 65 72 65  arse);.    where
5610: 53 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70  Split(&sOr, pExp
5620: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65  r, TK_OR);.    e
5630: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
5640: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26 73  rc, pMaskSet, &s
5650: 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Or);.    assert(
5660: 20 73 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b 0a   sOr.nTerm>0 );.
5670: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64      j = 0;.    d
5680: 6f 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  o{.      iColumn
5690: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
56a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43  Column;.      iC
56b0: 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d  ursor = sOr.a[j]
56c0: 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  .leftCursor;.   
56d0: 20 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e     ok = iCursor>
56e0: 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  =0;.      for(i=
56f0: 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  sOr.nTerm-1, pOr
5700: 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30  Term=sOr.a; i>=0
5710: 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72   && ok; i--, pOr
5720: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
5730: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
5740: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29  perator!=WO_EQ )
5750: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
5760: 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65   or_not_possible
5770: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5780: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
5790: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
57a0: 72 73 6f 72 20 26 26 20 70 4f 72 54 65 72 6d 2d  rsor && pOrTerm-
57b0: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  >leftColumn==iCo
57c0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
57d0: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
57e0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
57f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5800: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67  ( (pOrTerm->flag
5810: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29  s & TERM_COPIED)
5820: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
5830: 20 20 20 20 20 20 20 20 20 20 20 28 28 70 4f 72             ((pOr
5840: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
5850: 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 26  RM_VIRTUAL)!=0 &
5860: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
5870: 20 20 20 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f         (sOr.a[pO
5880: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e  rTerm->iParent].
5890: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
58a0: 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  OK)!=0) ){.     
58b0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
58c0: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
58d0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
58e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20  e{.          ok 
58f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
5900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
5910: 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61  e( !ok && (sOr.a
5920: 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45  [j++].flags & TE
5930: 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26  RM_COPIED)!=0 &&
5940: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
5950: 20 20 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20      if( ok ){.  
5960: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
5970: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  ist = 0;.      E
5980: 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70  xpr *pNew, *pDup
5990: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f  ;.      for(i=sO
59a0: 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  r.nTerm-1, pOrTe
59b0: 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26  rm=sOr.a; i>=0 &
59c0: 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  & ok; i--, pOrTe
59d0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
59e0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  f( (pOrTerm->fla
59f0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
5a00: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5a10: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
5a20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
5a30: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
5a40: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
5a50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5a60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69  prListAppend(pLi
5a70: 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20  st, pDup, 0);.  
5a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 75 70      }.      pDup
5a90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5aa0: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  K_COLUMN, 0, 0, 
5ab0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
5ac0: 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  up ){.        pD
5ad0: 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 75  up->iTable = iCu
5ae0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 44  rsor;.        pD
5af0: 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  up->iColumn = iC
5b00: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  olumn;.      }. 
5b10: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
5b20: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70  te3Expr(TK_IN, p
5b30: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
5b40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
5b50: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
5b60: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
5b70: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
5b80: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
5b90: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74       pNew->pList
5ba0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
5bb0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
5bc0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
5bd0: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
5be0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
5bf0: 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  C);.        expr
5c00: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d  Analyze(pSrc, pM
5c10: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78  askSet, pWC, idx
5c20: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
5c30: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
5c40: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
5c50: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
5c60: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
5c70: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
5c80: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
5c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5cb0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
5cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72        }.    }.or
5cd0: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20  _not_possible:. 
5ce0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
5cf0: 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23  ear(&sOr);.  }.#
5d00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5d10: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
5d20: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
5d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5d40: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
5d50: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
5d60: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
5d70: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
5d80: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
5d90: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
5da0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b    */.  if( isLik
5db0: 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61  eOrGlob(pWC->pPa
5dc0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
5dd0: 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f  &nPattern, &isCo
5de0: 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20 45  mplete) ){.    E
5df0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
5e00: 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ght;.    Expr *p
5e10: 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20  Str1, *pStr2;.  
5e20: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
5e30: 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  1, *pNewExpr2;. 
5e40: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20     int idxNew1, 
5e50: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
5e60: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  eft = pExpr->pLi
5e70: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
5e80: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
5e90: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
5ea0: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31  pExpr;.    pStr1
5eb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5ec0: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
5ed0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  0);.    if( pStr
5ee0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
5ef0: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74  e3TokenCopy(&pSt
5f00: 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67  r1->token, &pRig
5f10: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
5f20: 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e    pStr1->token.n
5f30: 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20   = nPattern;.   
5f40: 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73   }.    pStr2 = s
5f50: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
5f60: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 53  tr1);.    if( pS
5f70: 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73 73  tr2 ){.      ass
5f80: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
5f90: 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b  n.dyn );.      +
5fa0: 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74  +*(u8*)&pStr2->t
5fb0: 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d  oken.z[nPattern-
5fc0: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  1];.    }.    pN
5fd0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
5fe0: 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71 6c  3Expr(TK_GE, sql
5ff0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
6000: 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  t), pStr1, 0);. 
6010: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
6020: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6030: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
6040: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
6050: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
6060: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
6070: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
6080: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
6090: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
60a0: 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c  3Expr(TK_LT, sql
60b0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
60c0: 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20  t), pStr2, 0);. 
60d0: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
60e0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
60f0: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
6100: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
6110: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
6120: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
6130: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
6140: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
6150: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
6160: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
6170: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
6180: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
6190: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
61a0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
61b0: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
61c0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
61d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
61e0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
61f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
6200: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
6210: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a  TIMIZATION */.}.
6220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6230: 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
6240: 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
6250: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
6260: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
6270: 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20  se.  If it can, 
6280: 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49  it returns 1.  I
6290: 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61  f pIdx cannot sa
62a0: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44  tisfy the.** ORD
62b0: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
62c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
62d0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  ns 0..**.** pOrd
62e0: 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52  erBy is an ORDER
62f0: 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
6300: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
6310: 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65  nt.  pTab is the
6320: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61  .** left-most ta
6330: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
6340: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73  clause of that s
6350: 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ame SELECT state
6360: 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ment and.** the 
6370: 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73  table has a curs
6380: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61  or number of "ba
6390: 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e  se".  pIdx is an
63a0: 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a   index on pTab..
63b0: 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20  **.** nEqCol is 
63c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
63d0: 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68  lumns of pIdx th
63e0: 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65  at are used as e
63f0: 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74  quality.** const
6400: 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20  raints.  Any of 
6410: 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61  these columns ma
6420: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  y be missing fro
6430: 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  m the ORDER BY.*
6440: 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  * clause and the
6450: 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c   match can still
6460: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
6470: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
6480: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
6490: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
64a0: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
64b0: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
64c0: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
64d0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
64e0: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
64f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
6500: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
6510: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
6520: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
6530: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
6540: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
6550: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
6560: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
6570: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
6580: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
6590: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
65a0: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
65b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
65c0: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
65d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
65e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
65f0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6600: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
6610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6620: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
6630: 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65  sting */.  Table
6640: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
6650: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
6660: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
6670: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
6680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
6690: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  sor number for p
66a0: 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Tab */.  ExprLis
66b0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
66c0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
66d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
66e0: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
66f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6700: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
6710: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
6720: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
6730: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
6740: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
6750: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
6760: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
6770: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
6780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6790: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
67a0: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
67b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
67c0: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
67d0: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
67e0: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
67f0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
6820: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
6830: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6840: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
6850: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
6860: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6870: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
6880: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6890: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
68a0: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
68b0: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
68c0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
68d0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
68e0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
68f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6900: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
6910: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
6920: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
6930: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
6940: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
6950: 65 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  erm && i<pIdx->n
6960: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6970: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
6980: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
6990: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
69a0: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
69b0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
69c0: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
69d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
69e0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
69f0: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
6a00: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
6a10: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
6a20: 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20  */..    pExpr = 
6a30: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
6a40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
6a50: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
6a60: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
6a70: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  e ){.      /* Ca
6a80: 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64  n not use an ind
6a90: 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68  ex sort on anyth
6aa0: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
6ab0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  a column in the.
6ac0: 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f        ** left-mo
6ad0: 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  st table of the 
6ae0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
6af0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6b00: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
6b10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6b20: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
6b30: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
6b40: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
6b50: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6b60: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
6b70: 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn!=pIdx->aiColu
6b80: 6d 6e 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20  mn[i] || .      
6b90: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
6ba0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
6bb0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20  Idx->azColl[i]) 
6bc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  ){.      /* Term
6bd0: 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20   j of the ORDER 
6be0: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
6bf0: 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  ot match column 
6c00: 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  i of the index *
6c10: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45  /.      if( i<nE
6c20: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  qCol ){.        
6c30: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6c40: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f  olumn that is co
6c50: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
6c60: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
6c70: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  n.        ** ORD
6c80: 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74  ER BY term, that
6c90: 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67   is OK.  Just ig
6ca0: 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  nore that column
6cb0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
6cc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6cd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6cf0: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6d00: 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d  olumn fails to m
6d10: 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20  atch and is not 
6d20: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
6d30: 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  =.        ** the
6d40: 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  n the index cann
6d50: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
6d60: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
6d70: 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
6d80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
6d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6da0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
6db0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
6dc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
6dd0: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
6de0: 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74  0 || pTerm->sort
6df0: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
6e00: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
6e10: 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c  ortOrder[i]==0 |
6e20: 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
6e30: 65 72 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20  er[i]==1 );.    
6e40: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
6e50: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6e60: 5b 69 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72  [i] ^ pTerm->sor
6e70: 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20  tOrder;.    if( 
6e80: 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i>nEqCol ){.    
6e90: 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72    if( termSortOr
6ea0: 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29  der!=sortOrder )
6eb0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
6ec0: 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ices can only be
6ed0: 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44   used if all ORD
6ee0: 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74  ER BY terms past
6ef0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
6f00: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6f10: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74  ints are all eit
6f20: 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e  her DESC or ASC.
6f30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
6f40: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
6f60: 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53  ortOrder = termS
6f70: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6f80: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65      j++;.    pTe
6f90: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
6fa0: 54 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  The index can be
6fb0: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
6fc0: 67 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f  g if all terms o
6fd0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6fe0: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63  lause.  ** are c
6ff0: 6f 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  overed..  */.  i
7000: 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20  f( j>=nTerm ){. 
7010: 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74     *pbRev = sort
7020: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65  Order!=0;.    re
7030: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
7040: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7050: 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20   Check table to 
7060: 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52  see if the ORDER
7070: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f   BY clause in pO
7080: 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61  rderBy can be sa
7090: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f  tisfied.** by so
70a0: 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f  rting in order o
70b0: 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e  f ROWID.  Return
70c0: 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20   true if so and 
70d0: 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65  set *pbRev to be
70e0: 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76  .** true for rev
70f0: 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66  erse ROWID and f
7100: 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64  alse for forward
7110: 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f   ROWID order..*/
7120: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
7130: 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69  ableByRowid(.  i
7140: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
7150: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
7160: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
7170: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
7180: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
7190: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
71a0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
71b0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  se */.  int *pbR
71c0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
71d0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
71e0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
71f0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
7200: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
7210: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
7220: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
7230: 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20  Expr>0 );.  p = 
7240: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
7250: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64  Expr;.  if( pOrd
7260: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  erBy->nExpr==1 &
7270: 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  & p->op==TK_COLU
7280: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
7290: 3d 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  =base.          
72a0: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  && p->iColumn==-
72b0: 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  1 ){.    *pbRev 
72c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
72d0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
72e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
72f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7300: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
7310: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
7320: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
7330: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
7340: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
7350: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
7360: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
7370: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
7380: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
7390: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
73a0: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20  ming operatings 
73b0: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
73c0: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
73d0: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
73e0: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
73f0: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
7400: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
7410: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
7420: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
7430: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
7440: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
7450: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
7460: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
7470: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
7480: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
7490: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
74a0: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
74b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
74c0: 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63  est index for ac
74d0: 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
74e0: 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74  ular table.  Ret
74f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7500: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66   to the index, f
7510: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
7520: 62 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78  be how the index
7530: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c   should be used,
7540: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
7550: 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
7560: 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20  raints, and the 
7570: 22 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20  "cost" for this 
7580: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
7590: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64   lowest cost ind
75a0: 65 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f  ex wins.  The co
75b0: 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  st is an estimat
75c0: 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20  e of the amount 
75d0: 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69  of.** CPU and di
75e0: 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70  sk I/O need to p
75f0: 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
7600: 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c  st using the sel
7610: 65 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20  ected index..** 
7620: 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
7630: 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
7640: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
7650: 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
7660: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
7670: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
7680: 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
7690: 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
76a0: 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
76b0: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
76c0: 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
76d0: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
76e0: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
76f0: 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
7700: 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
7710: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
7720: 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
7730: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
7740: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
7750: 65 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  e bestIndex(.  P
7760: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7780: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7790: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
77a0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
77b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
77c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
77d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
77e0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
77f0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
7800: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
7810: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
7820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7830: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
7840: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
7850: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
7860: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
7870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
7880: 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
7890: 20 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65    Index **ppInde
78a0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
78b0: 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70   Make *ppIndex p
78c0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74  oint to the best
78d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
78e0: 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66          /* Put f
7900: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
7910: 74 68 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a  this choice in *
7920: 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20  pFlags */.  int 
7930: 2a 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20  *pnEq           
7940: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74          /* Put t
7950: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
7960: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7970: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57  s here */.){.  W
7980: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
7990: 0a 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64  .  Index *bestId
79a0: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  x = 0;         /
79b0: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76  * Index that giv
79c0: 65 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  es the lowest co
79d0: 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c  st */.  double l
79e0: 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20  owestCost;      
79f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
7a00: 6f 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78  of using bestIdx
7a10: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c   */.  int bestFl
7a20: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
7a30: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
7a40: 69 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49  iated with bestI
7a50: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  dx */.  int best
7a60: 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
7a70: 20 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75      /* Best valu
7a80: 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69  e for nEq */.  i
7a90: 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
7aa0: 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
7ab0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
7ac0: 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
7ad0: 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
7ae0: 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
7af0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
7b00: 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
7b10: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76  ing */.  int rev
7b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7b40: 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
7b50: 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  order */.  int f
7b60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7b70: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
7b80: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7b90: 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20  pProbe */.  int 
7ba0: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bc0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
7bd0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64  nstraints */.  d
7be0: 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
7bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7c00: 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
7c10: 62 65 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28  be */..  TRACE((
7c20: 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d  "bestIndex: tbl=
7c30: 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e  %s notReady=%x\n
7c40: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
7c50: 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29  Name, notReady))
7c60: 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ;.  lowestCost =
7c70: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
7c80: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
7c90: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
7ca0: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
7cb0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
7cc0: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
7cd0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
7ce0: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
7cf0: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
7d00: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
7d10: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
7d20: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a    *ppIndex = 0;.
7d30: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
7d40: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
7d50: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
7d60: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
7d70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
7d80: 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74  id== is always t
7d90: 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c  he best pick.  L
7da0: 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20  ook no further. 
7db0: 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20   Because only.  
7dc0: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
7dd0: 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
7de0: 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
7df0: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
7e00: 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c  er */.      *pFl
7e10: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
7e20: 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49  D_EQ | WHERE_UNI
7e30: 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71  QUE;.      *pnEq
7e40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 54 52 41 43   = 1;.      TRAC
7e50: 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20  E(("... best is 
7e60: 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20  rowid\n"));.    
7e70: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
7e80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78    }else if( (pEx
7e90: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
7ea0: 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  r)->pList!=0 ){.
7eb0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
7ec0: 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69  N (LIST): cost i
7ed0: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
7ee0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7ef0: 20 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65   list.      ** e
7f00: 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20  lements.  */.   
7f10: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
7f20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
7f30: 78 70 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73  xpr;.      lowes
7f40: 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28  tCost *= estLog(
7f50: 6c 6f 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20  lowestCost);.   
7f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7f70: 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43   Rowid IN (SELEC
7f80: 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67  T): cost is Nlog
7f90: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
7fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
7fb0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7fc0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e  result of the in
7fd0: 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20  ner select.  We 
7fe0: 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65  have no way to e
7ff0: 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a  stimate.      **
8000: 20 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d   that value so m
8010: 61 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73 73  ake a wild guess
8020: 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73  . */.      lowes
8030: 74 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20  tCost = 200;.   
8040: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
8050: 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74  .. rowid IN cost
8060: 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73  : %.9g\n", lowes
8070: 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
8080: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
8090: 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20  cost of a table 
80a0: 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20  scan.  If we do 
80b0: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e  not know how man
80c0: 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61  y.  ** entries a
80d0: 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  re in the table,
80e0: 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61   use 1 million a
80f0: 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a  s a guess..  */.
8100: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
8110: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
8120: 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f   cost = pProbe ?
8130: 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
8140: 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a  t[0] : 1000000;.
8150: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61    TRACE(("... ta
8160: 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f  ble scan base co
8170: 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73  st: %.9g\n", cos
8180: 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57  t));.  flags = W
8190: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
81a0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
81b0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  r constraints on
81c0: 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69   a range of rowi
81d0: 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63  ds in a table sc
81e0: 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  an..  */.  pTerm
81f0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
8200: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
8210: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
8220: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29  |WO_GT|WO_GE, 0)
8230: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
8240: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
8250: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
8260: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
8270: 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_LE, 0) ){.  
8280: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8290: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
82a0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20      cost /= 3;  
82b0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
82c0: 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid<EXPR elimina
82d0: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
82e0: 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  r rows */.    }.
82f0: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
8300: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
8310: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
8320: 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
8330: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8340: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
8350: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
8360: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
8370: 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id>EXPR eliminat
8380: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
8390: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
83a0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72     TRACE(("... r
83b0: 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64 75 63  owid range reduc
83c0: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
83d0: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65  n", cost));.  }e
83e0: 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d  lse{.    flags =
83f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
8400: 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
8410: 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
8420: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
8430: 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20  ause, increase. 
8440: 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20   ** the cost by 
8450: 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74  NlogN to cover t
8460: 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f  he expense of so
8470: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  rting. */.  if( 
8480: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8490: 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  if( sortableByRo
84a0: 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72  wid(iCur, pOrder
84b0: 42 79 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20  By, &rev) ){.   
84c0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
84d0: 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f  E_ORDERBY|WHERE_
84e0: 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20  ROWID_RANGE;.   
84f0: 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
8500: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
8510: 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
8520: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8530: 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63  .      cost += c
8540: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
8550: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
8560: 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72  ... sorting incr
8570: 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  eases cost to %.
8580: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
8590: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
85a0: 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
85b0: 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  {.    lowestCost
85c0: 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65 73   = cost;.    bes
85d0: 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
85e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
85f0: 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
8600: 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
8610: 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
8620: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
8630: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8650: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8660: 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69    double inMulti
8670: 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20  plier = 1;..    
8680: 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65  TRACE(("... inde
8690: 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65  x %s:\n", pProbe
86a0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
86b0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
86c0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
86d0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
86e0: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20   are satisfied. 
86f0: 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20     ** by x=EXPR 
8700: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78  constraints or x
8710: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
8720: 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
8730: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20    flags = 0;.   
8740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f   for(i=0; i<pPro
8750: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  be->nColumn; i++
8760: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
8770: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
8780: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  n[i];.      pTer
8790: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
87a0: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
87b0: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
87c0: 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  , pProbe);.     
87d0: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
87e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61  break;.      fla
87f0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
8800: 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  MN_EQ;.      if(
8810: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8820: 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
8830: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
8840: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
8850: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
8860: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
8870: 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  N;.        if( p
8880: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  Expr->pSelect!=0
8890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
88a0: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 31 30  Multiplier *= 10
88b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
88c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
88d0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
88e0: 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a    inMultiplier *
88f0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
8900: 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20  nExpr + 1;.     
8910: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8920: 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50   }.    cost = pP
8930: 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69  robe->aiRowEst[i
8940: 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ] * inMultiplier
8950: 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74   * estLog(inMult
8960: 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71  iplier);.    nEq
8970: 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50   = i;.    if( pP
8980: 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
8990: 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73  E_None && (flags
89a0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
89b0: 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  IN)==0.         
89c0: 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  && nEq==pProbe->
89d0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
89e0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
89f0: 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
8a00: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
8a10: 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25   nEq=%d inMult=%
8a20: 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22  .9g cost=%.9g\n"
8a30: 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c  , nEq, inMultipl
8a40: 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20  ier, cost));..  
8a50: 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
8a60: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
8a70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
8a80: 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
8aa0: 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
8ab0: 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
8ac0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
8ad0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
8ae0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
8af0: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8b00: 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
8b10: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
8b20: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
8b30: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
8b40: 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
8b50: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
8b60: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
8b70: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50   WO_LT|WO_LE, pP
8b80: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
8b90: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8ba0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
8bb0: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
8bc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8bd0: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
8be0: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
8bf0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
8c00: 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
8c10: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
8c20: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
8c30: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
8c40: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
8c50: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
8c60: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65  E(("...... range
8c70: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
8c80: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
8c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8ca0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
8cb0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20  additional cost 
8cc0: 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68  of sorting if th
8cd0: 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a  at is a factor..
8ce0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8cf0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
8d00: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
8d10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
8d20: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
8d30: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  isSortingIndex(p
8d40: 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 70 53 72  Parse,pProbe,pSr
8d50: 63 2d 3e 70 54 61 62 2c 69 43 75 72 2c 70 4f 72  c->pTab,iCur,pOr
8d60: 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20  derBy,nEq,&rev) 
8d70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
8d80: 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
8d90: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45       flags = WHE
8da0: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
8db0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8dc0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8dd0: 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
8de0: 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
8df0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8e00: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
8e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
8e30: 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
8e40: 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
8e50: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
8e60: 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61 73   orderby increas
8e70: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
8e80: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
8e90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8ea0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
8eb0: 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77 61  f we can get awa
8ec0: 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75 73  y with using jus
8ed0: 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  t the index with
8ee0: 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72 20  out.    ** ever 
8ef0: 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c  reading the tabl
8f00: 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  e.  If that is t
8f10: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68 61  he case, then ha
8f20: 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  lve the.    ** c
8f30: 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ost of this inde
8f40: 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
8f50: 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63 2d  ( flags && pSrc-
8f60: 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69  >colUsed < (((Bi
8f70: 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
8f80: 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  )) ){.      Bitm
8f90: 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
8fa0: 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74  lUsed;.      int
8fb0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
8fc0: 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  0; j<pProbe->nCo
8fd0: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
8fe0: 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f      int x = pPro
8ff0: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  be->aiColumn[j];
9000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
9010: 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
9020: 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
9030: 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
9040: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9050: 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
9060: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
9070: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
9080: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
9090: 32 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  2;.        TRACE
90a0: 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e  (("...... idx-on
90b0: 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ly reduces cost 
90c0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
90d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
90e0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
90f0: 73 20 69 6e 64 65 78 20 68 61 73 20 61 63 68 69  s index has achi
9100: 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20  eved the lowest 
9110: 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65  cost so far, the
9120: 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
9130: 0a 20 20 20 20 69 66 28 20 63 6f 73 74 20 3c 20  .    if( cost < 
9140: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
9150: 20 20 20 20 62 65 73 74 49 64 78 20 3d 20 70 50      bestIdx = pP
9160: 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65  robe;.      lowe
9170: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
9180: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
9190: 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  gs!=0 );.      b
91a0: 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  estFlags = flags
91b0: 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45 71 20  ;.      bestNEq 
91c0: 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  = nEq;.    }.  }
91d0: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68  ..  /* Report th
91e0: 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a 20 20  e best result.  
91f0: 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20 3d 20  */.  *ppIndex = 
9200: 62 65 73 74 49 64 78 3b 0a 20 20 54 52 41 43 45  bestIdx;.  TRACE
9210: 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73  (("best index is
9220: 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20   %s, cost=%.9g, 
9230: 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64  flags=%x, nEq=%d
9240: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73  \n",.        bes
9250: 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e  tIdx ? bestIdx->
9260: 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22  zName : "(none)"
9270: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65  , lowestCost, be
9280: 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71  stFlags, bestNEq
9290: 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20  ));.  *pFlags = 
92a0: 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 2a 70 6e  bestFlags;.  *pn
92b0: 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20  Eq = bestNEq;.  
92c0: 72 65 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73  return lowestCos
92d0: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  t;.}.../*.** Dis
92e0: 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
92f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
9300: 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
9310: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
9320: 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
9330: 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
9340: 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
9350: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
9360: 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
9370: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
9380: 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
9390: 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
93a0: 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
93b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
93c0: 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
93d0: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
93e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
93f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
9400: 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
9410: 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
9420: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
9430: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
9440: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
9450: 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
9460: 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
9470: 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
9480: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
9490: 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
94a0: 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
94b0: 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
94c0: 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
94d0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
94e0: 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
94f0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
9500: 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
9510: 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
9520: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
9530: 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
9540: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
9550: 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
9560: 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
9570: 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
9580: 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
9590: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
95a0: 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
95b0: 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
95c0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
95d0: 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
95e0: 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
95f0: 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
9600: 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
9610: 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
9620: 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
9630: 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
9640: 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
9650: 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
9660: 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
9670: 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
9680: 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
9690: 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
96a0: 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
96b0: 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
96c0: 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
96d0: 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
96e0: 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
96f0: 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
9700: 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
9710: 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
9720: 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
9730: 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
9740: 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
9750: 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
9760: 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
9770: 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
9780: 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
9790: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
97a0: 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
97b0: 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
97c0: 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
97d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
97e0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
97f0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20  romJoin)).  ){. 
9800: 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
9810: 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
9820: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
9830: 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
9840: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
9850: 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
9860: 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
9870: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
9880: 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
9890: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
98a0: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
98b0: 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
98c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
98d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
98e0: 65 20 63 6f 64 65 20 74 68 61 74 20 62 75 69 6c  e code that buil
98f0: 64 73 20 61 20 70 72 6f 62 65 20 66 6f 72 20 61  ds a probe for a
9900: 6e 20 69 6e 64 65 78 2e 20 20 44 65 74 61 69 6c  n index.  Detail
9910: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43  s:.**.**    *  C
9920: 68 65 63 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f  heck the top nCo
9930: 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20  lumn entries on 
9940: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 61  the stack.  If a
9950: 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  ny.**       of t
9960: 68 6f 73 65 20 65 6e 74 72 69 65 73 20 61 72 65  hose entries are
9970: 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65   NULL, jump imme
9980: 64 69 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a  diately to brk,.
9990: 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68 20 69  **       which i
99a0: 73 20 74 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c  s the loop exit,
99b0: 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20   since no index 
99c0: 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74 63 68  entry will match
99d0: 0a 2a 2a 20 20 20 20 20 20 20 69 66 20 61 6e 79  .**       if any
99e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
99f0: 20 69 73 20 4e 55 4c 4c 2e 20 50 6f 70 20 28 6e   is NULL. Pop (n
9a00: 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 29 20 0a  Column+nExtra) .
9a10: 2a 2a 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74  **       element
9a20: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
9a30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 6f  ..**.**    *  Co
9a40: 6e 73 74 72 75 63 74 20 61 20 70 72 6f 62 65 20  nstruct a probe 
9a50: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 74  entry from the t
9a60: 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69  op nColumn entri
9a70: 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 74  es in.**       t
9a80: 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61 66  he stack with af
9a90: 66 69 6e 69 74 69 65 73 20 61 70 70 72 6f 70 72  finities appropr
9aa0: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 20 70  iate for index p
9ab0: 49 64 78 2e 20 0a 2a 2a 20 20 20 20 20 20 20 4f  Idx. .**       O
9ac0: 6e 6c 79 20 6e 43 6f 6c 75 6d 6e 20 65 6c 65 6d  nly nColumn elem
9ad0: 65 6e 74 73 20 61 72 65 20 70 6f 70 70 65 64 20  ents are popped 
9ae0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 69  from the stack i
9af0: 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20  n this case.**  
9b00: 20 20 20 20 20 28 62 79 20 4f 50 5f 4d 61 6b 65       (by OP_Make
9b10: 52 65 63 6f 72 64 29 2e 0a 2a 2a 0a 2a 2f 0a 73  Record)..**.*/.s
9b20: 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c 64  tatic void build
9b30: 49 6e 64 65 78 50 72 6f 62 65 28 0a 20 20 56 64  IndexProbe(.  Vd
9b40: 62 65 20 2a 76 2c 20 0a 20 20 69 6e 74 20 6e 43  be *v, .  int nC
9b50: 6f 6c 75 6d 6e 2c 20 0a 20 20 69 6e 74 20 6e 45  olumn, .  int nE
9b60: 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 72 6b  xtra, .  int brk
9b70: 2c 20 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  , .  Index *pIdx
9b80: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .){.  sqlite3Vdb
9b90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
9ba0: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20  Null, -nColumn, 
9bb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9bc0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
9bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9be0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
9bf0: 75 6d 6e 2b 6e 45 78 74 72 61 2c 20 30 29 3b 0a  umn+nExtra, 0);.
9c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
9c20: 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65  , brk);.  sqlite
9c30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9c40: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
9c50: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  lumn, 0);.  sqli
9c60: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
9c70: 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a  Str(v, pIdx);.}.
9c80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9c90: 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
9ca0: 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  le equality term
9cb0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
9cc0: 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69  ause.  An equali
9cd0: 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62  ty.** term can b
9ce0: 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20  e either X=expr 
9cf0: 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20  or X IN (...).  
9d00: 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65   pTerm is the te
9d10: 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64  rm to be .** cod
9d20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  ed..**.** The cu
9d30: 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20  rrent value for 
9d40: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
9d50: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f  s left on the to
9d60: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
9d70: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
9d80: 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
9d90: 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
9da0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
9db0: 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
9dc0: 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
9dd0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
9de0: 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
9df0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
9e00: 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
9e10: 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
9e20: 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
9e30: 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
9e40: 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
9e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
9e60: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
9e70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9e80: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
9e90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9ea0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
9eb0: 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  m,   /* The term
9ec0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
9ed0: 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
9ee0: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 20   */.  int brk,  
9ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
9f00: 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e 64 6f  p here to abando
9f10: 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
9f20: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
9f30: 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el  /* When leve
9f40: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
9f50: 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
9f60: 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ing on */.){.  E
9f70: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
9f80: 3e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 58  >pExpr;.  if( pX
9f90: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ->op!=TK_IN ){. 
9fa0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
9fb0: 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
9fc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9fd0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
9fe0: 68 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ht);.#ifndef SQL
9ff0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a000: 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
a010: 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 69 6e 74  nt iTab;.    int
a020: 20 2a 61 49 6e 3b 0a 20 20 20 20 56 64 62 65 20   *aIn;.    Vdbe 
a030: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a040: 62 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  be;..    sqlite3
a050: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
a060: 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 69  arse, pX);.    i
a070: 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
a080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a090: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
a0a0: 69 6e 64 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b  ind, iTab, brk);
a0b0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
a0c0: 28 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70  ((v, "# %.*s", p
a0d0: 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73  X->span.n, pX->s
a0e0: 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65  pan.z));.    pLe
a0f0: 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  vel->nIn++;.    
a100: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46  sqliteReallocOrF
a110: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 65  ree((void**)&pLe
a120: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  vel->aInLoop,.  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a150: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
a160: 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a 70 4c 65 76  nLoop[0])*3*pLev
a170: 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 61 49  el->nIn);.    aI
a180: 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  n = pLevel->aInL
a190: 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 49 6e  oop;.    if( aIn
a1a0: 20 29 7b 0a 20 20 20 20 20 20 61 49 6e 20 2b 3d   ){.      aIn +=
a1b0: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a 33 20 2d   pLevel->nIn*3 -
a1c0: 20 33 3b 0a 20 20 20 20 20 20 61 49 6e 5b 30 5d   3;.      aIn[0]
a1d0: 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
a1e0: 20 20 61 49 6e 5b 31 5d 20 3d 20 69 54 61 62 3b    aIn[1] = iTab;
a1f0: 0a 20 20 20 20 20 20 61 49 6e 5b 32 5d 20 3d 20  .      aIn[2] = 
a200: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a210: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
a220: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Tab, 0);.    }el
a230: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
a240: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nIn = 0;.    }
a250: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
a260: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
a270: 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  , pTerm);.}../*.
a280: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a290: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
a2a0: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
a2b0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
a2c0: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  r an.** index.  
a2d0: 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  The values for a
a2e0: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
a2f0: 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  re left on the s
a300: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
a310: 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
a320: 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
a330: 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
a340: 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
a350: 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
a360: 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
a370: 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
a380: 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
a390: 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
a3a0: 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
a3b0: 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
a3c0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
a3d0: 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
a3e0: 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
a3f0: 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
a400: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
a410: 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
a420: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
a430: 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
a440: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
a450: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
a460: 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
a470: 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
a480: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
a490: 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
a4a0: 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20  will be left.** 
a4b0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61  on the stack - a
a4c0: 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20   is the deepest 
a4d0: 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f  and b the shallo
a4e0: 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  west..**.** In t
a4f0: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
a500: 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
a510: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
a520: 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
a530: 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
a540: 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
a550: 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
a560: 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
a570: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
a580: 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
a590: 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
a5a0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
a5b0: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ry cell..**.** T
a5c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
a5d0: 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
a5e0: 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
a5f0: 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a   cell and puts.*
a600: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
a610: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
a620: 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  l in pLevel->iMe
a630: 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61  m.  The code tha
a640: 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
a650: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
a660: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f   pLevel->iMem to
a670: 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
a680: 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
a690: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
a6a0: 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
a6b0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
a6c0: 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
a6d0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
a6e0: 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
a6f0: 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
a700: 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
a710: 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
a720: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45  ic void codeAllE
a730: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
a740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a750: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
a760: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
a770: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
a780: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
a790: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
a7a0: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
a7b0: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
a7c0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
a7d0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
a7e0: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
a7f0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
a800: 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
a810: 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
a820: 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
a830: 20 69 6e 74 20 62 72 6b 20 20 20 20 20 20 20 20   int brk        
a840: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
a850: 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20 6c  ere to end the l
a860: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
a870: 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
a880: 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
a890: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
a8a0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
a8b0: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  to code */.  int
a8c0: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b   termsInMem = 0;
a8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
a8e0: 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76 61 6c   true, store val
a8f0: 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c  ue in mem[] cell
a900: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
a910: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
a920: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
a930: 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
a940: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
a950: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
a960: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20  = pLevel->pIdx; 
a970: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
a980: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
a990: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
a9a0: 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
a9b0: 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
a9c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
a9d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
a9e0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
a9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
aa00: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
aa10: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
aa40: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
aa50: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
aa60: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
aa70: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
aa80: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
aa90: 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77 61 79  m..  ** We alway
aaa0: 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73 74 20  s need at least 
aab0: 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  one used to stor
aac0: 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69  e the loop termi
aad0: 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65  nator.  ** value
aae0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
aaf0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77 65 27  IN operators we'
ab00: 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20  ll need one for 
ab10: 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20  each == or.  ** 
ab20: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  IN constraint.. 
ab30: 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d   */.  pLevel->iM
ab40: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
ab50: 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c 65 76 65  m++;.  if( pLeve
ab60: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
ab70: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20  _COLUMN_IN ){.  
ab80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
ab90: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
aba0: 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20     termsInMem = 
abb0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
abc0: 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
abd0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
abe0: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
abf0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
ac00: 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 20  j++){.    int k 
ac10: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
ac20: 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  [j];.    pTerm =
ac30: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
ac40: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
ac50: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70  , WO_EQ|WO_IN, p
ac60: 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
ac70: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
ac80: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
ac90: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
aca0: 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
acb0: 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
acc0: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
acd0: 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a  , brk, pLevel);.
ace0: 20 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d      if( termsInM
acf0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  em ){.      sqli
ad00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ad10: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
ad20: 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31  vel->iMem+j+1, 1
ad30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
ad40: 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71 20 29 3b  ssert( j==nEq );
ad50: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ad60: 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72 61   all the constra
ad70: 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20 6f  int values are o
ad80: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
ad90: 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66   stack.  */.  if
ada0: 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a  ( termsInMem ){.
adb0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
adc0: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; j++){.      
add0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ade0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
adf0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31  pLevel->iMem+j+1
ae00: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
ae10: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
ae20: 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
ae30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ae40: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
ae50: 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
ae60: 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
ae70: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
ae80: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ae90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
aea0: 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
aeb0: 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
aec0: 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
aed0: 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
aee0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
aef0: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
af00: 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
af10: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
af20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
af30: 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
af40: 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
af50: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
af60: 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
af70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
af80: 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
af90: 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
afa0: 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
afb0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
afc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
afd0: 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
afe0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
aff0: 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
b000: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
b010: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
b020: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
b030: 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
b040: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
b050: 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
b060: 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
b070: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
b080: 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
b090: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
b0a0: 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
b0b0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
b0c0: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
b0d0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
b0e0: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
b0f0: 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
b100: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b110: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
b120: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
b130: 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
b140: 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
b150: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
b160: 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
b170: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
b180: 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
b190: 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
b1a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
b1b0: 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
b1c0: 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
b1d0: 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
b1e0: 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
b1f0: 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
b200: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
b210: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
b220: 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
b230: 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
b240: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
b250: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
b260: 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
b270: 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
b280: 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
b290: 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
b2a0: 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
b2b0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
b2c0: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
b2d0: 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
b2e0: 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
b2f0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
b300: 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
b310: 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
b320: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
b330: 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
b340: 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
b350: 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
b360: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
b370: 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
b3a0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
b3b0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
b3c0: 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
b3d0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
b3e0: 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
b410: 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
b420: 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
b430: 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
b440: 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
b450: 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
b460: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
b470: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
b480: 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
b490: 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
b4a0: 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
b4b0: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
b4c0: 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
b4d0: 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
b4e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
b4f0: 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
b500: 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
b510: 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
b520: 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
b530: 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
b540: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
b550: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
b560: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
b570: 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
b580: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b590: 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
b5a0: 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
b5b0: 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
b5c0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
b5d0: 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
b5e0: 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
b5f0: 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
b600: 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
b610: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
b620: 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
b630: 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
b640: 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
b650: 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
b660: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
b670: 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
b680: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
b690: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
b6a0: 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
b6b0: 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
b6c0: 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
b6d0: 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
b6e0: 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
b6f0: 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
b700: 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
b710: 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
b720: 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
b730: 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
b740: 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
b750: 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
b760: 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
b770: 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
b780: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
b790: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
b7a0: 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
b7b0: 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
b7c0: 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
b7d0: 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
b7e0: 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
b7f0: 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
b800: 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
b810: 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
b820: 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
b830: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
b840: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
b850: 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
b860: 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
b870: 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
b880: 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
b890: 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
b8a0: 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
b8b0: 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
b8c0: 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
b8d0: 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
b8e0: 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
b8f0: 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
b900: 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
b910: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
b920: 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
b930: 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
b940: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
b950: 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
b960: 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
b970: 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
b980: 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
b990: 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
b9a0: 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
b9b0: 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
b9c0: 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
b9d0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
b9e0: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
b9f0: 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
ba00: 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
ba10: 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
ba20: 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
ba30: 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
ba40: 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
ba50: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
ba60: 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
ba70: 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
ba80: 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
ba90: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
baa0: 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
bab0: 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
bac0: 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
bad0: 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
bae0: 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
baf0: 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
bb00: 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
bb10: 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
bb20: 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
bb30: 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
bb40: 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
bb50: 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
bb60: 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
bb70: 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
bb80: 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
bb90: 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
bba0: 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
bbb0: 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
bbc0: 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
bbd0: 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
bbe0: 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
bbf0: 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
bc00: 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
bc10: 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
bc20: 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
bc30: 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  **.** *ppOrderBy
bc40: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
bc50: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
bc60: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
bc70: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
bc80: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
bc90: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
bca0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
bcb0: 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
bcc0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
bcd0: 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
bce0: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
bcf0: 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72  nt, then ppOrder
bd00: 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
bd10: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
bd20: 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
bd30: 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
bd40: 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
bd50: 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
bd60: 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
bd70: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
bd80: 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
bd90: 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
bda0: 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
bdb0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54   set to NULL.  T
bdc0: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
bdd0: 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
bde0: 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63  ents an.** unnec
bdf0: 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74  essary sort of t
be00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66  he result set if
be10: 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
be20: 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a  riate for the.**
be30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
be40: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
be50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68  .**.** If the wh
be60: 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73  ere clause loops
be70: 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e   cannot be arran
be80: 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  ged to provide t
be90: 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75  he correct.** ou
bea0: 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  tput order, then
beb0: 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20   the *ppOrderBy 
bec0: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
bed0: 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
bee0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
bef0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bf00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
bf10: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
bf20: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
bf30: 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
bf40: 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
bf50: 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
bf60: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
bf70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bf80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bf90: 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f    ExprList **ppO
bfa0: 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52  rderBy  /* An OR
bfb0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
bfc0: 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
bfd0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
bfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
bff0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
c000: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
c010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
c020: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
c030: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
c040: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
c050: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c060: 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
c070: 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
c080: 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69  se engine */.  i
c090: 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30  nt brk, cont = 0
c0a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
c0b0: 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72 69  resses used duri
c0c0: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
c0d0: 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
c0e0: 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
c0f0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
c100: 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
c110: 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
c120: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
c130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
c140: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
c150: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
c160: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
c170: 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f  maskSet;       /
c180: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c190: 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
c1a0: 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20  hereClause wc;  
c1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c1c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
c1d0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68   divided into th
c1e0: 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73  ese terms */.  s
c1f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
c200: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
c210: 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
c220: 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
c230: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
c240: 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
c250: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
c260: 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
c270: 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  nfo list */.  in
c280: 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2a0: 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
c2b0: 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
c2c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
c2d0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
c2e0: 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
c2f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77  ination of all w
c300: 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a  c.a[].flags */..
c310: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
c320: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
c330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
c340: 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
c350: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
c360: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
c370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
c380: 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
c390: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c3a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
c3b0: 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
c3c0: 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
c3d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c3e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  .  }..  /* Split
c3f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c400: 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
c410: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
c420: 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
c430: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
c440: 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
c450: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
c460: 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
c470: 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (&maskSet);.  wh
c480: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77  ereClauseInit(&w
c490: 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 77 68  c, pParse);.  wh
c4a0: 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20 70 57  ereSplit(&wc, pW
c4b0: 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
c4c0: 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74     .  /* Allocat
c4d0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
c4e0: 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
c4f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
c500: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
c510: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
c520: 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d  .  */.  pWInfo =
c530: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
c540: 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
c550: 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   + pTabList->nSr
c560: 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  c*sizeof(WhereLe
c570: 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  vel));.  if( sql
c580: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
c590: 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  () ){.    goto w
c5a0: 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a  hereBeginNoMem;.
c5b0: 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50    }.  pWInfo->pP
c5c0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c5d0: 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
c5e0: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
c5f0: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
c600: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c610: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
c620: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
c630: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
c640: 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
c650: 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
c660: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
c670: 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
c680: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
c690: 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
c6a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
c6b0: 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  e && (pTabList->
c6c0: 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  nSrc==0 || sqlit
c6d0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
c6e0: 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
c6f0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
c700: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
c710: 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
c720: 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68 65  ak, 1);.    pWhe
c730: 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
c740: 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
c750: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
c760: 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
c770: 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
c780: 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
c790: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
c7a0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
c7b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
c7c0: 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
c7d0: 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
c7e0: 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
c7f0: 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
c800: 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
c810: 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
c820: 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
c830: 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
c840: 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
c850: 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
c860: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
c870: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
c880: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74   i++){.    creat
c890: 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  eMask(&maskSet, 
c8a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
c8b0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65  Cursor);.  }.  e
c8c0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
c8d0: 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b 53 65 74  abList, &maskSet
c8e0: 2c 20 26 77 63 29 3b 0a 20 20 69 66 28 20 73 71  , &wc);.  if( sq
c8f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
c900: 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
c910: 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
c920: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
c930: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
c940: 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
c950: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
c960: 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
c970: 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
c980: 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
c990: 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
c9a0: 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
c9b0: 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
c9c0: 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
c9d0: 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
c9e0: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
c9f0: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66     pWInfo->a[].f
ca00: 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78  lags     WHERE_x
ca10: 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
ca20: 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
ca30: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
ca40: 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
ca50: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
ca60: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
ca70: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
ca80: 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e  ].iFrom     When
ca90: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
caa0: 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
cab0: 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
cac0: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
cad0: 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
cae0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
caf0: 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
cb00: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
cb10: 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
cb20: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
cb30: 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a   index.  **.  **
cb40: 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
cb50: 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
cb60: 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
cb70: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
cb80: 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
cb90: 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
cba0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
cbb0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
cbc0: 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
cbd0: 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
cbe0: 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
cbf0: 0a 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  .  TRACE(("*** O
cc00: 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
cc10: 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69  **\n"));.  for(i
cc20: 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c  =iFrom=0, pLevel
cc30: 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
cc40: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
cc50: 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
cc60: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc80: 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
cc90: 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
cca0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61  m */.    int fla
ccb0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
ccc0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
ccd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
cce0: 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  Idx */.    int n
ccf0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
cd00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd10: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
cd20: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
cd30: 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20  double cost;    
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd50: 68 65 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78  he cost for pIdx
cd60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20   */.    int j;  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
cd90: 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62  ng over FROM tab
cda0: 6c 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  les */.    Index
cdb0: 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
cdc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65         /* The be
cdd0: 73 74 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f  st index seen so
cde0: 20 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20   far */.    int 
cdf0: 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20  bestFlags = 0;  
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
ce10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ce20: 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e   pBest */.    in
ce30: 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20  t bestNEq = 0;  
ce40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71            /* nEq
ce50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ce60: 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f   pBest */.    do
ce70: 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b  uble lowestCost;
ce80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
ce90: 74 20 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a  t of the pBest *
cea0: 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20  /.    int bestJ 
ceb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
cec0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
ced0: 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  f j */.    Bitma
cee0: 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20  sk m;           
cef0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
cf00: 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72  k value for j or
cf10: 20 62 65 73 74 4a 20 2a 2f 0a 0a 20 20 20 20 6c   bestJ */..    l
cf20: 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49  owestCost = SQLI
cf30: 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
cf40: 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61  for(j=iFrom, pTa
cf50: 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d  bItem=&pTabList-
cf60: 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73  >a[j]; j<pTabLis
cf70: 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54  t->nSrc; j++, pT
cf80: 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20  abItem++){.     
cf90: 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61   m = getMask(&ma
cfa0: 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
cfb0: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
cfc0: 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61   if( (m & notRea
cfd0: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
cfe0: 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29    if( j==iFrom )
cff0: 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20   iFrom++;.      
d000: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d010: 20 20 7d 0a 20 20 20 20 20 20 63 6f 73 74 20 3d    }.      cost =
d020: 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
d030: 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
d040: 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72     (i==0 && ppOr
d070: 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65  derBy) ? *ppOrde
d080: 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  rBy : 0,.       
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26  &pIdx, &flags, &
d0b0: 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
d0c0: 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20  cost<lowestCost 
d0d0: 29 7b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73  ){.        lowes
d0e0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
d0f0: 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
d100: 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  dx;.        best
d110: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
d120: 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d         bestNEq =
d130: 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65   nEq;.        be
d140: 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  stJ = j;.      }
d150: 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
d160: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
d170: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
d180: 53 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  SS))!=0.        
d190: 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28 70 54 61   || (j>0 && (pTa
d1a0: 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79  bItem[-1].jointy
d1b0: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
d1c0: 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20  _CROSS))!=0).   
d1d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
d1e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d1f0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2a   }.    TRACE(("*
d200: 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f  ** Optimizer cho
d210: 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72  ose table %d for
d220: 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73   loop %d\n", bes
d230: 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  tJ,.           p
d240: 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29  Level-pWInfo->a)
d250: 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74  );.    if( (best
d260: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
d270: 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20  DERBY)!=0 ){.   
d280: 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
d290: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64  0;.    }.    and
d2a0: 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61  Flags &= bestFla
d2b0: 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
d2c0: 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67  flags = bestFlag
d2d0: 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  s;.    pLevel->p
d2e0: 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20  Idx = pBest;.   
d2f0: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62   pLevel->nEq = b
d300: 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76  estNEq;.    pLev
d310: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b  el->aInLoop = 0;
d320: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
d330: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42   = 0;.    if( pB
d340: 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  est ){.      pLe
d350: 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
d360: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d380: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
d390: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
d3a0: 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
d3b0: 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
d3c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
d3d0: 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
d3e0: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
d3f0: 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52 41  bestJ;.  }.  TRA
d400: 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
d410: 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
d420: 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n"));..  /* If t
d430: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
d440: 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
d450: 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
d460: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
d470: 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
d480: 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
d490: 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
d4a0: 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
d4b0: 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  & ppOrderBy ){. 
d4c0: 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
d4d0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  0;.  }..  /* Ope
d4e0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
d4f0: 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
d500: 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
d510: 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
d520: 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
d530: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
d540: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
d550: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
d560: 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
d570: 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
d580: 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65 76 65   Goto */.  pLeve
d590: 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
d5a0: 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
d5b0: 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
d5c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
d5d0: 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
d5e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
d5f0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
d600: 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  pen */.    Index
d610: 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49   *pIx;      /* I
d620: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
d630: 65 73 73 20 70 54 61 62 20 28 69 66 20 61 6e 79  ess pTab (if any
d640: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  ) */.    int iDb
d650: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
d660: 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
d670: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
d680: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
d690: 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
d6a0: 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66  l->iIdxCur;..#if
d6b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d6c0: 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
d6d0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d6e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==2 ){.      cha
d6f0: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73  r *zMsg;.      s
d700: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
d710: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
d720: 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
d730: 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a  >iFrom];.      z
d740: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
d750: 69 6e 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c  intf("TABLE %s",
d760: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
d770: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
d780: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
d790: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
d7a0: 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20  3MPrintf("%z AS 
d7b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
d7c0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
d7d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 49   }.      if( (pI
d7e0: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
d7f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
d800: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
d810: 72 69 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49  rintf("%z WITH I
d820: 4e 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20  NDEX %s", zMsg, 
d830: 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pIx->zName);.   
d840: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
d850: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48  vel->flags & (WH
d860: 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
d870: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
d880: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
d890: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d8a0: 28 22 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41  ("%z USING PRIMA
d8b0: 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
d8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d8d0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d8e0: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70  OP_Explain, i, p
d8f0: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d  Level->iFrom, zM
d900: 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  sg, P3_DYNAMIC);
d910: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
d920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d930: 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62  LAIN */.    pTab
d940: 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
d950: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
d960: 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
d970: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
d980: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
d990: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
d9a0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
d9b0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66  pSchema);.    if
d9c0: 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
d9d0: 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  ent || pTab->pSe
d9e0: 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
d9f0: 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
da00: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
da10: 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
da20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
da30: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
da40: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
da50: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
da60: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
da70: 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c   if( pTab->nCol<
da80: 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  (sizeof(Bitmask)
da90: 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  *8) ){.        B
daa0: 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
dab0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
dac0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
dad0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
dae0: 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 3b 0a  ; b=b>>1, n++);.
daf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
db00: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73  dbeChangeP2(v, s
db10: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
db20: 74 41 64 64 72 28 76 29 2d 31 2c 20 6e 29 3b 0a  tAddr(v)-1, n);.
db30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
db40: 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
db50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
db60: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
db70: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
db80: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
db90: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
dba0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
dbb0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
dbc0: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
dbd0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78  or;.    if( (pIx
dbe0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29   = pLevel->pIdx)
dbf0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  !=0 ){.      Key
dc00: 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
dc10: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
dc20: 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
dc30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
dc40: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
dc50: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
dc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
dc80: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
dc90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
dca0: 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e   "# %s", pIx->zN
dcb0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
dcc0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
dcd0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
dce0: 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a  Cur, pIx->tnum,.
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
dd10: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
dd20: 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20  DOFF);.    }.   
dd30: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
dd40: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
dd50: 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
dd60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dd70: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
dd80: 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c  olumns, iIdxCur,
dd90: 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29   pIx->nColumn+1)
dda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ddb0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
ddc0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
ddd0: 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
dde0: 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
ddf0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
de00: 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
de10: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
de20: 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
de30: 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
de40: 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
de50: 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
de60: 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
de70: 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
de80: 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
de90: 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
dea0: 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
deb0: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  sk)0;.  for(i=0,
dec0: 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
ded0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
dee0: 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
def0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  ++){.    int j;.
df00: 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
df10: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
df20: 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63  ;  /* The VDBE c
df30: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
df40: 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ble */.    Index
df50: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a   *pIdx;       /*
df60: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
df70: 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
df80: 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
df90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
dfa0: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
dfb0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
dfc0: 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
dfd0: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
dfe0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
dff0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65  y */.    int bRe
e000: 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  v;          /* T
e010: 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
e020: 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
e030: 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20  e order */..    
e040: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
e050: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
e060: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72  iFrom];.    iCur
e070: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
e080: 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d  rsor;.    pIdx =
e090: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20   pLevel->pIdx;. 
e0a0: 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
e0b0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
e0c0: 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
e0d0: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
e0e0: 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20  REVERSE)!=0;.   
e0f0: 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
e100: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e110: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
e120: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
e130: 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
e140: 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
e150: 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
e160: 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ons.    ** for t
e170: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
e180: 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f    Jump to brk to
e190: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
e1a0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d  loop..    ** Jum
e1b0: 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
e1c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
e1d0: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
e1e0: 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  n of the.    ** 
e1f0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
e200: 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
e210: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
e220: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e230: 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d    cont = pLevel-
e240: 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  >cont = sqlite3V
e250: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
e260: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
e270: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
e280: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
e290: 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
e2a0: 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e  te and.    ** in
e2b0: 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
e2c0: 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
e2d0: 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
e2e0: 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
e2f0: 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
e300: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
e310: 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e join..    */. 
e320: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
e330: 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
e340: 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  tem[-1].jointype
e350: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
e360: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
e370: 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72  rse->nMem ) pPar
e380: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
e390: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
e3a0: 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  oin = pParse->nM
e3b0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  em++;.      sqli
e3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e3d0: 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c  OP_MemInt, 0, pL
e3e0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
e3f0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
e400: 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20  ent((v, "# init 
e410: 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
e420: 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  ch flag"));.    
e430: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  }..    if( pLeve
e440: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
e450: 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
e460: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
e470: 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
e480: 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
e490: 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
e4a0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
e4b0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
e4c0: 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
e4d0: 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
e4e0: 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
e4f0: 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
e500: 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
e510: 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
e520: 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a   (...)".      **
e530: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
e540: 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uct..      */.  
e550: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
e560: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
e570: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
e580: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
e590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
e5a0: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rm!=0 );.      a
e5b0: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
e5c0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
e5d0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c  assert( pTerm->l
e5e0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
e5f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e600: 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
e610: 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c  .      codeEqual
e620: 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
e630: 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76  pTerm, brk, pLev
e640: 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  el);.      sqlit
e650: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e660: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20  P_MustBeInt, 1, 
e670: 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  brk);.      sqli
e680: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e690: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
e6a0: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
e6b0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e6c0: 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c  "pk"));.      pL
e6d0: 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
e6e0: 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
e6f0: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
e700: 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
e710: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
e720: 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
e730: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
e740: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
e750: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
e760: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
e770: 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
e780: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e  P_Noop;.      in
e790: 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57  t start;.      W
e7a0: 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
e7b0: 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20  , *pEnd;..      
e7c0: 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
e7d0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  e==0 );.      pS
e7e0: 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
e7f0: 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
e800: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
e810: 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_GE, 0);.      
e820: 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
e830: 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
e840: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
e850: 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_LE, 0);.      
e860: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
e870: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
e880: 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61  rt;.        pSta
e890: 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
e8a0: 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
e8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e8c0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
e8d0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
e8e0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61         pX = pSta
e8f0: 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
e900: 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
e910: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
e920: 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
e930: 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
e940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e950: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e960: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
e970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72 63  AddOp(v, OP_Forc
e990: 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  eInt, pX->op==TK
e9a0: 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LE || pX->op==T
e9b0: 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20  K_GT, brk);.    
e9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9d0: 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f  ddOp(v, bRev ? O
e9e0: 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f  P_MoveLt : OP_Mo
e9f0: 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 29  veGe, iCur, brk)
ea00: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ea10: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
ea20: 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
ea30: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
ea40: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tart);.      }el
ea50: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ea60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ea70: 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
ea80: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
ea90: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
eaa0: 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29        if( pEnd )
eab0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
eac0: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
ead0: 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
eae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
eaf0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
eb00: 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
eb10: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
eb20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
eb40: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
eb50: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
eb60: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
eb70: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  m++;.        sql
eb80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
eb90: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
eba0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
ebb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e          if( pX->
ebc0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
ebd0: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
ebe0: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
ebf0: 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
ec00: 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Ge;.        }
ec10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ec20: 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
ec30: 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
ec40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ec50: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
ec60: 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
ec70: 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20    }.      start 
ec80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ec90: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
eca0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
ecb0: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
ecc0: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
ecd0: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
ece0: 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
ecf0: 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
ed00: 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
ed10: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
ed20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ed30: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  Op(v, OP_Rowid, 
ed40: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
ed50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ed60: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
ed70: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
ed80: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
ed90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
eda0: 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f 41  testOp, SQLITE_A
edb0: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72 6b 29  FF_NUMERIC, brk)
edc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
edd0: 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
ede0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
edf0: 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
ee00: 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 54      /* Case 3: T
ee10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ee20: 74 65 72 6d 20 74 68 61 74 20 72 65 66 65 72 73  term that refers
ee30: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ee40: 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
ee50: 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68      column of th
ee60: 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6e  e index is an in
ee70: 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72 20 65  equality.  For e
ee80: 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20 20  xample, if.     
ee90: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
eea0: 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
eeb0: 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48 45 52  ,z) and the WHER
eec0: 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  E clause is of t
eed0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  he.      **     
eee0: 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20 41 4e      form "x=5 AN
eef0: 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74 68 69  D y<10" then thi
ef00: 73 20 63 61 73 65 20 69 73 20 75 73 65 64 2e 20  s case is used. 
ef10: 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20 20   Only the.      
ef20: 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67 68 74  **         right
ef30: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
ef40: 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
ef50: 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
ef60: 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  t.      **      
ef70: 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
ef80: 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
ef90: 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rs..      **.   
efa0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
efb0: 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
efc0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
efd0: 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
efe0: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  use.      **    
eff0: 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
f000: 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
f010: 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
f020: 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20  , in order.     
f030: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
f040: 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
f050: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
f060: 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
f070: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f080: 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
f090: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
f0a0: 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e  l->nEq;.      in
f0b0: 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20 20 20  t topEq=0;      
f0c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 70    /* True if top
f0d0: 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20   limit uses ==. 
f0e0: 46 61 6c 73 65 20 69 73 20 73 74 72 69 63 74 6c  False is strictl
f0f0: 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  y < */.      int
f100: 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20 20 20   btmEq=0;       
f110: 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74 6d 20   /* True if btm 
f120: 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46  limit uses ==. F
f130: 61 6c 73 65 20 69 66 20 73 74 72 69 63 74 6c 79  alse if strictly
f140: 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20   > */.      int 
f150: 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20 20  topOp, btmOp;   
f160: 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66 6f 72  /* Operators for
f170: 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62 6f 74   the top and bot
f180: 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75 6e 64  tom search bound
f190: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74  s */.      int t
f1a0: 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e 74  estOp;.      int
f1b0: 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20   nNotNull;      
f1c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
f1d0: 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68 61 74  ws of index that
f1e0: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
f1f0: 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74  L */.      int t
f200: 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  opLimit = (pLeve
f210: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
f220: 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _TOP_LIMIT)!=0;.
f230: 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d        int btmLim
f240: 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
f250: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
f260: 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20 20  LIMIT)!=0;..    
f270: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f280: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
f290: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
f2a0: 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
f2b0: 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  IN.      ** and 
f2c0: 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73  level the values
f2d0: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
f2e0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
f2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
f300: 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
f310: 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
f320: 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c  , &wc, notReady,
f330: 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a   brk);..      /*
f340: 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 65   Duplicate the e
f350: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61 6c  quality term val
f360: 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65 79  ues because they
f370: 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20 20   will all be.   
f380: 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63 65     ** used twice
f390: 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74  : once to make t
f3a0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
f3b0: 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20 6d  ey and once to m
f3c0: 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ake the.      **
f3d0: 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20   start key..    
f3e0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a    */.      for(j
f3f0: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
f400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f410: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f420: 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29 3b 0a  Dup, nEq-1, 0);.
f430: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f440: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
f450: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  t comparison ope
f460: 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20 66 6f  rators to use fo
f470: 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  r top and bottom
f480: 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61 72 63   .      ** searc
f490: 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20 61 6e  h bounds. For an
f4a0: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
f4b0: 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62 6f 75  , the bottom bou
f4c0: 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e 3d 0a  nd is a > or >=.
f4d0: 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f        ** operato
f4e0: 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20 62 6f  r and the top bo
f4f0: 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20 3c 3d  und is a < or <=
f500: 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f 72 20   operator.  For 
f510: 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20 20  a descending.   
f520: 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68 65 20     ** index the 
f530: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 72 65  operators are re
f540: 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  versed..      */
f550: 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c 6c 20  .      nNotNull 
f560: 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74  = nEq + topLimit
f570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
f580: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
f590: 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
f5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f   ){.        topO
f5b0: 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  p = WO_LT|WO_LE;
f5c0: 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d  .        btmOp =
f5d0: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20   WO_GT|WO_GE;.  
f5e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f5f0: 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47 54     topOp = WO_GT
f600: 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20 20  |WO_GE;.        
f610: 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f  btmOp = WO_LT|WO
f620: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57 41  _LE;.        SWA
f630: 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74 2c  P(int, topLimit,
f640: 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20 20   btmLimit);.    
f650: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
f660: 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d 69  nerate the termi
f670: 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69  nation key.  Thi
f680: 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61 6c  s is the key val
f690: 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ue that.      **
f6a0: 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73 65   will end the se
f6b0: 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
f6c0: 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  no termination k
f6d0: 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  ey if there.    
f6e0: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75 61    ** are no equa
f6f0: 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20 6e  lity terms and n
f700: 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a  o "X<..." term..
f710: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f720: 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f  * 2002-Dec-04: O
f730: 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  n a reverse-orde
f740: 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63  r scan, the so-c
f750: 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74 69  alled "terminati
f760: 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  on".      ** key
f770: 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20 72   computed here r
f780: 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65  eally ends up be
f790: 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b 65  ing the start ke
f7a0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
f7b0: 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29    if( topLimit )
f7c0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
f7d0: 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
f7e0: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
f7f0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
f800: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
f810: 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
f820: 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70  tReady, topOp, p
f830: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
f840: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
f850: 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
f860: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
f870: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
f880: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
f890: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
f8a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f8b0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f8c0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
f8d0: 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54 65 72      topEq = pTer
f8e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
f8f0: 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
f900: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
f910: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
f920: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  ;.        testOp
f930: 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20   = OP_IdxGE;.   
f940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f950: 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30    testOp = nEq>0
f960: 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50   ? OP_IdxGE : OP
f970: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 74  _Noop;.        t
f980: 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  opEq = 1;.      
f990: 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  }.      if( test
f9a0: 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
f9b0: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20         int nCol 
f9c0: 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74  = nEq + topLimit
f9d0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
f9e0: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
f9f0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
fa00: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
fa10: 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c 20 62  (v, nCol, nEq, b
fa20: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
fa30: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
fa40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
fa50: 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76  = topEq ? OP_Mov
fa60: 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b  eLe : OP_MoveLt;
fa70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fa80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
fa90: 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  p, iIdxCur, brk)
faa0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fab0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fac0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fad0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76  P_MemStore, pLev
fae0: 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  el->iMem, 1);.  
faf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
fb00: 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
fb10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fb20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c  dbeAddOp(v, OP_L
fb30: 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ast, iIdxCur, br
fb40: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
fb50: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
fb60: 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54  he start key.  T
fb70: 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 74  his is the key t
fb80: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
fb90: 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62  lower.      ** b
fba0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72  ound on the sear
fbb0: 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ch.  There is no
fbc0: 20 73 74 61 72 74 20 6b 65 79 20 69 66 20 74 68   start key if th
fbd0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20  ere are no.     
fbe0: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72   ** equality ter
fbf0: 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72 65 20  ms and if there 
fc00: 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65  is no "X>..." te
fc10: 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a  rm.  In.      **
fc20: 20 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65   that case, gene
fc30: 72 61 74 65 20 61 20 22 52 65 77 69 6e 64 22 20  rate a "Rewind" 
fc40: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70  instruction in p
fc50: 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  lace of the.    
fc60: 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73    ** start key s
fc70: 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a  earch..      **.
fc80: 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65        ** 2002-De
fc90: 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73  c-04: In the cas
fca0: 65 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f  e of a reverse-o
fcb0: 72 64 65 72 20 73 65 61 72 63 68 2c 20 74 68 65  rder search, the
fcc0: 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20   so-called.     
fcd0: 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20   ** "start" key 
fce0: 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
fcf0: 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68 65  eing used as the
fd00: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79   termination key
fd10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fd20: 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b   if( btmLimit ){
fd30: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
fd40: 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  X;.        int k
fd50: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
fd60: 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  n[j];.        pT
fd70: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
fd80: 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  wc, iCur, k, not
fd90: 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49  Ready, btmOp, pI
fda0: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  dx);.        ass
fdb0: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
fdc0: 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54  .        pX = pT
fdd0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
fde0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
fdf0: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
fe00: 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe20: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
fe30: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
fe40: 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d     btmEq = pTerm
fe50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
fe60: 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
fe70: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
fe80: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
fe90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fea0: 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b        btmEq = 1;
feb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fec0: 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c  f( nEq>0 || btmL
fed0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
fee0: 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
fef0: 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20   btmLimit;.     
ff00: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
ff10: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c 20 62  be(v, nCol, 0, b
ff20: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
ff30: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
ff40: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
ff50: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
ff60: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
ff70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff80: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
ff90: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
ffa0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74   1);.          t
ffb0: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54  estOp = OP_IdxLT
ffc0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ffd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
ffe0: 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f 4d  p = btmEq ? OP_M
fff0: 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47  oveGe : OP_MoveG
10000 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
10010 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10020 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72   op, iIdxCur, br
10030 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
10040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
10050 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ev ){.        te
10060 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
10070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10090 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
100a0 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  nd, iIdxCur, brk
100b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
100c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
100d0 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  e the top of the
100e0 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72 65   loop.  If there
100f0 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f   is a terminatio
10100 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 77  n.      ** key w
10110 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20 66  e have to test f
10120 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64 20  or that key and 
10130 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f 70  abort at the top
10140 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
10150 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
10160 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
10170 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10180 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69  Addr(v);.      i
10190 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
101a0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  op ){.        sq
101b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
101c0 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
101d0 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
101e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
101f0 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74  dbeAddOp(v, test
10200 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Op, iIdxCur, brk
10210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
10220 74 6f 70 45 71 20 26 26 20 21 62 52 65 76 29 20  topEq && !bRev) 
10230 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20 62 52  || (!btmEq && bR
10240 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ev) ){.         
10250 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10260 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22 2c  geP3(v, -1, "+",
10270 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b  AddOp(v, OP_RowK
102b0 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  ey, iIdxCur, 0);
102c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
102d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
102e0 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e 75 6c  xIsNull, nNotNul
102f0 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20  l, cont);.      
10300 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
10310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10320 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10330 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
10340 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
10350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10360 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
10370 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
10380 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72  ..      /* Recor
10390 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
103a0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
103b0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20  ate the loop..  
103c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65      */.      pLe
103d0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
103e0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
103f0 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
10400 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
10410 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
10420 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
10430 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
10440 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
10450 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20  LUMN_EQ ){.     
10460 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65   /* Case 4:  The
10470 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61  re is an index a
10480 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  nd all terms of 
10490 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
104a0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20   that.      **  
104b0 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74 6f          refer to
104c0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
104d0 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e   the "==" or "IN
104e0 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20  " operators..   
104f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
10500 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
10510 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
10520 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  Eq;..      /* Ge
10530 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
10540 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
10550 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
10560 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
10570 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20 74    ** and leave t
10580 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
10590 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
105a0 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
105b0 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
105c0 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
105d0 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
105e0 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a  notReady, brk);.
105f0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
10600 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20  te a single key 
10610 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
10620 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74 20  d to both start 
10630 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20 20  and terminate.  
10640 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63      ** the searc
10650 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  h.      */.     
10660 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
10670 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72 6b 2c  (v, nEq, 0, brk,
10680 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71   pIdx);.      sq
10690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
106a0 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
106b0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
106c0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
106d0 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f 20  ate code (1) to 
106e0 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72 73  move to the firs
106f0 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
10700 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
10710 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 67  .      ** Then g
10720 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32 29  enerate code (2)
10730 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 22   that jumps to "
10740 62 72 6b 22 20 61 66 74 65 72 20 74 68 65 20 63  brk" after the c
10750 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20 20  ursor is past.  
10760 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
10770 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74  matching element
10780 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
10790 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73 20  The code (1) is 
107a0 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20 2a  executed.      *
107b0 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  * once to initia
107c0 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68 2c  lize the search,
107d0 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69 73   the code (2) is
107e0 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72 65   executed before
107f0 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20 69   each.      ** i
10800 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
10810 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20 74  scan to see if t
10820 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e 69  he scan has fini
10830 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69  shed. */.      i
10840 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
10850 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65     /* Scan in re
10860 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
10870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10880 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
10890 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c 20 62  veLe, iIdxCur, b
108a0 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  rk);.        sta
108b0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
108c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
108d0 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
108e0 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
108f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10900 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64  v, OP_IdxLT, iId
10910 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
10920 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
10930 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20   OP_Prev;.      
10940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
10950 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f  * Scan in the fo
10960 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rward order */. 
10970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10980 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
10990 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c 20 62  veGe, iIdxCur, b
109a0 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  rk);.        sta
109b0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
109c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
109d0 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
109e0 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
109f0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
10a00 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43   OP_IdxGE, iIdxC
10a10 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33  ur, brk, "+", P3
10a20 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10a30 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
10a40 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  P_Next;.      }.
10a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
10a70 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29  Key, iIdxCur, 0)
10a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10a90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10aa0 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c 20 63  dxIsNull, nEq, c
10ab0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ont);.      if( 
10ac0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
10ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ae0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10af0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
10b00 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10b10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10b20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
10b30 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10b40 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
10b50 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70  iIdxCur;.      p
10b60 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
10b70 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
10b80 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
10b90 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
10ba0 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
10bb0 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
10bc0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
10bd0 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
10be0 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
10bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
10c00 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
10c10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10c20 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20  ( bRev==0 );.   
10c30 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
10c40 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
10c50 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
10c60 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
10c70 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
10c80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10c90 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
10ca0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  k);.    }.    no
10cb0 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
10cc0 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75  sk(&maskSet, iCu
10cd0 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65  r);..    /* Inse
10ce0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
10cf0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
10d00 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
10d10 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a  completely.    *
10d20 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
10d30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
10d40 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   of tables..    
10d50 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  */.    for(pTerm
10d60 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72  =wc.a, j=wc.nTer
10d70 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
10d80 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  rm++){.      Exp
10d90 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28  r *pE;.      if(
10da0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
10db0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
10dc0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
10dd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
10de0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
10df0 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
10e00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10e10 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
10e20 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
10e30 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
10e40 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
10e50 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
10e60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
10e70 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
10e80 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
10e90 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
10ea0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
10eb0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
10ec0 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  cont, 1);.      
10ed0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
10ee0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
10ef0 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  }..    /* For a 
10f00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
10f10 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
10f20 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
10f30 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
10f40 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
10f50 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
10f60 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
10f70 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
10f80 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ble.  .    */.  
10f90 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
10fa0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
10fb0 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73   pLevel->top = s
10fc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10fd0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
10fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ff0 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
11000 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
11010 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oin);.      Vdbe
11020 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72  Comment((v, "# r
11030 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
11040 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66 6f  hit"));.      fo
11050 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d  r(pTerm=wc.a, j=
11060 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a  0; j<wc.nTerm; j
11070 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
11080 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
11090 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  >flags & (TERM_V
110a0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
110b0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
110c0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
110d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
110e0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
110f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
11100 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
11110 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
11120 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11130 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
11140 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20 31  ->pExpr, cont, 1
11150 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
11160 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
11170 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  CODED;.      }. 
11180 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
11190 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a   SQLITE_TEST  /*
111a0 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   For testing and
111b0 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
111c0 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f  nly */.  /* Reco
111d0 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  rd in the query 
111e0 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  plan information
111f0 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65   about the curre
11200 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e  nt table.  ** an
11210 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  d the index used
11220 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69   to access it (i
11230 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20  f any).  If the 
11240 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a  table itself.  *
11250 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69  * is not used, i
11260 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  ts name is just 
11270 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64  '{}'.  If no ind
11280 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  ex is used.  ** 
11290 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73  the index is lis
112a0 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66  ted as "{}".  If
112b0 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
112c0 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a   is used the.  *
112d0 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20  * index name is 
112e0 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  '*'..  */.  for(
112f0 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
11300 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
11310 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e   char *z;.    in
11320 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  t n;.    pLevel 
11330 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
11340 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
11350 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
11360 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
11370 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a   z = pTabItem->z
11380 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a  Alias;.    if( z
11390 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74  ==0 ) z = pTabIt
113a0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  em->pTab->zName;
113b0 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
113c0 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51  z);.    if( n+nQ
113d0 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
113e0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
113f0 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )-10 ){.      if
11400 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
11410 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
11420 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63   ){.        strc
11430 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
11440 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
11450 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  "{}");.        n
11460 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
11470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11480 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
11490 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
114a0 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  an], z);.       
114b0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
114c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
114d0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
114e0 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
114f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
11500 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57  evel->flags & (W
11510 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
11520 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
11530 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79   ){.      strcpy
11540 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
11550 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a  plan[nQPlan], "*
11560 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   ");.      nQPla
11570 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
11580 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49  e if( pLevel->pI
11590 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  dx==0 ){.      s
115a0 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
115b0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
115c0 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20 20 20  ], "{} ");.     
115d0 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20   nQPlan += 3;.  
115e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
115f0 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c   = strlen(pLevel
11600 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pIdx->zName);.
11610 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c        if( n+nQPl
11620 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
11630 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
11640 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  2 ){.        str
11650 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
11660 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
11670 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a   pLevel->pIdx->z
11680 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Name);.        n
11690 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
116a0 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
116b0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
116c0 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a   = ' ';.      }.
116d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
116e0 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
116f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
11700 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
11710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11720 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
11730 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
11740 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11750 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
11760 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
11770 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
11780 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
11790 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
117a0 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
117b0 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
117c0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
117d0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
117e0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
117f0 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
11800 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
11810 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
11820 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68  nue = cont;.  wh
11830 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
11840 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  wc);.  return pW
11850 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
11860 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
11870 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
11880 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72  ginNoMem:.  wher
11890 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
118a0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
118b0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
118c0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
118d0 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
118e0 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
118f0 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
11900 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
11910 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
11920 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11930 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
11940 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
11950 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11960 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
11970 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70  WInfo->pParse->p
11980 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
11990 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
119a0 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  vel;.  SrcList *
119b0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
119c0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20  o->pTabList;..  
119d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
119e0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
119f0 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
11a00 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pTabList->nSrc-1
11a10 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
11a20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
11a30 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71  fo->a[i];.    sq
11a40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11a50 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
11a60 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  >cont);.    if( 
11a70 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
11a80 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
11a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11aa0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
11ab0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
11ac0 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p2);.    }.    
11ad0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11ae0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
11af0 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  l->brk);.    if(
11b00 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a   pLevel->nIn ){.
11b10 20 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20        int *a;.  
11b20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11b30 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e   for(j=pLevel->n
11b40 49 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61  In, a=&pLevel->a
11b50 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b 20 6a  InLoop[j*3-3]; j
11b60 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29 7b 0a  >0; j--, a-=3){.
11b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11b80 64 62 65 41 64 64 4f 70 28 76 2c 20 61 5b 30 5d  dbeAddOp(v, a[0]
11b90 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
11ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11bb0 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e  iteFree(pLevel->
11bc0 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
11bd0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
11be0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
11bf0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
11c00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
11c10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11c20 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65  _IfMemPos, pLeve
11c30 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29  l->iLeftJoin, 0)
11c40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11c50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11c60 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
11c70 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20  ->a[i].iCursor, 
11c80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  0);.      if( pL
11c90 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
11ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11cb0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11cc0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
11cd0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b  el->iIdxCur, 0);
11ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11d00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
11d10 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20  Level->top);.   
11d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11d30 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
11d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11d50 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
11d60 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
11d70 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11d80 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
11d90 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
11da0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11dc0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
11dd0 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
11de0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
11df0 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
11e00 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
11e10 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Begin..  */.  fo
11e20 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
11e30 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
11e40 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
11e50 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73  pLevel++){.    s
11e60 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
11e70 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
11e80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
11e90 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
11ea0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
11eb0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
11ec0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
11ed0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
11ee0 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c  b->isTransient |
11ef0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
11f00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11f10 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  if( (pLevel->fla
11f20 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
11f30 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
11f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f50 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  p(v, OP_Close, p
11f60 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
11f70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
11f80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
11f90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
11fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11fb0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
11fc0 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  l->iIdxCur, 0);.
11fd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
11fe0 6b 65 20 63 75 72 73 6f 72 20 73 75 62 73 74 69  ke cursor substi
11ff0 74 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65  tutions for case
12000 73 20 77 68 65 72 65 20 77 65 20 77 61 6e 74 20  s where we want 
12010 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75  to use.    ** ju
12020 73 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  st the index and
12030 20 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63 65   never reference
12040 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
12050 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
12060 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
12070 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
12080 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
12090 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
120a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
120b0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
120c0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
120d0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
120e0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
120f0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
12100 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
12110 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
12120 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
12130 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
12140 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
12150 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
12160 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
12170 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
12180 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
12190 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
121a0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
121b0 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y ){.      int i
121c0 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
121d0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
121e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
121f0 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a  = pLevel->pIdx;.
12200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12210 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
12220 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
12230 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
12240 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
12250 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
12260 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
12270 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 57 49  .      for(i=pWI
12280 6e 66 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73  nfo->iTop; i<las
12290 74 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; i++, pOp++){.
122a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
122b0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
122c0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
122d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
122e0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
122f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
12300 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
12310 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
12320 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
12330 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
12340 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
12350 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
12360 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
12370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12380 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
123a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
123b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
123c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
123d0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
123e0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
123f0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
12400 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
12410 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
12420 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
12430 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
12440 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
12450 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a  ==OP_NullRow ){.
12460 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
12470 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
12480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
124a0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
124b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
124c0 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
124d0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.