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

Artifact 485041aa51fb33f43b346e018f7c01422847f364:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 36 35   where.c,v 1.165
0340: 20 32 30 30 35 2f 30 38 2f 32 34 20 30 33 3a 35   2005/08/24 03:5
0350: 32 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a 2a  2:19 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 6f 70 65 72 61 74 6f 72 3b  .  u16 operator;
0d00: 20 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 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  e by the AND ope
22a0: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
22b0: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
22c0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
22d0: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
22e0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
22f0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
2300: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
2310: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
2320: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
2330: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
2340: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
2350: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
2360: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
2370: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
2380: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
2390: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
23a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
23c0: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
23d0: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
23e0: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
23f0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
2400: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
2410: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
2420: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
2430: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
2440: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
2450: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
2460: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
2470: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
2480: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
2490: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
24a0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
24b0: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
24c0: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
24d0: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
24e0: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
24f0: 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67 72  .  This array gr
2500: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
2510: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
2520: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2530: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
2540: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
2550: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
2560: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
2570: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  pr, int op){.  i
2580: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
2590: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
25a0: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
25b0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
25c0: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
25d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25e0: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
25f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
2600: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
2610: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
2620: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
2630: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2640: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
2650: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
2660: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
2670: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
2680: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
2690: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26a0: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
26b0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
26c0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
26d0: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
26e0: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
26f0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2700: 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61  k getMask(ExprMa
2710: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2720: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2730: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2740: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2760: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2770: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2780: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
2790: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
27a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
27b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
27c0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
27d0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
27e0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
27f0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
2800: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2810: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
2820: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
2830: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2840: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
2850: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
2860: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
2870: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
2880: 69 65 6e 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ien.  So we know
2890: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
28a0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
28b0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
28c0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
28d0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
28e0: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
28f0: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
2900: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
2910: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 52  pMaskSet->n < AR
2920: 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65 74  RAYSIZE(pMaskSet
2930: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
2940: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
2950: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
2960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2970: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
2980: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
2990: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
29a0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
29b0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
29c0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
29d0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
29e0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
29f0: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
2a00: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
2a10: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
2a20: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2a30: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
2a40: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
2a50: 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72  oked sqlite3Expr
2a60: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f  ResolveNames() o
2a70: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2a80: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
2a90: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
2aa0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
2ab0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2ac0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
2ad0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
2ae0: 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  veNames() routin
2af0: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
2b00: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
2b10: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
2b20: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
2b30: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
2b40: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
2b50: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
2b60: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
2b70: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
2b80: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
2b90: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
2ba0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2bb0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
2bc0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
2bd0: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
2be0: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
2bf0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2c00: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2c10: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 2c 20  (ExprMaskSet *, 
2c20: 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 73 74 61  ExprList *);.sta
2c30: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2c40: 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d  TableUsage(ExprM
2c50: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2c60: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
2c70: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2c80: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2c90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
2ca0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
2cb0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2cc0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2cd0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2ce0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2cf0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2d00: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2d10: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
2d20: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2d30: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2d40: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73  p->pLeft);.  mas
2d50: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2d60: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2d70: 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69  , p->pList);.  i
2d80: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  f( p->pSelect ){
2d90: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2da0: 3d 20 70 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  = p->pSelect;.  
2db0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
2dc0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
2dd0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
2de0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2df0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2e00: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2e10: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2e20: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2e30: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2e40: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
2e50: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
2e60: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2e70: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
2e80: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
2e90: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2ea0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2eb0: 48 61 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72  Having);.  }.  r
2ec0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
2ed0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2ee0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
2ef0: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
2f00: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
2f10: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
2f20: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
2f30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
2f40: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
2f50: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
2f70: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2f80: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2f90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
2fa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2fb0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
2fc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2fd0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
2fe0: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
2ff0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
3000: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
3010: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
3020: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
3030: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
3040: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
3050: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
3060: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61  ", "<=", ">=", a
3070: 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74  nd "IN"..*/.stat
3080: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
3090: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
30a0: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
30b0: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
30c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
30d0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
30e0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
30f0: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
3100: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
3110: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
3120: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
3130: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
3140: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
3150: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a  & op<=TK_GE);.}.
3160: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
3170: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
3180: 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  T..*/.#define SW
3190: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
31a0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
31b0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
31c0: 65 20 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  e a comparision 
31d0: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
31e0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
31f0: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
3200: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
3210: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73  o "Y op X"..*/.s
3220: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
3230: 6f 6d 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78  ommute(Expr *pEx
3240: 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61  pr){.  assert( a
3250: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
3260: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
3270: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41  !=TK_IN );.  SWA
3280: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
3290: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
32a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
32b0: 6f 6c 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70  oll);.  SWAP(Exp
32c0: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
32d0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
32e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
32f0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
3300: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
3310: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
3320: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
3330: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
3340: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
3350: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3360: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
3370: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
3380: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
3390: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
33a0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
33b0: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
33c0: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
33d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
33e0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
33f0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
3400: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
3410: 74 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72  tic int operator
3420: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
3430: 69 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28  int c;.  assert(
3440: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
3450: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
3460: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
3470: 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
3480: 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d   c = WO_EQ<<(op-
3490: 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73  TK_EQ);.  }.  as
34a0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20  sert( op!=TK_IN 
34b0: 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  || c==WO_IN );. 
34c0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34d0: 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29  EQ || c==WO_EQ )
34e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
34f0: 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LT || c==WO_L
3500: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
3510: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57  p!=TK_LE || c==W
3520: 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LE );.  assert
3530: 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63  ( op!=TK_GT || c
3540: 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73  ==WO_GT );.  ass
3550: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c  ert( op!=TK_GE |
3560: 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20  | c==WO_GE );.  
3570: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
3580: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
3590: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
35a0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
35b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
35c0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
35d0: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
35e0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
35f0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
3600: 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  Cur and <op> is 
3610: 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f  one of.** the WO
3620: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64  _xx operator cod
3630: 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  es specified by 
3640: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3650: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
3660: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
3670: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
3680: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
3690: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
36a0: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
36b0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
36c0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
36d0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
36e0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
36f0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
3700: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
3710: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
3720: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
3730: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3740: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
3750: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
3760: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
3770: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
3780: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
3790: 20 20 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20    u16 op,       
37a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
37b0: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
37c0: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
37d0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
37e0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
37f0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
3800: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
3810: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
3820: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
3830: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
3840: 74 20 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  t k;.  for(pTerm
3850: 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
3860: 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70  nTerm; k; k--, p
3870: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
3880: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
3890: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
38a0: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
38b0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
38c0: 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  y)==0.       && 
38d0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
38e0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
38f0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 6f 70 65    && (pTerm->ope
3900: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
3910: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
3920: 69 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20  iCur>=0 && pIdx 
3930: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
3940: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
3950: 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  pr;.        Coll
3960: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
3970: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
3980: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
3990: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
39a0: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
39b0: 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64  rse;..        id
39c0: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
39d0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
39e0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
39f0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
3a00: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
3a10: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
3a20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
3a30: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3a40: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
3a50: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  se, pX->pLeft);.
3a60: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
3a70: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3a80: 69 66 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29  if( pX->pRight )
3a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
3aa0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
3ab0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3ac0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
3ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ae0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
3af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
3b00: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3b10: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3b30: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b   }.        for(k
3b40: 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
3b50: 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43  umn && pIdx->aiC
3b60: 6f 6c 75 6d 6e 5b 6b 5d 21 3d 69 43 6f 6c 75 6d  olumn[k]!=iColum
3b70: 6e 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  n; k++){}.      
3b80: 20 20 61 73 73 65 72 74 28 20 6b 3c 70 49 64 78    assert( k<pIdx
3b90: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
3ba0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 21 3d       if( pColl!=
3bb0: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
3bc0: 6f 6c 6c 5b 6b 5d 20 29 20 63 6f 6e 74 69 6e 75  oll[k] ) continu
3bd0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
3be0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
3bf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3c00: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
3c10: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3c20: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3c30: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
3c40: 2c 20 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  , ExprMaskSet*, 
3c50: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
3c60: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
3c70: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
3c80: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
3c90: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
3ca0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
3cb0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
3cc0: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
3cd0: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
3ce0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3cf0: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
3d00: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f  t *pMaskSet,   /
3d10: 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f  * table masks */
3d20: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3d30: 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74  pWC         /* t
3d40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3d50: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
3d60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3d70: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
3d80: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3d90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
3da0: 70 54 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53  pTabList, pMaskS
3db0: 65 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d  et, pWC, i);.  }
3dc0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3dd0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
3de0: 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
3df0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3e00: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
3e10: 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f  sion is a LIKE o
3e20: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
3e30: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  that.** can be o
3e40: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69  ptimized using i
3e50: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
3e60: 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54  aints.  Return T
3e70: 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  RUE if it is.** 
3e80: 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  so and false if 
3e90: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  not..**.** In or
3ea0: 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72  der for the oper
3eb0: 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d  ator to be optim
3ec0: 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20  izible, the RHS 
3ed0: 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67  must be a string
3ee0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74  .** literal that
3ef0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
3f00: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e  with a wildcard.
3f10: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
3f20: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
3f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
3f40: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3f50: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
3f60: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
3f70: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
3f80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61  n */.  int *pnPa
3f90: 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62  ttern,   /* Numb
3fa0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
3fb0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
3fc0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ters */.  int *p
3fd0: 69 73 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54  isComplete  /* T
3fe0: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
3ff0: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
4000: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
4010: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ter */.){.  cons
4020: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70  t char *z;.  Exp
4030: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
4040: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
4050: 4c 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63  List;.  int c, c
4060: 6e 74 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d  nt;.  char wc[3]
4070: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
4080: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
4090: 62 2c 20 70 45 78 70 72 2c 20 77 63 29 20 29 7b  b, pExpr, wc) ){
40a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
40b0: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
40c0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69  pr->pList;.  pRi
40d0: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
40e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
40f0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54  Right->op!=TK_ST
4100: 52 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75  RING ){.    retu
4110: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66  rn 0;.  }.  pLef
4120: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  t = pList->a[1].
4130: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65  pExpr;.  if( pLe
4140: 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  ft->op!=TK_COLUM
4150: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
4160: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
4170: 44 65 71 75 6f 74 65 45 78 70 72 28 70 52 69 67  DequoteExpr(pRig
4180: 68 74 29 3b 0a 20 20 7a 20 3d 20 70 52 69 67 68  ht);.  z = pRigh
4190: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f  t->token.z;.  fo
41a0: 72 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e  r(cnt=0; (c=z[cn
41b0: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
41c0: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
41d0: 26 20 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b  & c!=wc[2]; cnt+
41e0: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  +){}.  if( cnt==
41f0: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
4200: 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75  cnt] ){.    retu
4210: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73  rn 0;.  }.  *pis
4220: 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74  Complete = z[cnt
4230: 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  ]==wc[0] && z[cn
4240: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61  t+1]==0;.  *pnPa
4250: 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72  ttern = cnt;.  r
4260: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4270: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4280: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4290: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ON */../*.** The
42a0: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
42b0: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
42c0: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
42d0: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
42e0: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
42f0: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
4300: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
4310: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
4320: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
4330: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
4340: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
4350: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
4360: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
4370: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
4380: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4390: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
43a0: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
43b0: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
43c0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
43d0: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
43e0: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20  p> <expr>".  If 
43f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4400: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4410: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
4420: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
4430: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
4440: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
4450: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
4460: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
4470: 65 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65  ew virtual expre
4480: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
4490: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20  m.** "Y <op> X" 
44a0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
44b0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
44c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
44d0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
44e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
44f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
4500: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4510: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
4520: 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20 74 61 62  skSet,    /* tab
4530: 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68  le masks */.  Wh
4540: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4550: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
4560: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
4570: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
4580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4590: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
45a0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
45b0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
45c0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
45d0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78  a[idxTerm];.  Ex
45e0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
45f0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d  m->pExpr;.  Bitm
4600: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a  ask prereqLeft;.
4610: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
4620: 41 6c 6c 3b 0a 20 20 69 6e 74 20 69 64 78 52 69  All;.  int idxRi
4630: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74  ght;.  int nPatt
4640: 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d  ern;.  int isCom
4650: 70 6c 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71  plete;..  if( sq
4660: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
4670: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4680: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
4690: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
46a0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
46b0: 66 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ft);.  pTerm->pr
46c0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
46d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
46e0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
46f0: 68 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ht);.  pTerm->pr
4700: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
4710: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
4720: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4730: 45 78 70 72 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  Expr);.  pTerm->
4740: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
4750: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
4760: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
4770: 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  >operator = 0;. 
4780: 20 69 64 78 52 69 67 68 74 20 3d 20 2d 31 3b 0a   idxRight = -1;.
4790: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
47a0: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70  pExpr->op) && (p
47b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
47c0: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
47d0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
47e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
47f0: 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  Left;.    Expr *
4800: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
4810: 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
4820: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
4830: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
4840: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
4850: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
4860: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
4870: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
4880: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4890: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
48a0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
48b0: 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20  pExpr->op);.    
48c0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
48d0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
48e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
48f0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
4900: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
4910: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
4920: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4930: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
4940: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
4950: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
4960: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
4970: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
4980: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
4990: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
49a0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
49b0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
49c0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
49d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
49e0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
49f0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
4a00: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
4a10: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
4a20: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
4a30: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
4a40: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
4a50: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
4a60: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
4a70: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
4a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4a90: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
4aa0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
4ab0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
4ac0: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
4ad0: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  e(pDup);.      p
4ae0: 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65  Left = pDup->pLe
4af0: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
4b00: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
4b10: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
4b20: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75    pNew->leftColu
4b30: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
4b40: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  umn;.      pNew-
4b50: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
4b60: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20  rereqLeft;.     
4b70: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
4b80: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
4b90: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61 74      pNew->operat
4ba0: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
4bb0: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
4bc0: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
4bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
4be0: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
4bf0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
4c00: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
4c10: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
4c20: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
4c30: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
4c40: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
4c50: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
4c60: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20  N implements..  
4c70: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
4c80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
4c90: 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  EEN ){.    ExprL
4ca0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
4cb0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
4cc0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
4cd0: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
4ce0: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
4cf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
4d00: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
4d10: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
4d20: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
4d30: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
4d40: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
4d50: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
4d60: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
4d70: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
4d80: 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71  3Expr(ops[i], sq
4d90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
4da0: 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20  pr->pLeft),.    
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4dd0: 45 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e 61  ExprDup(pList->a
4de0: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
4df0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
4e00: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
4e10: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
4e20: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
4e30: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
4e40: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
4e50: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
4e60: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
4e70: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
4e80: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
4e90: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
4ea0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
4eb0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
4ec0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
4ed0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
4ee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
4ef0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
4f00: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
4f10: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
4f20: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 74 74  IZATION.  /* Att
4f30: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
4f40: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
4f50: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
4f60: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
4f70: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
4f80: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
4f90: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
4fa0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4fb0: 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  OR ){.    int ok
4fc0: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
4fd0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c      int iColumn,
4fe0: 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68   iCursor;.    Wh
4ff0: 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20  ereClause sOr;. 
5000: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
5010: 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65  rTerm;..    asse
5020: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
5030: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
5040: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72  )==0 );.    wher
5050: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72  eClauseInit(&sOr
5060: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 29 3b 0a  , pWC->pParse);.
5070: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26      whereSplit(&
5080: 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  sOr, pExpr, TK_O
5090: 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  R);.    exprAnal
50a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4d 61  yzeAll(pSrc, pMa
50b0: 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a 20 20  skSet, &sOr);.  
50c0: 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54    assert( sOr.nT
50d0: 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a 20 3d  erm>0 );.    j =
50e0: 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
50f0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e    iColumn = sOr.
5100: 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  a[j].leftColumn;
5110: 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d  .      iCursor =
5120: 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75   sOr.a[j].leftCu
5130: 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d  rsor;.      ok =
5140: 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20   iCursor>=0;.   
5150: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
5160: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
5170: 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b  r.a; i>=0 && ok;
5180: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
5190: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
51a0: 72 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 21  rTerm->operator!
51b0: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
51c0: 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f      goto or_not_
51d0: 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20  possible;.      
51e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
51f0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
5200: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26 26 20  sor==iCursor && 
5210: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c  pOrTerm->leftCol
5220: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
5230: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
5240: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
5250: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
5260: 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 72 54 65  }else if( (pOrTe
5270: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5280: 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20  _COPIED)!=0 ||. 
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c     ((pOrTerm->fl
52b0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
52c0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
52e0: 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  sOr.a[pOrTerm->i
52f0: 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20  Parent].flags & 
5300: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20  TERM_OR_OK)!=0) 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
5320: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Term->flags &= ~
5330: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
5340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5350: 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20       ok = 0;.   
5360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5370: 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26     }while( !ok &
5380: 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c  & (sOr.a[j++].fl
5390: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
53a0: 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e  D)!=0 && j<sOr.n
53b0: 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20  Term );.    if( 
53c0: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ok ){.      Expr
53d0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
53e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
53f0: 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  w, *pDup;.      
5400: 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d  for(i=sOr.nTerm-
5410: 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61  1, pOrTerm=sOr.a
5420: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d  ; i>=0 && ok; i-
5430: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
5440: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
5450: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
5460: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
5470: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5480: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
5490: 70 72 44 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70  prDup(pOrTerm->p
54a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
54b0: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
54c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
54d0: 70 65 6e 64 28 70 4c 69 73 74 2c 20 70 44 75 70  pend(pList, pDup
54e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
54f0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
5500: 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e  e3Expr(TK_COLUMN
5510: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5520: 20 20 69 66 28 20 70 44 75 70 20 29 7b 0a 20 20    if( pDup ){.  
5530: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62        pDup->iTab
5540: 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
5550: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c        pDup->iCol
5560: 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  umn = iColumn;. 
5570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
5580: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
5590: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
55a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
55b0: 65 77 20 29 20 70 4e 65 77 2d 3e 70 4c 69 73 74  ew ) pNew->pList
55c0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
55d0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pTerm->pExpr = p
55e0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  New;.      pTerm
55f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
5600: 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20 20 65  DYNAMIC;.      e
5610: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
5620: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
5630: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  idxTerm);.      
5640: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
5650: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 7d 0a  idxTerm];.    }.
5660: 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a  or_not_possible:
5670: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
5680: 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d  Clear(&sOr);.  }
5690: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
56a0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
56b0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
56c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
56d0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
56e0: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
56f0: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
5700: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
5710: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
5720: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
5730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c  ..  */.  if( isL
5740: 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70  ikeOrGlob(pWC->p
5750: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5760: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
5770: 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20  Complete) ){.   
5780: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
5790: 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20  Right;.    Expr 
57a0: 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a  *pStr1, *pStr2;.
57b0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
57c0: 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b  pr1, *pNewExpr2;
57d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
57e0: 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20  , idxNew2;..    
57f0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
5800: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5810: 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ;.    pRight = p
5820: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
5830: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
5840: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
5850: 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30  (TK_STRING, 0, 0
5860: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
5870: 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tr1 ){.      sql
5880: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
5890: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52  Str1->token, &pR
58a0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
58b0: 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e      pStr1->token
58c0: 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  .n = nPattern;. 
58d0: 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d     }.    pStr2 =
58e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
58f0: 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20  pStr1);.    if( 
5900: 70 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61  pStr2 ){.      a
5910: 73 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f  ssert( pStr2->to
5920: 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20  ken.dyn );.     
5930: 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d   ++*(u8*)&pStr2-
5940: 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72  >token.z[nPatter
5950: 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n-1];.    }.    
5960: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
5970: 74 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73  te3Expr(TK_GE, s
5980: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
5990: 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b  eft), pStr1, 0);
59a0: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
59b0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
59c0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
59d0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
59e0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
59f0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5a00: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
5a10: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
5a20: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
5a30: 74 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73  te3Expr(TK_LT, s
5a40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
5a50: 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b  eft), pStr2, 0);
5a60: 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
5a70: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
5a80: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
5a90: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
5aa0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
5ab0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5ac0: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
5ad0: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
5ae0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
5af0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
5b00: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
5b10: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
5b20: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
5b30: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
5b40: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
5b50: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
5b60: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
5b70: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
5b80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
5b90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5ba0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5bb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
5bc0: 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69  outine decides i
5bd0: 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73  f pIdx can be us
5be0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
5bf0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
5c00: 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e  ause.  If it can
5c10: 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  , it returns 1. 
5c20: 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20   If pIdx cannot 
5c30: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f  satisfy the.** O
5c40: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
5c50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
5c60: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f  urns 0..**.** pO
5c70: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
5c80: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
5c90: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
5ca0: 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74  ment.  pTab is t
5cb0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
5cc0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
5cd0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  M clause of that
5ce0: 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61   same SELECT sta
5cf0: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68  tement and.** th
5d00: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75  e table has a cu
5d10: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
5d20: 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
5d30: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62  an index on pTab
5d40: 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
5d50: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
5d60: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
5d70: 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
5d80: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
5d90: 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f  straints.  Any o
5da0: 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  f these columns 
5db0: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66  may be missing f
5dc0: 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
5dd0: 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74  .** clause and t
5de0: 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69  he match can sti
5df0: 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e  ll be a success.
5e00: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73  .**.** All terms
5e10: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
5e20: 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69   that match agai
5e30: 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75  nst the index mu
5e40: 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20  st be either.** 
5e50: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54  ASC or DESC.  (T
5e60: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
5e70: 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74  R BY clause past
5e80: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e   the end of a UN
5e90: 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f  IQUE.** index do
5ea0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74   not need to sat
5eb0: 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72  isfy this constr
5ec0: 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52  aint.)  The *pbR
5ed0: 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  ev value is.** s
5ee0: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f  et to 1 if the O
5ef0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
5f00: 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69  s all DESC and i
5f10: 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  t is set to 0 if
5f20: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
5f30: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41   clause is all A
5f40: 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SC..*/.static in
5f50: 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  t isSortingIndex
5f60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5f70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
5f80: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5f90: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5fb0: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
5fc0: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62  testing */.  Tab
5fd0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
5fe0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5ff0: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
6000: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
6010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6020: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6030: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   pTab */.  ExprL
6040: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
6050: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
6060: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
6070: 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20  nt nEqCol,      
6080: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6090: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
60a0: 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72  s with == constr
60b0: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
60c0: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
60d0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
60e0: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
60f0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  SC */.){.  int i
6100: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
6110: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6120: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
6130: 74 20 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20  t sortOrder;    
6140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
6150: 69 63 68 20 64 69 72 65 63 74 69 6f 6e 20 77 65  ich direction we
6160: 20 61 72 65 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   are sorting */.
6170: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6190: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
61a0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
61b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
61c0: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 2f 2a 20  item *pTerm; /* 
61d0: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
61e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
61f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6200: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
6210: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
6220: 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d  !=0 );.  nTerm =
6230: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
6240: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ;.  assert( nTer
6250: 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  m>0 );..  /* Mat
6260: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
6270: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6280: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
6290: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
62a0: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  x..  */.  for(i=
62b0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65  j=0, pTerm=pOrde
62c0: 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20  rBy->a; j<nTerm 
62d0: 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && i<pIdx->nColu
62e0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
62f0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
6300: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
6310: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
6320: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
6330: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
6340: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
6350: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
6360: 70 45 78 70 72 20 2a 2f 0a 0a 20 20 20 20 70 45  pExpr */..    pE
6370: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
6380: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
6390: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
63a0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
63b0: 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20  e!=base ){.     
63c0: 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20   /* Can not use 
63d0: 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e  an index sort on
63e0: 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69   anything that i
63f0: 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69  s not a column i
6400: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  n the.      ** l
6410: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f  eft-most table o
6420: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
6430: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
6440: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
6450: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6460: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
6470: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  , pExpr);.    if
6480: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
6490: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
64a0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
64b0: 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e  >iColumn!=pIdx->
64c0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 70  aiColumn[i] || p
64d0: 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49  Coll!=pIdx->keyI
64e0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  nfo.aColl[i] ){.
64f0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20        /* Term j 
6500: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
6510: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
6520: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f  match column i o
6530: 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
6540: 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f       if( i<nEqCo
6550: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  l ){.        /* 
6560: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
6570: 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  mn that is const
6580: 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69  rained by == fai
6590: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20  ls to match an. 
65a0: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
65b0: 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73  BY term, that is
65c0: 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72   OK.  Just ignor
65d0: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66  e that column of
65e0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
65f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
6600: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
6610: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6620: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
6630: 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  mn fails to matc
6640: 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e  h and is not con
6650: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20  strained by ==. 
6660: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
6670: 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
6680: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
6690: 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e  R BY constraint.
66a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
66b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
66c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
66d0: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
66e0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
66f0: 3e 73 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74  >sortOrder!=sort
6700: 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Order ){.       
6710: 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20   /* Indices can 
6720: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
6730: 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
6740: 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  ms past the.    
6750: 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
6760: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
6770: 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20  all either DESC 
6780: 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20  or ASC. */.     
6790: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
67a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
67b0: 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
67c0: 3d 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  = pTerm->sortOrd
67d0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  er;.    }.    j+
67e0: 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a  +;.    pTerm++;.
67f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
6800: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
6810: 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 66 20 61  for sorting if a
6820: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
6830: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
6840: 20 20 2a 2a 20 61 72 65 20 63 6f 76 65 72 65 64    ** are covered
6850: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d  ..  */.  if( j>=
6860: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2a 70 62  nTerm ){.    *pb
6870: 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 3d  Rev = sortOrder=
6880: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b  =SQLITE_SO_DESC;
6890: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
68a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
68b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61  ../*.** Check ta
68c0: 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74 68  ble to see if th
68d0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
68e0: 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61  e in pOrderBy ca
68f0: 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a  n be satisfied.*
6900: 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20  * by sorting in 
6910: 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20  order of ROWID. 
6920: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6930: 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65  so and set *pbRe
6940: 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20  v to be.** true 
6950: 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57 49  for reverse ROWI
6960: 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20  D and false for 
6970: 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72  forward ROWID or
6980: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
6990: 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77  nt sortableByRow
69a0: 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20  id(.  int base, 
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69c0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
69d0: 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  or table to be s
69e0: 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  orted */.  ExprL
69f0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
6a00: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
6a10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
6a20: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
6a30: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
6a40: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
6a50: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45  s DESC */.){.  E
6a60: 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  xpr *p;..  asser
6a70: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
6a80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
6a90: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  erBy->nExpr>0 );
6aa0: 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d  .  p = pOrderBy-
6ab0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
6ac0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
6ad0: 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  UMN && p->iTable
6ae0: 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  ==base && p->iCo
6af0: 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  lumn==-1 ){.    
6b00: 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42  *pbRev = pOrderB
6b10: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
6b20: 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  r;.    return 1;
6b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
6b50: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
6b60: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 6f 72 69  te of the logori
6b70: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
6b80: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
6b90: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
6ba0: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
6bb0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
6bc0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
6bd0: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
6be0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
6bf0: 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f  atings with O(lo
6c00: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
6c10: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
6c20: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
6c30: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
6c40: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
6c50: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
6c60: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
6c70: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
6c80: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
6c90: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
6ca0: 20 31 2e 30 3b 0a 20 20 64 6f 75 62 6c 65 20 78   1.0;.  double x
6cb0: 20 3d 20 31 30 2e 30 3b 0a 20 20 77 68 69 6c 65   = 10.0;.  while
6cc0: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
6cd0: 4e 20 2b 3d 20 31 2e 30 3b 0a 20 20 20 20 78 20  N += 1.0;.    x 
6ce0: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
6cf0: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
6d00: 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
6d10: 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73   index for acces
6d20: 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
6d30: 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  r table.  Return
6d40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6d50: 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67   the index, flag
6d60: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
6d70: 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68  how the index sh
6d80: 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68  ould be used, th
6d90: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65  e.** number of e
6da0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
6db0: 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f  nts, and the "co
6dc0: 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64  st" for this ind
6dd0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  ex..**.** The lo
6de0: 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20  west cost index 
6df0: 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
6e00: 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
6e10: 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
6e20: 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
6e30: 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63  I/O need to proc
6e40: 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20  ess the request 
6e50: 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74  using the select
6e60: 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63  ed index..** Fac
6e70: 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
6e80: 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
6e90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
6ea0: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
6eb0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
6ec0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
6ed0: 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
6ee0: 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
6ef0: 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
6f00: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
6f10: 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
6f20: 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
6f30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
6f40: 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
6f50: 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
6f60: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
6f70: 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
6f80: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f  ain table..**.*/
6f90: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
6fa0: 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  estIndex(.  Pars
6fb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6fc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6fd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6fe0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
6ff0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
7000: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7010: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
7020: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
7030: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
7040: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
7050: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
7060: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
7070: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
7080: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
7090: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
70a0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
70b0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
70c0: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
70d0: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  by clause */.  I
70e0: 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20  ndex **ppIndex, 
70f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7100: 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e  ke *ppIndex poin
7110: 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e  t to the best in
7120: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  dex */.  int *pF
7130: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
7140: 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67       /* Put flag
7150: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69  s describing thi
7160: 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c  s choice in *pFl
7170: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ags */.  int *pn
7180: 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq              
7190: 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20       /* Put the 
71a0: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
71b0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  IN constraints h
71c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ere */.){.  Wher
71d0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
71e0: 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d  Index *bestIdx =
71f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
7200: 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20  ndex that gives 
7210: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
7220: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  */.  double lowe
7230: 73 74 43 6f 73 74 20 3d 20 31 2e 30 65 39 39 3b  stCost = 1.0e99;
7240: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
7250: 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f  using bestIdx */
7260: 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73  .  int bestFlags
7270: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
7280: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
7290: 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20  ed with bestIdx 
72a0: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71  */.  int bestNEq
72b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
72c0: 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66   /* Best value f
72d0: 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20  or nEq */.  int 
72e0: 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
72f0: 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
7300: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
7310: 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
7320: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
7330: 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
7340: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
7350: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
7360: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20   */.  int rev;  
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
7390: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
73a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
73b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
73c0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
73d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
73e0: 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  obe */.  int nEq
73f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7410: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
7420: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75 62  raints */.  doub
7430: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
7440: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
7450: 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
7460: 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62 65  */..  TRACE(("be
7470: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
7480: 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20  notReady=%x\n", 
7490: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
74a0: 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 0a  e, notReady));..
74b0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
74c0: 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72   rowid=EXPR or r
74d0: 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f  owid IN (...) co
74e0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
74f0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
7500: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
7510: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
7520: 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66  |WO_IN, 0);.  if
7530: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45  ( pTerm ){.    E
7540: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
7550: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
7560: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48    bestFlags = WH
7570: 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20  ERE_ROWID_EQ;.  
7580: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65    if( pTerm->ope
7590: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b  rator & WO_EQ ){
75a0: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d  .      /* Rowid=
75b0: 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  = is always the 
75c0: 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b  best pick.  Look
75d0: 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65   no further.  Be
75e0: 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20  cause only.     
75f0: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   ** a single row
7600: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f   is generated, o
7610: 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20  utput is always 
7620: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
7630: 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73  */.      *pFlags
7640: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
7650: 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45  Q | WHERE_UNIQUE
7660: 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20  ;.      *pnEq = 
7670: 31 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  1;.      TRACE((
7680: 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77  "... best is row
7690: 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  id\n"));.      r
76a0: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
76b0: 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20  else if( (pExpr 
76c0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d  = pTerm->pExpr)-
76d0: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
76e0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
76f0: 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LIST): cost is N
7700: 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
7710: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
7720: 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  st.      ** elem
7730: 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
7740: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78  lowestCost = pEx
7750: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
7760: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
7770: 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77  st *= estLog(low
7780: 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65  estCost);.    }e
7790: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  lse{.      /* Ro
77a0: 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a  wid IN (SELECT):
77b0: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
77c0: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
77d0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
77e0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
77f0: 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
7800: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
7810: 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
7820: 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  mate.      ** th
7830: 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65  at value so make
7840: 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a   a wild guess. *
7850: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
7860: 73 74 20 3d 20 32 30 30 2e 30 3b 0a 20 20 20 20  st = 200.0;.    
7870: 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  }.    TRACE(("..
7880: 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a  . rowid IN cost:
7890: 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74   %.9g\n", lowest
78a0: 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Cost));.  }..  /
78b0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 63  * Estimate the c
78c0: 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73  ost of a table s
78d0: 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  can.  If we do n
78e0: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79  ot know how many
78f0: 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72  .  ** entries ar
7900: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  e in the table, 
7910: 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73  use 1 million as
7920: 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20   a guess..  */. 
7930: 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
7940: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
7950: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20  cost = pProbe ? 
7960: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
7970: 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 2e 30 3b  [0] : 1000000.0;
7980: 0a 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 74  .  TRACE(("... t
7990: 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63  able scan base c
79a0: 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  ost: %.9g\n", co
79b0: 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20  st));.  flags = 
79c0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
79d0: 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  E;..  /* Check f
79e0: 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
79f0: 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  n a range of row
7a00: 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ids in a table s
7a10: 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  can..  */.  pTer
7a20: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
7a30: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
7a40: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
7a50: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  E|WO_GT|WO_GE, 0
7a60: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
7a70: 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65  {.    if( findTe
7a80: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
7a90: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
7aa0: 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20  T|WO_LE, 0) ){. 
7ab0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
7ac0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
7ad0: 20 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33       cost *= 0.3
7ae0: 33 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68  33;  /* Guess th
7af0: 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c  at rowid<EXPR el
7b00: 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
7b10: 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20  rds or rows */. 
7b20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e     }.    if( fin
7b30: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
7b40: 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
7b50: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29  O_GT|WO_GE, 0) )
7b60: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
7b70: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
7b80: 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20  ;.      cost *= 
7b90: 30 2e 33 33 33 3b 20 20 2f 2a 20 47 75 65 73 73  0.333;  /* Guess
7ba0: 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52   that rowid>EXPR
7bb0: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
7bc0: 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
7bd0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  /.    }.    TRAC
7be0: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61  E(("... rowid ra
7bf0: 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74  nge reduces cost
7c00: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
7c10: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
7c20: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d    flags = 0;.  }
7c30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
7c40: 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  ble scan does no
7c50: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
7c60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
7c70: 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65  ncrease.  ** the
7c80: 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74   cost by NlogN t
7c90: 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65  o cover the expe
7ca0: 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20  nse of sorting. 
7cb0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
7cc0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72  y ){.    if( sor
7cd0: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
7ce0: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65  r, pOrderBy, &re
7cf0: 76 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  v) ){.      flag
7d00: 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
7d10: 42 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  BY|WHERE_ROWID_R
7d20: 41 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20  ANGE;.      if( 
7d30: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66  rev ){.        f
7d40: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
7d50: 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
7d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d70: 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
7d80: 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
7d90: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72   TRACE(("... sor
7da0: 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63  ting increases c
7db0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
7dc0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  cost));.    }.  
7dd0: 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77  }.  if( cost<low
7de0: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c  estCost ){.    l
7df0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
7e00: 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20  ;.    bestFlags 
7e10: 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
7e20: 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20  /* Look at each 
7e30: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
7e40: 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f  r(; pProbe; pPro
7e50: 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
7e60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7e90: 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  ter */.    doubl
7ea0: 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d  e inMultiplier =
7eb0: 20 31 2e 30 3b 0a 0a 20 20 20 20 54 52 41 43 45   1.0;..    TRACE
7ec0: 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a  (("... index %s:
7ed0: 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  \n", pProbe->zNa
7ee0: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  me));..    /* Co
7ef0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
7f00: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7f10: 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
7f20: 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a  satisfied.    **
7f30: 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74   by x=EXPR const
7f40: 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28  raints or x IN (
7f50: 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
7f60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61  ..    */.    fla
7f70: 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  gs = 0;.    for(
7f80: 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e  i=0; i<pProbe->n
7f90: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
7fa0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
7fb0: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  be->aiColumn[i];
7fc0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
7fd0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
7fe0: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
7ff0: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50 72  WO_EQ|WO_IN, pPr
8000: 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
8010: 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
8020: 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
8030: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
8040: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
8050: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57 4f  m->operator & WO
8060: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
8070: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
8080: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
8090: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
80a0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
80b0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
80c0: 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20  pSelect!=0 ){.  
80d0: 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70          inMultip
80e0: 6c 69 65 72 20 2a 3d 20 31 30 30 2e 30 3b 0a 20  lier *= 100.0;. 
80f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8100: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30   pExpr->pList!=0
8110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
8120: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45  Multiplier *= pE
8130: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
8140: 72 20 2b 20 31 2e 30 3b 0a 20 20 20 20 20 20 20  r + 1.0;.       
8150: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8160: 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  .    cost = pPro
8170: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20  be->aiRowEst[i] 
8180: 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a  * inMultiplier *
8190: 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70   estLog(inMultip
81a0: 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d  lier);.    nEq =
81b0: 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   i;.    if( pPro
81c0: 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
81d0: 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26  None && (flags &
81e0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
81f0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
8200: 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43   nEq==pProbe->nC
8210: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66  olumn ){.      f
8220: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
8230: 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
8240: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e  TRACE(("...... n
8250: 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39  Eq=%d inMult=%.9
8260: 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20  g cost=%.9g\n", 
8270: 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65  nEq, inMultiplie
8280: 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20  r, cost));..    
8290: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67  /* Look for rang
82a0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
82b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71    */.    if( nEq
82c0: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
82d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   ){.      int j 
82e0: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
82f0: 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70  mn[nEq];.      p
8300: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
8310: 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
8320: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
8330: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
8340: 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20   pProbe);.      
8350: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
8360: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8370: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
8380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  ;.        if( fi
8390: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
83a0: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
83b0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f  O_LT|WO_LE, pPro
83c0: 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
83d0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
83e0: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
83f0: 20 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33       cost *= 0.3
8400: 33 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  33;.        }.  
8410: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
8420: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
8430: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
8440: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20  |WO_GE, pProbe) 
8450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
8460: 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
8470: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
8480: 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 0a   cost *= 0.333;.
8490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
84a0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
84b0: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
84c0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
84d0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
84e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
84f0: 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c  d the additional
8500: 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
8510: 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61   if that is a fa
8520: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
8530: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
8540: 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67  .      if( (flag
8550: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
8560: 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  _IN)==0 &&.     
8570: 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49        isSortingI
8580: 6e 64 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f  ndex(pParse,pPro
8590: 62 65 2c 70 53 72 63 2d 3e 70 54 61 62 2c 69 43  be,pSrc->pTab,iC
85a0: 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c  ur,pOrderBy,nEq,
85b0: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  &rev) ){.       
85c0: 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b   if( flags==0 ){
85d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
85e0: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
85f0: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d  RANGE;.        }
8600: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
8610: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  = WHERE_ORDERBY;
8620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76  .        if( rev
8630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
8640: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
8650: 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
8660: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8670: 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
8680: 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
8690: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
86a0: 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69  ...... orderby i
86b0: 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f  ncreases cost to
86c0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
86d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
86e0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
86f0: 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67   see if we can g
8700: 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69  et away with usi
8710: 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
8720: 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  x without.    **
8730: 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68   ever reading th
8740: 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61  e table.  If tha
8750: 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
8760: 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20  hen halve the.  
8770: 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69    ** cost of thi
8780: 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  s index..    */.
8790: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26      if( flags &&
87a0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c   pSrc->colUsed <
87b0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
87c0: 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
87d0: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
87e0: 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
87f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
8800: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62  for(j=0; j<pProb
8810: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  e->nColumn; j++)
8820: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
8830: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
8840: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
8850: 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
8860: 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
8870: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
8880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8890: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
88a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
88b0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
88c0: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f  ONLY;.        co
88d0: 73 74 20 2a 3d 20 30 2e 35 3b 0a 20 20 20 20 20  st *= 0.5;.     
88e0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
88f0: 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63  . idx-only reduc
8900: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
8910: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
8920: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8930: 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
8940: 68 61 73 20 61 63 68 69 65 76 65 64 20 74 68 65  has achieved the
8950: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20   lowest cost so 
8960: 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74  far, then use it
8970: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
8980: 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f   cost < lowestCo
8990: 73 74 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74  st ){.      best
89a0: 49 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  Idx = pProbe;.  
89b0: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
89c0: 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 61 73 73   cost;.      ass
89d0: 65 72 74 28 20 66 6c 61 67 73 21 3d 30 20 29 3b  ert( flags!=0 );
89e0: 0a 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73  .      bestFlags
89f0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   = flags;.      
8a00: 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20  bestNEq = nEq;. 
8a10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
8a20: 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20 72  eport the best r
8a30: 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70  esult.  */.  *pp
8a40: 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b  Index = bestIdx;
8a50: 0a 20 20 54 52 41 43 45 28 28 22 62 65 73 74 20  .  TRACE(("best 
8a60: 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73  index is %s, cos
8a70: 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78  t=%.9g, flags=%x
8a80: 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20  , nEq=%d\n",.   
8a90: 20 20 20 20 20 62 65 73 74 49 64 78 20 3f 20 62       bestIdx ? b
8aa0: 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  estIdx->zName : 
8ab0: 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74  "(none)", lowest
8ac0: 43 6f 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c  Cost, bestFlags,
8ad0: 20 62 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70   bestNEq));.  *p
8ae0: 46 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67  Flags = bestFlag
8af0: 73 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73  s;.  *pnEq = bes
8b00: 74 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c  tNEq;.  return l
8b10: 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f  owestCost;.}.../
8b20: 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
8b30: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
8b40: 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
8b50: 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
8b60: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
8b70: 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
8b80: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
8b90: 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
8ba0: 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
8bb0: 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
8bc0: 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
8bd0: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
8be0: 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
8bf0: 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
8c00: 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
8c10: 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
8c20: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
8c30: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
8c40: 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
8c50: 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
8c60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
8c70: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
8c80: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
8c90: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
8ca0: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
8cb0: 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
8cc0: 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
8cd0: 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
8ce0: 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
8cf0: 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
8d00: 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
8d10: 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
8d20: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
8d30: 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
8d40: 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
8d50: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
8d60: 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
8d70: 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
8d80: 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
8d90: 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
8da0: 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
8db0: 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
8dc0: 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
8dd0: 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
8de0: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
8df0: 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
8e00: 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
8e10: 69 7a 61 74 69 6f 6e 2e 20 20 57 65 20 77 6f 75  ization.  We wou
8e20: 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
8e30: 63 74 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 66  ct.** results if
8e40: 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
8e50: 65 72 20 64 69 73 61 62 6c 65 64 2c 20 62 75 74  er disabled, but
8e60: 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
8e70: 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 73 6c 6f   a little.** slo
8e80: 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
8e90: 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
8ea0: 20 6d 75 63 68 20 61 73 20 77 65 20 63 61 6e 20   much as we can 
8eb0: 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
8ec0: 67 0a 2a 2a 20 74 6f 6f 20 6d 75 63 68 2e 20 20  g.** too much.  
8ed0: 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
8ee0: 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 20  n (1), we'd get 
8ef0: 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
8f00: 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20  ..** See ticket 
8f10: 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
8f20: 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
8f30: 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
8f40: 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
8f50: 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
8f60: 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
8f70: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
8f80: 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
8f90: 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
8fa0: 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
8fb0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
8fc0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
8fd0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20  romJoin)).  ){. 
8fe0: 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
8ff0: 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
9000: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
9010: 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
9020: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
9030: 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
9040: 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
9050: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
9060: 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
9070: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
9080: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
9090: 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
90a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
90b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
90c0: 65 20 63 6f 64 65 20 74 68 61 74 20 62 75 69 6c  e code that buil
90d0: 64 73 20 61 20 70 72 6f 62 65 20 66 6f 72 20 61  ds a probe for a
90e0: 6e 20 69 6e 64 65 78 2e 20 20 44 65 74 61 69 6c  n index.  Detail
90f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43  s:.**.**    *  C
9100: 68 65 63 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f  heck the top nCo
9110: 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20  lumn entries on 
9120: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 61  the stack.  If a
9130: 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  ny.**       of t
9140: 68 6f 73 65 20 65 6e 74 72 69 65 73 20 61 72 65  hose entries are
9150: 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65   NULL, jump imme
9160: 64 69 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a  diately to brk,.
9170: 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68 20 69  **       which i
9180: 73 20 74 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c  s the loop exit,
9190: 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20   since no index 
91a0: 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74 63 68  entry will match
91b0: 0a 2a 2a 20 20 20 20 20 20 20 69 66 20 61 6e 79  .**       if any
91c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
91d0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
91e0: 20 20 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20     *  Construct 
91f0: 61 20 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72  a probe entry fr
9200: 6f 6d 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75  om the top nColu
9210: 6d 6e 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  mn entries in.**
9220: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 63 6b         the stack
9230: 20 77 69 74 68 20 61 66 66 69 6e 69 74 69 65 73   with affinities
9240: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9250: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
9260: 73 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c  static void buil
9270: 64 49 6e 64 65 78 50 72 6f 62 65 28 56 64 62 65  dIndexProbe(Vdbe
9280: 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e   *v, int nColumn
9290: 2c 20 69 6e 74 20 62 72 6b 2c 20 49 6e 64 65 78  , int brk, Index
92a0: 20 2a 70 49 64 78 29 7b 0a 20 20 73 71 6c 69 74   *pIdx){.  sqlit
92b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
92c0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c  P_NotNull, -nCol
92d0: 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65  umn, sqlite3Vdbe
92e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
92f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9300: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
9310: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
9320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9330: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
9340: 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  brk);.  sqlite3V
9350: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
9360: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
9370: 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mn, 0);.  sqlite
9380: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
9390: 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a  r(v, pIdx);.}...
93a0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
93b0: 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
93c0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
93d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
93e0: 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
93f0: 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
9400: 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
9410: 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
9420: 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
9430: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
9440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
9450: 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
9460: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
9470: 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  left on the top 
9480: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
9490: 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
94a0: 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
94b0: 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
94c0: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
94d0: 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
94e0: 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
94f0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
9500: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
9510: 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
9520: 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
9530: 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
9540: 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
9550: 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
9560: 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
9570: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45  tatic void codeE
9580: 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
9590: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
95a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
95b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
95c0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
95d0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
95e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
95f0: 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
9600: 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20  /.  int brk,    
9610: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
9620: 68 65 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20  here to abandon 
9630: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  the loop */.  Wh
9640: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
9650: 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20    /* When level 
9660: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
9670: 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
9680: 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  g on */.){.  Exp
9690: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
96a0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e  Expr;.  if( pX->
96b0: 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op!=TK_IN ){.   
96c0: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
96d0: 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71  =TK_EQ );.    sq
96e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
96f0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
9700: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9710: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
9730: 20 69 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a   iTab;.    int *
9740: 61 49 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  aIn;.    Vdbe *v
9750: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9760: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ;..    sqlite3Co
9770: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
9780: 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61  se, pX);.    iTa
9790: 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
97a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
97b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
97c0: 64 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20  d, iTab, brk);. 
97d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
97e0: 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d  v, "# %.*s", pX-
97f0: 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61  >span.n, pX->spa
9800: 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  n.z));.    pLeve
9810: 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  l->nIn++;.    pL
9820: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20  evel->aInLoop = 
9830: 61 49 6e 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  aIn = sqliteReal
9840: 6c 6f 63 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  loc(pLevel->aInL
9850: 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
9880: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  vel->aInLoop[0])
9890: 2a 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b  *3*pLevel->nIn);
98a0: 0a 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a  .    if( aIn ){.
98b0: 20 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65        aIn += pLe
98c0: 76 65 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a  vel->nIn*3 - 3;.
98d0: 20 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 4f        aIn[0] = O
98e0: 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 49  P_Next;.      aI
98f0: 6e 5b 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20  n[1] = iTab;.   
9900: 20 20 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c 69     aIn[2] = sqli
9910: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9920: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
9930: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
9940: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49        pLevel->nI
9950: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
9960: 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
9970: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
9980: 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  erm);.}../*.** G
9990: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
99a0: 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
99b0: 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
99c0: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
99d0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20  .** index.  The 
99e0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63  values for all c
99f0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c  onstraints are l
9a00: 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
9a10: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
9a20: 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
9a30: 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
9a40: 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
9a50: 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
9a60: 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
9a70: 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
9a80: 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
9a90: 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
9aa0: 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
9ab0: 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
9ac0: 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
9ad0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
9ae0: 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
9af0: 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
9b00: 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
9b10: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
9b20: 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
9b30: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
9b40: 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
9b50: 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
9b60: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
9b70: 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
9b80: 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
9b90: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
9ba0: 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
9bb0: 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74   be left.** on t
9bc0: 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20  he stack - a is 
9bd0: 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64 20  the deepest and 
9be0: 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74  b the shallowest
9bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
9c00: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
9c10: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
9c20: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
9c30: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
9c40: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
9c50: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
9c60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9c70: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
9c80: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
9c90: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
9ca0: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
9cb0: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
9cc0: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
9cd0: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
9ce0: 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
9cf0: 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
9d00: 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68  l and puts.** th
9d10: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 61  e address of tha
9d20: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
9d30: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20   pLevel->iMem.  
9d40: 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
9d50: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
9d60: 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65  ine will use pLe
9d70: 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f  vel->iMem to sto
9d80: 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
9d90: 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
9da0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
9db0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
9dc0: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
9dd0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
9de0: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
9df0: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
9e00: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
9e10: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
9e20: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
9e30: 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  oid codeAllEqual
9e40: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
9e50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9e60: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9e70: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
9e80: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
9e90: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
9ea0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
9eb0: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
9ec0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
9ed0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
9ee0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9ef0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
9f00: 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
9f10: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
9f20: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
9f30: 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
9f40: 20 62 72 6b 20 20 20 20 20 20 20 20 20 20 20 20   brk            
9f50: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
9f60: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
9f70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20  */.){.  int nEq 
9f80: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20  = pLevel->nEq;  
9f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
9fa0: 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
9fb0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
9fc0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72  ode */.  int ter
9fd0: 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20  msInMem = 0;    
9fe0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
9ff0: 65 2c 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69  e, store value i
a000: 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f  n mem[] cells */
a010: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
a020: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
a030: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
a040: 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
a050: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a060: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
a070: 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a  evel->pIdx;   /*
a080: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
a090: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
a0a0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
a0b0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
a0c0: 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
a0d0: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
a0e0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
a0f0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
a100: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
a110: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
a120: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a150: 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ter */..  /* Fig
a160: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
a170: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
a180: 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
a190: 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
a1a0: 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65   ** We always ne
a1b0: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ed at least one 
a1c0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
a1d0: 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  e loop terminato
a1e0: 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49  r.  ** value.  I
a1f0: 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f  f there are IN o
a200: 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e  perators we'll n
a210: 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  eed one for each
a220: 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63   == or.  ** IN c
a230: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
a240: 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
a250: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
a260: 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  .  if( pLevel->f
a270: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
a280: 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50  UMN_IN ){.    pP
a290: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
a2a0: 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74  evel->nEq;.    t
a2b0: 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20  ermsInMem = 1;. 
a2c0: 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
a2d0: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
a2e0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
a2f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
a300: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
a310: 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  {.    int k = pI
a320: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
a330: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
a340: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
a350: 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   k, notReady, WO
a360: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29  _EQ|WO_IN, pIdx)
a370: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d  ;.    if( pTerm=
a380: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
a390: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
a3a0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
a3b0: 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f  ED)==0 );.    co
a3c0: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
a3d0: 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72  Parse, pTerm, br
a3e0: 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  k, pLevel);.    
a3f0: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
a400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a410: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a420: 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
a430: 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20  >iMem+j+1, 1);. 
a440: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
a450: 74 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20  t( j==nEq );..  
a460: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
a470: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
a480: 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68  values are on th
a490: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
a4a0: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65  ck.  */.  if( te
a4b0: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
a4c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
a4d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
a4e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a4f0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
a500: 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29  el->iMem+j+1, 0)
a510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
a520: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
a530: 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  T./*.** The foll
a540: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68  owing variable h
a550: 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63  olds a text desc
a560: 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79  ription of query
a570: 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a   plan generated.
a580: 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ** by the most r
a590: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
a5a0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
a5b0: 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  ).  Each call to
a5c0: 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f   WhereBegin.** o
a5d0: 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
a5e0: 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e  evious.  This in
a5f0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
a600: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
a610: 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e  d.** analysis on
a620: 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ly..*/.char sqli
a630: 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42  te3_query_plan[B
a640: 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65  MS*2*40];  /* Te
a650: 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  xt of the join *
a660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50  /.static int nQP
a670: 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lan = 0;        
a680: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
a690: 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72  ee slow in _quer
a6a0: 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e  y_plan[] */..#en
a6b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
a6c0: 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ST */..../*.** G
a6d0: 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
a6e0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
a6f0: 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
a700: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
a710: 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
a720: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
a730: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
a740: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a750: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
a760: 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
a770: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
a780: 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
a790: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
a7a0: 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
a7b0: 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
a7c0: 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
a7d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
a7e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
a7f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
a800: 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
a810: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
a820: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
a830: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
a840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
a850: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
a860: 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
a870: 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
a880: 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
a890: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
a8a0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
a8b0: 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
a8c0: 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
a8d0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
a8e0: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
a8f0: 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
a900: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
a910: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
a920: 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
a930: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
a940: 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
a950: 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
a960: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
a970: 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
a980: 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
a990: 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
a9a0: 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
a9b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
a9c0: 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
a9d0: 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
a9e0: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
a9f0: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
aa00: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
aa10: 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
aa20: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
aa30: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
aa40: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
aa50: 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
aa60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
aa70: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
aa80: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
aa90: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
aaa0: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
aab0: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
aad0: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
aae0: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
aaf0: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
ab10: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
ab20: 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
ab30: 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
ab40: 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
ab50: 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
ab60: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
ab70: 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
ab80: 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
ab90: 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
aba0: 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
abb0: 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
abc0: 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
abd0: 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
abe0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
abf0: 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
ac00: 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
ac10: 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
ac20: 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
ac30: 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
ac40: 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
ac50: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
ac60: 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
ac70: 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
ac80: 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
ac90: 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
aca0: 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
acb0: 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
acc0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
acd0: 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
ace0: 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
acf0: 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
ad00: 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
ad10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
ad20: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
ad30: 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
ad40: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
ad50: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
ad60: 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
ad70: 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
ad80: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
ad90: 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
ada0: 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
adb0: 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
adc0: 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
add0: 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
ade0: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
adf0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
ae00: 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
ae10: 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
ae20: 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
ae30: 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
ae40: 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
ae50: 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
ae60: 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
ae70: 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
ae80: 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
ae90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
aea0: 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
aeb0: 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
aec0: 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
aed0: 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
aee0: 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
aef0: 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
af00: 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
af10: 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
af20: 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
af30: 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
af40: 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
af50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
af60: 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
af70: 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
af80: 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
af90: 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
afa0: 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
afb0: 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
afc0: 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
afd0: 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
afe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
aff0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
b000: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
b010: 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
b020: 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
b030: 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
b040: 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
b050: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
b060: 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
b070: 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
b080: 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
b090: 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
b0a0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
b0b0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
b0c0: 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
b0d0: 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
b0e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b0f0: 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
b100: 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
b110: 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
b120: 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
b130: 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
b140: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
b150: 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
b160: 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
b170: 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
b180: 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
b190: 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
b1a0: 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
b1b0: 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
b1c0: 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
b1d0: 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
b1e0: 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
b1f0: 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
b200: 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
b210: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
b220: 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
b230: 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
b240: 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
b250: 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
b260: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
b270: 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
b280: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
b290: 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
b2a0: 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
b2b0: 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
b2c0: 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
b2d0: 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
b2e0: 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
b2f0: 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
b300: 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
b310: 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
b320: 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
b330: 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f  SSING.**.** *ppO
b340: 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
b350: 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
b360: 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
b370: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b380: 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
b390: 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
b3a0: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
b3b0: 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
b3c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
b3d0: 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
b3e0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
b3f0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
b400: 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
b410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
b420: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
b430: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
b440: 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
b450: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
b460: 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
b470: 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
b480: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
b490: 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
b4a0: 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65  d and.** *ppOrde
b4b0: 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55  rBy is set to NU
b4c0: 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  LL.  This is an 
b4d0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
b4e0: 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a  t prevents an.**
b4f0: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
b500: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
b510: 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  set if an index 
b520: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
b530: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
b540: 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
b550: 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
b560: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
b570: 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
b580: 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
b590: 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
b5a0: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
b5b0: 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72  , then the *ppOr
b5c0: 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67  derBy is unchang
b5d0: 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
b5e0: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
b5f0: 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
b600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
b610: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
b620: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
b630: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
b640: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
b650: 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
b660: 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
b670: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
b680: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
b690: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
b6a0: 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a   **ppOrderBy  /*
b6b0: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
b6c0: 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
b6d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b700: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
b710: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
b720: 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
b730: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
b740: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
b750: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
b760: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
b770: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
b780: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
b790: 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f  */.  int brk, co
b7a0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
b7b0: 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65  /* Addresses use
b7c0: 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  d during code ge
b7d0: 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  neration */.  Bi
b7e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
b7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
b800: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
b810: 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
b820: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b830: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
b840: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
b850: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
b860: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
b870: 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20  skSet maskSet;  
b880: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b890: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
b8a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
b8b0: 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   wc;            
b8c0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
b8d0: 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69  use is divided i
b8e0: 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20  nto these terms 
b8f0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
b900: 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
b910: 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
b920: 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
b930: 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
b940: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
b950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
b960: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
b970: 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
b980: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
b9b0: 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
b9c0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
b9d0: 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
b9e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
b9f0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
ba00: 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67   all wc.a[].flag
ba10: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  s */..  /* The n
ba20: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
ba30: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ba40: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
ba50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
ba60: 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
ba70: 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66  tmask .  */.  if
ba80: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
ba90: 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
baa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bab0: 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
bac0: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
bad0: 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
bae0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
baf0: 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
bb00: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
bb10: 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
bb20: 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
bb30: 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
bb40: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
bb50: 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
bb60: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
bb70: 61 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29  askSet(&maskSet)
bb80: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
bb90: 6e 69 74 28 26 77 63 2c 20 70 50 61 72 73 65 29  nit(&wc, pParse)
bba0: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
bbb0: 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  wc, pWhere, TK_A
bbc0: 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41  ND);.    .  /* A
bbd0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
bbe0: 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
bbf0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
bc00: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
bc10: 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
bc20: 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57  value..  */.  pW
bc30: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
bc40: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72  loc( sizeof(Wher
bc50: 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73  eInfo) + pTabLis
bc60: 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57  t->nSrc*sizeof(W
bc70: 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69  hereLevel));.  i
bc80: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
bc90: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
bca0: 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
bcb0: 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  oMem;.  }.  pWIn
bcc0: 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
bcd0: 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
bce0: 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
bcf0: 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
bd00: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
bd10: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
bd20: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
bd30: 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
bd40: 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
bd50: 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
bd60: 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
bd70: 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
bd80: 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
bd90: 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
bda0: 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
bdb0: 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62   pWhere && (pTab
bdc0: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c  List->nSrc==0 ||
bdd0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
bde0: 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29 29 20  nstant(pWhere)) 
bdf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
be00: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
be10: 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
be20: 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20  ->iBreak, 1);.  
be30: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
be40: 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
be50: 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
be60: 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
be70: 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
be80: 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
be90: 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
bea0: 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
beb0: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
bec0: 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
bed0: 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
bee0: 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
bef0: 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
bf00: 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
bf10: 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
bf20: 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
bf30: 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 64 64  so that they add
bf40: 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
bf50: 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
bf60: 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ssed..  */.  for
bf70: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
bf80: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
bf90: 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61    createMask(&ma
bfa0: 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
bfb0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
bfc0: 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a    }.  exprAnalyz
bfd0: 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
bfe0: 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20  maskSet, &wc);. 
bff0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
c000: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
c010: 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
c020: 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  nNoMem;.  }..  /
c030: 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74  * Chose the best
c040: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
c050: 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
c060: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
c070: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
c080: 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68  loop fills in th
c090: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
c0a0: 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ds:.  **.  **   
c0b0: 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78  pWInfo->a[].pIdx
c0c0: 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20        The index 
c0d0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
c0e0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f  level of the loo
c0f0: 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  p..  **   pWInfo
c100: 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20  ->a[].flags     
c110: 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20  WHERE_xxx flags 
c120: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c130: 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  pIdx.  **   pWIn
c140: 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20  fo->a[].nEq     
c150: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
c160: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
c170: 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49  aints.  **   pWI
c180: 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20  nfo->a[].iFrom  
c190: 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20     When term of 
c1a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
c1b0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
c1c0: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
c1d0: 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
c1e0: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
c1f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
c200: 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
c210: 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
c220: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
c230: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
c240: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
c250: 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f  p also figures o
c260: 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f  ut the nesting o
c270: 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  rder of tables i
c280: 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20  n the FROM.  ** 
c290: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e  clause..  */.  n
c2a0: 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
c2b0: 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65  ask)0;.  pTabIte
c2c0: 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
c2d0: 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  .  pLevel = pWIn
c2e0: 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67  fo->a;.  andFlag
c2f0: 73 20 3d 20 7e 30 3b 0a 20 20 66 6f 72 28 69 3d  s = ~0;.  for(i=
c300: 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
c310: 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
c320: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
c330: 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
c340: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c360: 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74  Index for FROM t
c370: 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d  able at pTabItem
c380: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   */.    int flag
c390: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
c3a0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
c3b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
c3c0: 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  dx */.    int nE
c3d0: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
c3e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c3f0: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
c400: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64  traints */.    d
c410: 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
c420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c430: 65 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20  e cost for pIdx 
c440: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
c470: 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
c480: 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  es */.    Index 
c490: 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
c4a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73        /* The bes
c4b0: 74 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20  t index seen so 
c4c0: 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  far */.    int b
c4d0: 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
c4e0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
c4f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c500: 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
c510: 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
c520: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20           /* nEq 
c530: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c540: 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75  pBest */.    dou
c550: 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ble lowestCost =
c560: 20 31 2e 30 65 39 39 3b 20 2f 2a 20 43 6f 73 74   1.0e99; /* Cost
c570: 20 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f   of the pBest */
c580: 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 3b 20  .    int bestJ; 
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
c5b0: 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73   j */.    Bitmas
c5c0: 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  k m;            
c5d0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
c5e0: 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20   value for j or 
c5f0: 62 65 73 74 4a 20 2a 2f 0a 0a 20 20 20 20 66 6f  bestJ */..    fo
c600: 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
c610: 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
c620: 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  [j]; j<pTabList-
c630: 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nSrc; j++, pTab
c640: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  Item++){.      m
c650: 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
c660: 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
c670: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
c680: 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
c690: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c6a0: 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
c6b0: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
c6c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c6d0: 7d 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62  }.      cost = b
c6e0: 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
c6f0: 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
c700: 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 28 6a 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (j==0 && ppOrde
c730: 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
c740: 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
c760: 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45  Idx, &flags, &nE
c770: 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  q);.      if( co
c780: 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b  st<lowestCost ){
c790: 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43  .        lowestC
c7a0: 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
c7b0: 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
c7c0: 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46 6c  ;.        bestFl
c7d0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
c7e0: 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
c7f0: 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  Eq;.        best
c800: 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  J = j;.      }. 
c810: 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74       if( (pTabIt
c820: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
c830: 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20  T_LEFT)!=0.     
c840: 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28      || (j>0 && (
c850: 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69  pTabItem[-1].joi
c860: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
c870: 21 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=0).      ){.  
c880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
c8a0: 66 28 20 28 62 65 73 74 46 6c 61 67 73 20 26 20  f( (bestFlags & 
c8b0: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d  WHERE_ORDERBY)!=
c8c0: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72  0 ){.      *ppOr
c8d0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
c8e0: 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d  .    andFlags &=
c8f0: 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20 20   bestFlags;.    
c900: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 3d 20  pLevel->flags = 
c910: 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20 20 70  bestFlags;.    p
c920: 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42  Level->pIdx = pB
c930: 65 73 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  est;.    pLevel-
c940: 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a  >nEq = bestNEq;.
c950: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c      pLevel->aInL
c960: 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65  oop = 0;.    pLe
c970: 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20  vel->nIn = 0;.  
c980: 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
c990: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
c9a0: 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
c9b0: 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Tab++;.    }else
c9c0: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
c9d0: 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20  iIdxCur = -1;.  
c9e0: 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
c9f0: 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
ca00: 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
ca10: 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
ca20: 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  r);.    pLevel->
ca30: 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 20  iFrom = bestJ;. 
ca40: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
ca50: 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79  total query only
ca60: 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c   selects a singl
ca70: 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20  e row, then the 
ca80: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
ca90: 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61  ause is irreleva
caa0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  nt..  */.  if( (
cab0: 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
cac0: 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70  _UNIQUE)!=0 && p
cad0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
cae0: 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
caf0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
cb00: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
cb10: 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
cb20: 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
cb30: 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
cb40: 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
cb50: 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
cb60: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
cb70: 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
cb80: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
cb90: 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
cba0: 74 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d  to */.  pLevel =
cbb0: 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f   pWInfo->a;.  fo
cbc0: 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
cbd0: 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
cbe0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
cbf0: 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
cc00: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
cc10: 49 6e 64 65 78 20 2a 70 49 78 3b 0a 20 20 20 20  Index *pIx;.    
cc20: 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
cc30: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
cc40: 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
cc50: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
cc60: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
cc70: 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
cc80: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
cc90: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
cca0: 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
ccb0: 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
ccc0: 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66    if( (pLevel->f
ccd0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
cce0: 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
ccf0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
cd00: 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c  bleForReading(v,
cd10: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
cd20: 6f 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  or, pTab);.    }
cd30: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
cd40: 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
cd50: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
cd60: 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
cd70: 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
cd80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd90: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
cda0: 72 2c 20 70 49 78 2d 3e 69 44 62 2c 20 30 29 3b  r, pIx->iDb, 0);
cdb0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
cdc0: 6e 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70  nt((v, "# %s", p
cdd0: 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
cde0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
cdf0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
ce00: 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
ce10: 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
ce20: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
ce30: 2a 29 26 70 49 78 2d 3e 6b 65 79 49 6e 66 6f 2c  *)&pIx->keyInfo,
ce40: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
ce50: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65    }.    if( (pLe
ce60: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
ce70: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
ce80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ce90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cea0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
ceb0: 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f  IdxCur, pIx->nCo
cec0: 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  lumn+1);.    }. 
ced0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
cee0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
cef0: 65 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  e, pTab->iDb);. 
cf00: 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
cf10: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
cf20: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
cf30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
cf40: 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
cf50: 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
cf60: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
cf70: 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
cf80: 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
cf90: 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
cfa0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
cfb0: 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
cfc0: 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
cfd0: 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
cfe0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  0;.  for(i=0, pL
cff0: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
d000: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
d010: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
d020: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
d030: 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
d040: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20  Item->iCursor;  
d050: 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
d060: 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
d070: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
d080: 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx;       /* Th
d090: 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
d0a0: 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
d0b0: 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
d0c0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
d0d0: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
d0e0: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  dex */.    int o
d0f0: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a  mitTable;     /*
d100: 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
d110: 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
d120: 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20  /.    int bRev; 
d130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d140: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
d150: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
d160: 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61  rder */..    pTa
d170: 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
d180: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
d190: 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  om];.    iCur = 
d1a0: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
d1b0: 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  r;.    pIdx = pL
d1c0: 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
d1d0: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
d1e0: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62  ->iIdxCur;.    b
d1f0: 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  Rev = (pLevel->f
d200: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
d210: 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d  ERSE)!=0;.    om
d220: 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
d230: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
d240: 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a  _IDX_ONLY)!=0;..
d250: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
d260: 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
d270: 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
d280: 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
d290: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
d2a0: 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
d2b0: 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72  ump to brk to br
d2c0: 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
d2d0: 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74  p..    ** Jump t
d2e0: 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
d2f0: 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
d300: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
d310: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  f the.    ** loo
d320: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72  p..    */.    br
d330: 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20  k = pLevel->brk 
d340: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d350: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63  eLabel(v);.    c
d360: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
d370: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
d380: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
d390: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
d3a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
d3b0: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
d3c0: 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
d3d0: 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69  and.    ** initi
d3e0: 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
d3f0: 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
d400: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
d410: 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a  atches any.    *
d420: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
d430: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
d440: 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oin..    */.    
d450: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
d460: 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
d470: 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  [-1].jointype & 
d480: 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
d490: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
d4a0: 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
d4b0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
d4c0: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
d4d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
d4e0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
d4f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d500: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
d510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d520: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
d530: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  re, pLevel->iLef
d540: 74 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20  tJoin, 1);.     
d550: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d560: 20 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f   "# init LEFT JO
d570: 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
d580: 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "));.    }..    
d590: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
d5a0: 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
d5b0: 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  EQ ){.      /* C
d5c0: 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64  ase 1:  We can d
d5d0: 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
d5e0: 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
d5f0: 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a  sing an.      **
d600: 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
d610: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
d620: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
d630: 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20  field.  Or.     
d640: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20   **          we 
d650: 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70  reference multip
d660: 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20  le rows using a 
d670: 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22  "rowid IN (...)"
d680: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
d690: 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
d6a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 65      */.      pTe
d6b0: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rm = findTerm(&w
d6c0: 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  c, iCur, -1, not
d6d0: 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
d6e0: 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  IN, 0);.      as
d6f0: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
d700: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d710: 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
d720: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d730: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
d740: 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
d750: 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
d760: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
d770: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
d780: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
d790: 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  brk, pLevel);.  
d7a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d7b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
d7c0: 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20  eInt, 1, brk);. 
d7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d7e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45  AddOp(v, OP_NotE
d7f0: 78 69 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b  xists, iCur, brk
d800: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d810: 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
d820: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
d830: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
d840: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
d850: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
d860: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a  _ROWID_RANGE ){.
d870: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
d880: 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
d890: 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
d8a0: 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
d8b0: 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
d8c0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
d8d0: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
d8e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
d8f0: 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
d900: 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
d910: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
d920: 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
d930: 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
d940: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
d950: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
d960: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
d970: 29 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  );.      pEnd = 
d980: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
d990: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
d9a0: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
d9b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  );.      if( bRe
d9c0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  v ){.        pTe
d9d0: 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
d9e0: 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
d9f0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64  nd;.        pEnd
da00: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
da10: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  }.      if( pSta
da20: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  rt ){.        Ex
da30: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
da40: 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
da50: 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
da60: 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
da70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
da80: 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  art->leftCursor=
da90: 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  =iCur );.       
daa0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
dab0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
dac0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ght);.        sq
dad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dae0: 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70  , OP_ForceInt, p
daf0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20  X->op==TK_LE || 
db00: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62  pX->op==TK_GT, b
db10: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rk);.        sql
db20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
db30: 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c   bRev ? OP_MoveL
db40: 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  t : OP_MoveGe, i
db50: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
db60: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
db70: 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
db80: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
db90: 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
dba0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dbc0: 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20  AddOp(v, bRev ? 
dbd0: 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
dbe0: 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  ind, iCur, brk);
dbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
dc00: 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
dc10: 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
dc20: 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
dc30: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
dc40: 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
dc50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dc60: 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
dc70: 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
dc80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dc90: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
dca0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
dcb0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
dcc0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
dcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
dcf0: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
dd00: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Mem, 1);.       
dd10: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
dd20: 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
dd30: 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _GT ){.         
dd40: 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
dd50: 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
dd60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dd70: 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
dd80: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
dd90: 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20   OP_Gt;.        
dda0: 7d 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  }.        disabl
ddb0: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
ddc0: 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
ddd0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
dde0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ddf0: 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  r(v);.      pLev
de00: 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
de10: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
de20: 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
de30: 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
de40: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
de50: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  tart;.      if( 
de60: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
de70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
de80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
de90: 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30  P_Rowid, iCur, 0
dea0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
deb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
dec0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
ded0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
dee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
def0: 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c  AddOp(v, testOp,
df00: 20 27 6e 27 2c 20 62 72 6b 29 3b 0a 20 20 20 20   'n', brk);.    
df10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
df20: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
df30: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
df40: 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
df50: 20 43 61 73 65 20 33 3a 20 54 68 65 20 57 48 45   Case 3: The WHE
df60: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
df70: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 74 68  hat refers to th
df80: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20  e right-most.   
df90: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
dfa0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
dfb0: 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  x is an inequali
dfc0: 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ty.  For example
dfd0: 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20  , if.      **   
dfe0: 20 20 20 20 20 20 74 68 65 20 69 6e 64 65 78 20        the index 
dff0: 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e  is on (x,y,z) an
e000: 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  d the WHERE clau
e010: 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20  se is of the.   
e020: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f     **         fo
e030: 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30  rm "x=5 AND y<10
e040: 22 20 74 68 65 6e 20 74 68 69 73 20 63 61 73 65  " then this case
e050: 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20   is used.  Only 
e060: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
e070: 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20       right-most 
e080: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
e090: 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
e0a0: 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
e0b0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
e0c0: 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
e0d0: 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
e0e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e0f0: 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
e100: 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
e110: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
e120: 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
e130: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
e140: 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
e150: 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
e160: 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
e170: 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20  rder.      **   
e180: 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
e190: 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
e1a0: 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
e1b0: 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20   ORDER BY..     
e1c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
e1d0: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
e1e0: 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
e1f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 46 6c  ;.      int leFl
e200: 61 67 3d 30 2c 20 67 65 46 6c 61 67 3d 30 3b 0a  ag=0, geFlag=0;.
e210: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
e220: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c  ;.      int topL
e230: 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  imit = (pLevel->
e240: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  flags & WHERE_TO
e250: 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20  P_LIMIT)!=0;.   
e260: 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20     int btmLimit 
e270: 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
e280: 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
e290: 49 54 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f  IT)!=0;..      /
e2a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e2b0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
e2c0: 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
e2d0: 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
e2e0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76        ** and lev
e2f0: 65 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  el the values of
e300: 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20   those terms on 
e310: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20  the stack..     
e320: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c   */.      codeAl
e330: 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
e340: 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26  Parse, pLevel, &
e350: 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72  wc, notReady, br
e360: 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75  k);..      /* Du
e370: 70 6c 69 63 61 74 65 20 74 68 65 20 65 71 75 61  plicate the equa
e380: 6c 69 74 79 20 74 65 72 6d 20 76 61 6c 75 65 73  lity term values
e390: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 69   because they wi
e3a0: 6c 6c 20 61 6c 6c 20 62 65 0a 20 20 20 20 20 20  ll all be.      
e3b0: 2a 2a 20 75 73 65 64 20 74 77 69 63 65 3a 20 6f  ** used twice: o
e3c0: 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  nce to make the 
e3d0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20  termination key 
e3e0: 61 6e 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65  and once to make
e3f0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74   the.      ** st
e400: 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a  art key..      *
e410: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  /.      for(j=0;
e420: 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e440: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
e450: 2c 20 6e 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20  , nEq-1, 0);.   
e460: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
e470: 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d  enerate the term
e480: 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68  ination key.  Th
e490: 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61  is is the key va
e4a0: 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lue that.      *
e4b0: 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73  * will end the s
e4c0: 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
e4d0: 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   no termination 
e4e0: 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20  key if there.   
e4f0: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75     ** are no equ
e500: 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
e510: 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e  no "X<..." term.
e520: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
e530: 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
e540: 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  On a reverse-ord
e550: 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d  er scan, the so-
e560: 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74  called "terminat
e570: 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65  ion".      ** ke
e580: 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20  y computed here 
e590: 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
e5a0: 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b  eing the start k
e5b0: 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
e5c0: 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20     if( topLimit 
e5d0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
e5e0: 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
e5f0: 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
e600: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
e610: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
e620: 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
e630: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
e640: 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_LE, pIdx);.   
e650: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
e660: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  rm!=0 );.       
e670: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
e680: 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
e690: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
e6a0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
e6b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
e6c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e6d0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
e6e0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 46 6c 61  );.        leFla
e6f0: 67 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  g = pX->op==TK_L
e700: 45 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  E;.        disab
e710: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
e720: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74  Term);.        t
e730: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45  estOp = OP_IdxGE
e740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e750: 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
e760: 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45  nEq>0 ? OP_IdxGE
e770: 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   : OP_Noop;.    
e780: 20 20 20 20 6c 65 46 6c 61 67 20 3d 20 31 3b 0a      leFlag = 1;.
e790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e7a0: 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
e7b0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
e7c0: 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f   nCol = nEq + to
e7d0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
e7e0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
e7f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
e800: 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
e810: 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
e820: 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
e830: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
e840: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
e850: 20 3d 20 6c 65 46 6c 61 67 20 3f 20 4f 50 5f 4d   = leFlag ? OP_M
e860: 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c  oveLe : OP_MoveL
e870: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
e880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e890: 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72   op, iIdxCur, br
e8a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  k);.        }els
e8b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
e8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e8d0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
e8e0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
e8f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e900: 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
e910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e920: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e930: 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20  _Last, iIdxCur, 
e940: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
e950: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
e960: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20   the start key. 
e970: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
e980: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
e990: 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a  e lower.      **
e9a0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65   bound on the se
e9b0: 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
e9c0: 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20  no start key if 
e9d0: 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
e9e0: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74     ** equality t
e9f0: 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72  erms and if ther
ea00: 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20  e is no "X>..." 
ea10: 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20  term.  In.      
ea20: 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65  ** that case, ge
ea30: 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64  nerate a "Rewind
ea40: 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  " instruction in
ea50: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20   place of the.  
ea60: 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
ea70: 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a   search..      *
ea80: 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d  *.      ** 2002-
ea90: 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63  Dec-04: In the c
eaa0: 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65  ase of a reverse
eab0: 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74  -order search, t
eac0: 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20  he so-called.   
ead0: 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65     ** "start" ke
eae0: 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70  y really ends up
eaf0: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74   being used as t
eb00: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
eb10: 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
eb20: 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20     if( btmLimit 
eb30: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
eb40: 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
eb50: 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
eb60: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
eb70: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
eb80: 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
eb90: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
eba0: 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_GE, pIdx);.   
ebb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
ebc0: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  rm!=0 );.       
ebd0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
ebe0: 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
ebf0: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
ec00: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
ec10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
ec20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ec30: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 67 65 46 6c 61  );.        geFla
ec50: 67 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  g = pX->op==TK_G
ec60: 45 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  E;.        disab
ec70: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
ec80: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
ec90: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 65 46 6c  se{.        geFl
eca0: 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ag = 1;.      }.
ecb0: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20        if( nEq>0 
ecc0: 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20  || btmLimit ){. 
ecd0: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20         int nCol 
ece0: 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74  = nEq + btmLimit
ecf0: 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49  ;.        buildI
ed00: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f  ndexProbe(v, nCo
ed10: 6c 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  l, brk, pIdx);. 
ed20: 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
ed30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  ){.          pLe
ed40: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
ed50: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
ed60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ed70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ed80: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
ed90: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Mem, 1);.       
eda0: 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49     testOp = OP_I
edb0: 64 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  dxLT;.        }e
edc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
edd0: 6e 74 20 6f 70 20 3d 20 67 65 46 6c 61 67 20 3f  nt op = geFlag ?
ede0: 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f   OP_MoveGe : OP_
edf0: 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20  MoveGt;.        
ee00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee10: 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  Op(v, op, iIdxCu
ee20: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
ee30: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
ee40: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
ee50: 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e     testOp = OP_N
ee60: 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oop;.      }else
ee70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ee80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ee90: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
eea0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
eeb0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
eec0: 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f  te the the top o
eed0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
eee0: 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69  there is a termi
eef0: 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
ef00: 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74  key we have to t
ef10: 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79  est for that key
ef20: 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68   and abort at th
ef30: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20  e top of the.   
ef40: 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
ef50: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74    */.      start
ef60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
ef70: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
ef80: 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
ef90: 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
efa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
efb0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
efc0: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
efd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
efe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
eff0: 20 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72   testOp, iIdxCur
f000: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
f010: 69 66 28 20 28 6c 65 46 6c 61 67 20 26 26 20 21  if( (leFlag && !
f020: 62 52 65 76 29 20 7c 7c 20 28 21 67 65 46 6c 61  bRev) || (!geFla
f030: 67 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20 20  g && bRev) ){.  
f040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f050: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
f060: 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  1, "+", P3_STATI
f070: 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
f080: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f090: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f0a0: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
f0b0: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
f0c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f0d0: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
f0e0: 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 2c 20  nEq + topLimit, 
f0f0: 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  cont);.      if(
f100: 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
f110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f120: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
f130: 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
f140: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
f150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f160: 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
f170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
f180: 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
f190: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
f1a0: 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
f1b0: 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20   the loop..     
f1c0: 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
f1d0: 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
f1e0: 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
f1f0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
f200: 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
f210: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
f220: 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
f230: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
f240: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
f250: 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  N_EQ ){.      /*
f260: 20 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20   Case 4:  There 
f270: 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  is an index and 
f280: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
f290: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
f2a0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  at.      **     
f2b0: 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68       refer to th
f2c0: 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  e index using th
f2d0: 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f  e "==" or "IN" o
f2e0: 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
f2f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
f300: 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
f310: 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
f320: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
f330: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
f340: 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
f350: 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
f360: 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
f370: 2a 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  * and leave the 
f380: 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
f390: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
f3a0: 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
f3b0: 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
f3c0: 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
f3d0: 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
f3e0: 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20  Ready, brk);..  
f3f0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f400: 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61  a single key tha
f410: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
f420: 6f 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64  o both start and
f430: 20 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20 20   terminate.     
f440: 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a 20   ** the search. 
f450: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 75       */.      bu
f460: 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c  ildIndexProbe(v,
f470: 20 6e 45 71 2c 20 62 72 6b 2c 20 70 49 64 78 29   nEq, brk, pIdx)
f480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f490: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
f4a0: 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
f4b0: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20  >iMem, 0);..    
f4c0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f4d0: 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74  de (1) to move t
f4e0: 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  o the first matc
f4f0: 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
f500: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
f510: 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74   ** Then generat
f520: 65 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20  e code (2) that 
f530: 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22 20 61  jumps to "brk" a
f540: 66 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  fter the cursor 
f550: 69 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  is past.      **
f560: 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69   the last matchi
f570: 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
f580: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
f590: 64 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74  de (1) is execut
f5a0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  ed.      ** once
f5b0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
f5c0: 68 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63  he search, the c
f5d0: 6f 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75  ode (2) is execu
f5e0: 74 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a  ted before each.
f5f0: 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69        ** iterati
f600: 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74  on of the scan t
f610: 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61  o see if the sca
f620: 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20  n has finished. 
f630: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  */.      if( bRe
f640: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  v ){.        /* 
f650: 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
f660: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
f670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f680: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20  p(v, OP_MoveLe, 
f690: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
f6a0: 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
f6b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f6c0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
f6d0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
f6e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f6f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f700: 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20  IdxLT, iIdxCur, 
f710: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  brk);.        pL
f720: 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
f730: 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
f740: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
f750: 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
f760: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
f770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f780: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
f790: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
f7a0: 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
f7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f7c0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
f7d0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
f7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f7f0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64  VdbeOp3(v, OP_Id
f800: 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20 62 72  xGE, iIdxCur, br
f810: 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  k, "+", P3_STATI
f820: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  C);.        pLev
f830: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
f840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f860: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69  (v, OP_RowKey, i
f870: 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
f880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f890: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75  Op(v, OP_IdxIsNu
f8a0: 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a  ll, nEq, cont);.
f8b0: 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
f8c0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
f8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8e0: 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
f8f0: 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
f900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f910: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
f920: 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
f930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
f940: 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
f950: 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
f960: 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
f970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f980: 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
f990: 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
f9a0: 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
f9b0: 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
f9c0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
f9d0: 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
f9e0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
f9f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
fa00: 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
fa10: 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
fa20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
fa30: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
fa40: 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
fa50: 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
fa60: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
fa70: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
fa80: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
fa90: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
faa0: 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
fab0: 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
fac0: 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
fad0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
fae0: 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
faf0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
fb00: 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
fb10: 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
fb20: 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
fb30: 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
fb40: 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
fb50: 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
fb60: 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
fb70: 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
fb80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
fb90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
fba0: 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
fbb0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
fbc0: 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
fbd0: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
fbe0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
fbf0: 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
fc00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
fc10: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
fc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
fc30: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
fc40: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
fc50: 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
fc60: 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
fc70: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
fc80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
fc90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
fca0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
fcb0: 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20  arse, pE, cont, 
fcc0: 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  1);.      pTerm-
fcd0: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
fce0: 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ODED;.    }..   
fcf0: 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
fd00: 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
fd10: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
fd20: 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
fd30: 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ct that.    ** a
fd40: 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
fd50: 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
fd60: 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
fd70: 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
fd80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd90: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
fda0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  n ){.      pLeve
fdb0: 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  l->top = sqlite3
fdc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fdd0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
fde0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fdf0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
fe00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fe10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
fe20: 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
fe30: 69 4c 65 66 74 4a 6f 69 6e 2c 20 31 29 3b 0a 20  iLeftJoin, 1);. 
fe40: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
fe50: 28 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20 4c  ((v, "# record L
fe60: 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
fe70: 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
fe80: 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63  =wc.a, j=0; j<wc
fe90: 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  .nTerm; j++, pTe
fea0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
feb0: 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
fec0: 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
fed0: 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
fee0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
fef0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
ff00: 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
ff10: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
ff20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ff30: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
ff40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff50: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
ff60: 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
ff70: 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
ff80: 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
ff90: 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
ffa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ffb0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ffc0: 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65  _TEST  /* For te
ffd0: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
ffe0: 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
fff0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74    /* Record in t
10000 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e  he query plan in
10010 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10020 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10030 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69  e.  ** and the i
10040 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
10050 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e  ess it (if any).
10060 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69    If the table i
10070 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f  tself.  ** is no
10080 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65  t used, its name
10090 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20   is just '{}'.  
100a0 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75  If no index is u
100b0 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64  sed.  ** the ind
100c0 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20  ex is listed as 
100d0 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72  "{}".  If the pr
100e0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
100f0 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  d the.  ** index
10100 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20   name is '*'..  
10110 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10120 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
10130 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
10140 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  z;.    int n;.  
10150 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
10160 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54  fo->a[i];.    pT
10170 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
10180 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
10190 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54  rom];.    z = pT
101a0 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a  abItem->zAlias;.
101b0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
101c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
101d0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20  b->zName;.    n 
101e0 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
101f0 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
10200 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
10210 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b  uery_plan)-10 ){
10220 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
10230 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
10240 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
10250 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
10260 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
10270 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a  nQPlan], "{}");.
10280 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
10290 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 2;.      }else
102a0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  {.        strcpy
102b0 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
102c0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29  plan[nQPlan], z)
102d0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
102e0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
102f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
10300 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
10310 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
10320 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
10330 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
10340 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
10350 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
10360 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
10370 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
10380 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20 20  Plan], "* ");.  
10390 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
103a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
103b0 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29  Level->pIdx==0 )
103c0 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  {.      strcpy(&
103d0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
103e0 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20  an[nQPlan], "{} 
103f0 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  ");.      nQPlan
10400 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65   += 3;.    }else
10410 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c  {.      n = strl
10420 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  en(pLevel->pIdx-
10430 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
10440 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
10450 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
10460 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
10470 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
10480 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
10490 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
104a0 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pIdx->zName);.
104b0 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
104c0 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = n;.        sql
104d0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
104e0 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
104f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10500 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
10510 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
10520 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
10530 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
10540 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
10550 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
10560 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
10570 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
10580 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
10590 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
105a0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
105b0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
105c0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
105d0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
105e0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
105f0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
10600 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10610 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
10620 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
10630 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  rn..  */.  pWInf
10640 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63  o->iContinue = c
10650 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  ont;.  whereClau
10660 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20  seClear(&wc);.  
10670 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
10680 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
10690 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
106a0 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  /.whereBeginNoMe
106b0 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  m:.  whereClause
106c0 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 73 71  Clear(&wc);.  sq
106d0 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29  liteFree(pWInfo)
106e0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
106f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10700 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
10710 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
10720 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
10730 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10740 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
10750 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
10760 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
10770 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
10780 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
10790 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
107a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
107b0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
107c0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
107d0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
107e0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
107f0 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  List;..  /* Gene
10800 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
10810 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
10820 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
10830 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
10840 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
10850 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
10860 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
10870 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10880 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
10890 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
108a0 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
108b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
108c0 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
108d0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
108e0 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
108f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10900 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10910 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29  (v, pLevel->brk)
10920 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
10930 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->nIn ){.      i
10940 6e 74 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74  nt *a;.      int
10950 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
10960 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26  pLevel->nIn, a=&
10970 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
10980 6a 2a 33 2d 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  j*3-3]; j>0; j--
10990 2c 20 61 2d 3d 33 29 7b 0a 20 20 20 20 20 20 20  , a-=3){.       
109a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109b0 70 28 76 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  p(v, a[0], a[1],
109c0 20 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a   a[2]);.      }.
109d0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
109e0 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
109f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10a00 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
10a10 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
10a20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
10a30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10a40 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10a50 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  d, pLevel->iLeft
10a60 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  Join, 0);.      
10a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a80 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
10a90 31 2c 20 61 64 64 72 2b 34 20 2b 20 28 70 4c 65  1, addr+4 + (pLe
10aa0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 29  vel->iIdxCur>=0)
10ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10ac0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10ad0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
10ae0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c  t->a[i].iCursor,
10af0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
10b00 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
10b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10b30 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
10b40 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29  vel->iIdxCur, 0)
10b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
10b80 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20  pLevel->top);.  
10b90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
10ba0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
10bb0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
10bc0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10bd0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
10be0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
10bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10c00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
10c10 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
10c20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
10c30 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
10c40 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
10c50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
10c60 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  in..  */.  for(i
10c70 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
10c80 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
10c90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
10ca0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
10cb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10cc0 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
10cd0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
10ce0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
10cf0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
10d00 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
10d10 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10d20 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
10d30 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70  isTransient || p
10d40 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
10d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
10d60 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
10d70 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
10d80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
10d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10da0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
10db0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
10dc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10dd0 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30   pLevel->pIdx!=0
10de0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10df0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10e00 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
10e10 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
10e20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
10e30 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74  cursor substitut
10e40 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77  ions for cases w
10e50 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20  here we want to 
10e60 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  use.    ** just 
10e70 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65  the index and ne
10e80 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68  ver reference th
10e90 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
10ea0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
10eb0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
10ec0 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
10ed0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10ee0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
10ef0 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
10f00 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
10f10 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
10f20 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
10f30 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
10f40 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
10f50 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
10f60 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
10f70 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
10f80 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
10f90 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
10fa0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
10fb0 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
10fc0 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
10fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10fe0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
10ff0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
11000 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
11010 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
11020 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
11030 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
11040 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20  Level->pIdx;..  
11050 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11060 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  !=0 );.      pOp
11070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
11080 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  tOp(v, pWInfo->i
11090 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74  Top);.      last
110a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
110b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
110c0 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f      for(i=pWInfo
110d0 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73 74 3b 20  ->iTop; i<last; 
110e0 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i++, pOp++){.   
110f0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
11100 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
11110 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
11120 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
11130 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
11140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
11150 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
11160 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
11170 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
11180 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
11190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
111a0 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
111b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
111c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
111d0 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
111e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
11200 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
11220 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
11230 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
11240 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
11250 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
11260 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
11270 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
11280 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11290 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
112a0 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  P_NullRow ){.   
112b0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
112c0 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
112d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
112e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
112f0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
11300 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  */.  sqliteFree(
11310 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
11320 6e 3b 0a 7d 0a                                   n;.}.