/ Hex Artifact Content
Login

Artifact bbb973cbbd862b6b872faac39716a3fe13adfb44:


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 37   where.c,v 1.167
0340: 20 32 30 30 35 2f 30 38 2f 32 39 20 31 36 3a 34   2005/08/29 16:4
0350: 30 3a 35 33 20 64 72 68 20 45 78 70 20 24 0a 2a  0:53 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 69 6e 74 20 6e 6f 43 61 73 65  nt;.  int noCase
4070: 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a  ;.  char wc[3];.
4080: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4090: 3b 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ;..  if( !sqlite
40a0: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
40b0: 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61  db, pExpr, &noCa
40c0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
40d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
40e0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
40f0: 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  ist;.  pRight = 
4100: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
4110: 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d  r;.  if( pRight-
4120: 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
4130: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4140: 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c    }.  pLeft = pL
4150: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
4160: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
4170: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
4180: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4190: 0a 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  .  pColl = pLeft
41a0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70  ->pColl;.  if( p
41b0: 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Coll==0 ){.    p
41c0: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
41d0: 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Coll;.  }.  if( 
41e0: 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51  (pColl->type!=SQ
41f0: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
4200: 20 7c 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20   || noCase) &&. 
4210: 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70       (pColl->typ
4220: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e  e!=SQLITE_COLL_N
4230: 4f 43 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65  OCASE || !noCase
4240: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4250: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
4260: 44 65 71 75 6f 74 65 45 78 70 72 28 70 52 69 67  DequoteExpr(pRig
4270: 68 74 29 3b 0a 20 20 7a 20 3d 20 70 52 69 67 68  ht);.  z = pRigh
4280: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f  t->token.z;.  fo
4290: 72 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e  r(cnt=0; (c=z[cn
42a0: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
42b0: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
42c0: 26 20 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b  & c!=wc[2]; cnt+
42d0: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  +){}.  if( cnt==
42e0: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
42f0: 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75  cnt] ){.    retu
4300: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73  rn 0;.  }.  *pis
4310: 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74  Complete = z[cnt
4320: 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  ]==wc[0] && z[cn
4330: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61  t+1]==0;.  *pnPa
4340: 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72  ttern = cnt;.  r
4350: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4360: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4370: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4380: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ON */../*.** The
4390: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
43a0: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
43b0: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
43c0: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
43d0: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
43e0: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
43f0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
4400: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
4410: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
4420: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
4430: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
4440: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
4450: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
4460: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
4470: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4480: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4490: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
44a0: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
44b0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
44c0: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
44d0: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20  p> <expr>".  If 
44e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
44f0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4500: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
4510: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
4520: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
4530: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
4540: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
4550: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
4560: 65 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65  ew virtual expre
4570: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
4580: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20  m.** "Y <op> X" 
4590: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
45a0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
45b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
45c0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
45d0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
45e0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
45f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4600: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
4610: 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20 74 61 62  skSet,    /* tab
4620: 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68  le masks */.  Wh
4630: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
4640: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
4650: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
4660: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
4670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4680: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
4690: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
46a0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
46b0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
46c0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78  a[idxTerm];.  Ex
46d0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
46e0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d  m->pExpr;.  Bitm
46f0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a  ask prereqLeft;.
4700: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
4710: 41 6c 6c 3b 0a 20 20 69 6e 74 20 69 64 78 52 69  All;.  int idxRi
4720: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74  ght;.  int nPatt
4730: 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d  ern;.  int isCom
4740: 70 6c 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71  plete;..  if( sq
4750: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
4760: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4770: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
4780: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4790: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
47a0: 66 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ft);.  pTerm->pr
47b0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
47c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
47d0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
47e0: 68 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ht);.  pTerm->pr
47f0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
4800: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
4810: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4820: 45 78 70 72 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  Expr);.  pTerm->
4830: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
4840: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
4850: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
4860: 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  >operator = 0;. 
4870: 20 69 64 78 52 69 67 68 74 20 3d 20 2d 31 3b 0a   idxRight = -1;.
4880: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
4890: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70  pExpr->op) && (p
48a0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
48b0: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
48c0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
48d0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
48e0: 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  Left;.    Expr *
48f0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
4900: 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
4910: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
4920: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
4930: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
4940: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
4950: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
4960: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
4970: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4980: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
4990: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
49a0: 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20  pExpr->op);.    
49b0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
49c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
49d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
49e0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
49f0: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
4a00: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
4a10: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4a20: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
4a30: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
4a40: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
4a50: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
4a60: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
4a70: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
4a80: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
4a90: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
4aa0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
4ab0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
4ac0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4ad0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
4ae0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
4af0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
4b00: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
4b10: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
4b20: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
4b30: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
4b40: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
4b50: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
4b60: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
4b70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4b80: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
4b90: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
4ba0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
4bb0: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
4bc0: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  e(pDup);.      p
4bd0: 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65  Left = pDup->pLe
4be0: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
4bf0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
4c00: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
4c10: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75    pNew->leftColu
4c20: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
4c30: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  umn;.      pNew-
4c40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
4c50: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20  rereqLeft;.     
4c60: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
4c70: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
4c80: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61 74      pNew->operat
4c90: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
4ca0: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
4cb0: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
4cc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
4cd0: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
4ce0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
4cf0: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
4d00: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
4d10: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
4d20: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
4d30: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
4d40: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
4d50: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20  N implements..  
4d60: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
4d70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
4d80: 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  EEN ){.    ExprL
4d90: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
4da0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
4db0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
4dc0: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
4dd0: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
4de0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
4df0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
4e00: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
4e10: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
4e20: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
4e30: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
4e40: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
4e50: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
4e60: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
4e70: 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71  3Expr(ops[i], sq
4e80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
4e90: 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20  pr->pLeft),.    
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4ec0: 45 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e 61  ExprDup(pList->a
4ed0: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
4ee0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
4ef0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
4f00: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
4f10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
4f20: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
4f30: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
4f40: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
4f50: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
4f60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
4f70: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
4f80: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
4f90: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
4fa0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
4fb0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
4fc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
4fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
4fe0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
4ff0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
5000: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
5010: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 74 74  IZATION.  /* Att
5020: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
5030: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
5040: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
5050: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
5060: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
5070: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
5080: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
5090: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
50a0: 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  OR ){.    int ok
50b0: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
50c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c      int iColumn,
50d0: 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68   iCursor;.    Wh
50e0: 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20  ereClause sOr;. 
50f0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
5100: 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65  rTerm;..    asse
5110: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
5120: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
5130: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72  )==0 );.    wher
5140: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72  eClauseInit(&sOr
5150: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 29 3b 0a  , pWC->pParse);.
5160: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26      whereSplit(&
5170: 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  sOr, pExpr, TK_O
5180: 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  R);.    exprAnal
5190: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4d 61  yzeAll(pSrc, pMa
51a0: 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a 20 20  skSet, &sOr);.  
51b0: 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54    assert( sOr.nT
51c0: 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a 20 3d  erm>0 );.    j =
51d0: 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
51e0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e    iColumn = sOr.
51f0: 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  a[j].leftColumn;
5200: 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d  .      iCursor =
5210: 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75   sOr.a[j].leftCu
5220: 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d  rsor;.      ok =
5230: 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20   iCursor>=0;.   
5240: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
5250: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
5260: 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b  r.a; i>=0 && ok;
5270: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
5280: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
5290: 72 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 21  rTerm->operator!
52a0: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
52b0: 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f      goto or_not_
52c0: 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20  possible;.      
52d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
52e0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
52f0: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26 26 20  sor==iCursor && 
5300: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c  pOrTerm->leftCol
5310: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
5320: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
5330: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
5340: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
5350: 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 72 54 65  }else if( (pOrTe
5360: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5370: 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20  _COPIED)!=0 ||. 
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c     ((pOrTerm->fl
53a0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
53b0: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
53d0: 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  sOr.a[pOrTerm->i
53e0: 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20  Parent].flags & 
53f0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20  TERM_OR_OK)!=0) 
5400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
5410: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Term->flags &= ~
5420: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
5430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5440: 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20       ok = 0;.   
5450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5460: 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26     }while( !ok &
5470: 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c  & (sOr.a[j++].fl
5480: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
5490: 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e  D)!=0 && j<sOr.n
54a0: 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20  Term );.    if( 
54b0: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ok ){.      Expr
54c0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
54d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
54e0: 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  w, *pDup;.      
54f0: 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d  for(i=sOr.nTerm-
5500: 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61  1, pOrTerm=sOr.a
5510: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d  ; i>=0 && ok; i-
5520: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
5530: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
5540: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
5550: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
5560: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5570: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
5580: 70 72 44 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70  prDup(pOrTerm->p
5590: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
55a0: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
55b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
55c0: 70 65 6e 64 28 70 4c 69 73 74 2c 20 70 44 75 70  pend(pList, pDup
55d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
55e0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
55f0: 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e  e3Expr(TK_COLUMN
5600: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5610: 20 20 69 66 28 20 70 44 75 70 20 29 7b 0a 20 20    if( pDup ){.  
5620: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62        pDup->iTab
5630: 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
5640: 20 20 20 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c        pDup->iCol
5650: 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  umn = iColumn;. 
5660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
5670: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
5680: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
5690: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
56a0: 65 77 20 29 20 70 4e 65 77 2d 3e 70 4c 69 73 74  ew ) pNew->pList
56b0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
56c0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pTerm->pExpr = p
56d0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  New;.      pTerm
56e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
56f0: 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20 20 65  DYNAMIC;.      e
5700: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
5710: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
5720: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  idxTerm);.      
5730: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
5740: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 7d 0a  idxTerm];.    }.
5750: 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a  or_not_possible:
5760: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
5770: 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d  Clear(&sOr);.  }
5780: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5790: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
57a0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
57b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
57c0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
57d0: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
57e0: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
57f0: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
5800: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
5810: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
5820: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c  ..  */.  if( isL
5830: 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70  ikeOrGlob(pWC->p
5840: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5850: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
5860: 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20  Complete) ){.   
5870: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
5880: 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20  Right;.    Expr 
5890: 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a  *pStr1, *pStr2;.
58a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
58b0: 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b  pr1, *pNewExpr2;
58c0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
58d0: 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20  , idxNew2;..    
58e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
58f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5900: 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ;.    pRight = p
5910: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
5920: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
5930: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
5940: 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30  (TK_STRING, 0, 0
5950: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
5960: 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tr1 ){.      sql
5970: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
5980: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52  Str1->token, &pR
5990: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
59a0: 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e      pStr1->token
59b0: 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  .n = nPattern;. 
59c0: 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d     }.    pStr2 =
59d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
59e0: 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20  pStr1);.    if( 
59f0: 70 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61  pStr2 ){.      a
5a00: 73 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f  ssert( pStr2->to
5a10: 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20  ken.dyn );.     
5a20: 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d   ++*(u8*)&pStr2-
5a30: 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72  >token.z[nPatter
5a40: 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n-1];.    }.    
5a50: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
5a60: 74 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73  te3Expr(TK_GE, s
5a70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
5a80: 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b  eft), pStr1, 0);
5a90: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
5aa0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
5ab0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
5ac0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
5ad0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
5ae0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5af0: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
5b00: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
5b10: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
5b20: 74 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73  te3Expr(TK_LT, s
5b30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
5b40: 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b  eft), pStr2, 0);
5b50: 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
5b60: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
5b70: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
5b80: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
5b90: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
5ba0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5bb0: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
5bc0: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
5bd0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
5be0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
5bf0: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
5c00: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
5c10: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
5c20: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
5c30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
5c40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
5c50: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
5c60: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
5c70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
5c80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5c90: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5ca0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
5cb0: 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69  outine decides i
5cc0: 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73  f pIdx can be us
5cd0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
5ce0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
5cf0: 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e  ause.  If it can
5d00: 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  , it returns 1. 
5d10: 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20   If pIdx cannot 
5d20: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f  satisfy the.** O
5d30: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
5d40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
5d50: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f  urns 0..**.** pO
5d60: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
5d70: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
5d80: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
5d90: 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74  ment.  pTab is t
5da0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
5db0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
5dc0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  M clause of that
5dd0: 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61   same SELECT sta
5de0: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68  tement and.** th
5df0: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75  e table has a cu
5e00: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
5e10: 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
5e20: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62  an index on pTab
5e30: 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
5e40: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
5e50: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
5e60: 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
5e70: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
5e80: 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f  straints.  Any o
5e90: 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  f these columns 
5ea0: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66  may be missing f
5eb0: 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
5ec0: 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74  .** clause and t
5ed0: 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69  he match can sti
5ee0: 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e  ll be a success.
5ef0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73  .**.** All terms
5f00: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
5f10: 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69   that match agai
5f20: 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75  nst the index mu
5f30: 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20  st be either.** 
5f40: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54  ASC or DESC.  (T
5f50: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
5f60: 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74  R BY clause past
5f70: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e   the end of a UN
5f80: 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f  IQUE.** index do
5f90: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74   not need to sat
5fa0: 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72  isfy this constr
5fb0: 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52  aint.)  The *pbR
5fc0: 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  ev value is.** s
5fd0: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f  et to 1 if the O
5fe0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
5ff0: 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69  s all DESC and i
6000: 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  t is set to 0 if
6010: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
6020: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41   clause is all A
6030: 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SC..*/.static in
6040: 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  t isSortingIndex
6050: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6060: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6070: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6080: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
6090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
60a0: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
60b0: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62  testing */.  Tab
60c0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
60d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
60e0: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
60f0: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
6100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6110: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6120: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   pTab */.  ExprL
6130: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
6140: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
6150: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
6160: 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20  nt nEqCol,      
6170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6180: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
6190: 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72  s with == constr
61a0: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
61b0: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
61c0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
61d0: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
61e0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  SC */.){.  int i
61f0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
6200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6210: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
6220: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d   int sortOrder =
6230: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 20   SQLITE_SO_ASC; 
6240: 20 2f 2a 20 57 68 69 63 68 20 64 69 72 65 63 74   /* Which direct
6250: 69 6f 6e 20 77 65 20 61 72 65 20 73 6f 72 74 69  ion we are sorti
6260: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  ng */.  int nTer
6270: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6290: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
62a0: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
62b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
62c0: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65  Term;    /* A te
62d0: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
62e0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  BY clause */.  s
62f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6300: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
6310: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
6320: 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  );.  nTerm = pOr
6330: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
6340: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
6350: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
6360: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
6370: 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
6380: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
6390: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
63a0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c   */.  for(i=j=0,
63b0: 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
63c0: 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69  >a; j<nTerm && i
63d0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
63e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
63f0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
6400: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
6410: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
6420: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
6430: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
6440: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
6450: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
6460: 72 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20  r */..    pExpr 
6470: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
6480: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
6490: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
64a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62  pExpr->iTable!=b
64b0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ase ){.      /* 
64c0: 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69  Can not use an i
64d0: 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79  ndex sort on any
64e0: 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  thing that is no
64f0: 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  t a column in th
6500: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d  e.      ** left-
6510: 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68  most table of th
6520: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6530: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6540: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
6550: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6560: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6570: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
6580: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
6590: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
65a0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
65b0: 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn!=pIdx->aiCo
65c0: 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f 6c 6c  lumn[i] || pColl
65d0: 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  !=pIdx->keyInfo.
65e0: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
65f0: 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74    /* Term j of t
6600: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
6610: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
6620: 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68  h column i of th
6630: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
6640: 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b   if( i<nEqCol ){
6650: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
6660: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  n index column t
6670: 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
6680: 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74  ed by == fails t
6690: 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20  o match an.     
66a0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74     ** ORDER BY t
66b0: 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e  erm, that is OK.
66c0: 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68    Just ignore th
66d0: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  at column of the
66e0: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a   index.        *
66f0: 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
6700: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
6710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
6720: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
6730: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
6740: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61  d is not constra
6750: 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20  ined by ==.     
6760: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69     ** then the i
6770: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  ndex cannot sati
6780: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
6790: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
67a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
67b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
67c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
67d0: 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i>nEqCol ){.    
67e0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 73 6f 72    if( pTerm->sor
67f0: 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65  tOrder!=sortOrde
6800: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
6810: 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79  Indices can only
6820: 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20   be used if all 
6830: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70  ORDER BY terms p
6840: 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  ast the.        
6850: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
6860: 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20  traints are all 
6870: 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41  either DESC or A
6880: 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  SC. */.        r
6890: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
68a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
68b0: 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 54    sortOrder = pT
68c0: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
68d0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
68e0: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     pTerm++;.  }.
68f0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
6900: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
6910: 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74  sorting if all t
6920: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
6930: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
6940: 20 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20 20   are covered..  
6950: 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  */.  if( j>=nTer
6960: 6d 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  m ){.    *pbRev 
6970: 3d 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  = sortOrder==SQL
6980: 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 20  ITE_SO_DESC;.   
6990: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
69a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
69b0: 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20  .** Check table 
69c0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52  to see if the OR
69d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
69e0: 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65   pOrderBy can be
69f0: 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
6a00: 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65   sorting in orde
6a10: 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74  r of ROWID.  Ret
6a20: 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61  urn true if so a
6a30: 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f  nd set *pbRev to
6a40: 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20   be.** true for 
6a50: 72 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e  reverse ROWID an
6a60: 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77  d false for forw
6a70: 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e  ard ROWID order.
6a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6a90: 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a  ortableByRowid(.
6aa0: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
6ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
6ac0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
6ad0: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
6ae0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
6af0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
6b00: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
6b10: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
6b20: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
6b30: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
6b40: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
6b50: 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  SC */.){.  Expr 
6b60: 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *p;..  assert( p
6b70: 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
6b80: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
6b90: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70  ->nExpr>0 );.  p
6ba0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   = pOrderBy->a[0
6bb0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
6bc0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
6bd0: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61  && p->iTable==ba
6be0: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
6bf0: 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70 62 52  ==-1 ){.    *pbR
6c00: 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  ev = pOrderBy->a
6c10: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
6c20: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6c30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6c40: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
6c50: 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f  crude estimate o
6c60: 66 20 74 68 65 20 6c 6f 67 6f 72 69 74 68 6d 20  f the logorithm 
6c70: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
6c80: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ue..** The resul
6c90: 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65  ts need not be e
6ca0: 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f  xact.  This is o
6cb0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74  nly used for est
6cc0: 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  imating.** the t
6cd0: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72  otal cost of per
6ce0: 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e  forming operatin
6cf0: 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20  gs with O(logN) 
6d00: 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63  or O(NlogN).** c
6d10: 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61  omplexity.  Beca
6d20: 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20  use N is just a 
6d30: 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20  guess, it is no 
6d40: 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66  great tragedy if
6d50: 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69  .** logN is a li
6d60: 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  ttle off..*/.sta
6d70: 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f  tic double estLo
6d80: 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64  g(double N){.  d
6d90: 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 2e 30  ouble logN = 1.0
6da0: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
6db0: 30 2e 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e  0.0;.  while( N>
6dc0: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
6dd0: 20 31 2e 30 3b 0a 20 20 20 20 78 20 2a 3d 20 31   1.0;.    x *= 1
6de0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6df0: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  logN;.}../*.** F
6e00: 69 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64  ind the best ind
6e10: 65 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  ex for accessing
6e20: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
6e30: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ble.  Return a p
6e40: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6e50: 20 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68   index, flags th
6e60: 61 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20  at describe how 
6e70: 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
6e80: 20 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a   be used, the.**
6e90: 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
6ea0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
6eb0: 20 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20   and the "cost" 
6ec0: 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  for this index..
6ed0: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
6ee0: 20 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73   cost index wins
6ef0: 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
6f00: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
6f10: 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
6f20: 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
6f30: 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  need to process 
6f40: 74 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e  the request usin
6f50: 67 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69  g the selected i
6f60: 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  ndex..** Factors
6f70: 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
6f80: 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
6f90: 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
6fa0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
6fb0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
6fc0: 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
6fd0: 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
6fe0: 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
6ff0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
7000: 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
7010: 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
7020: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
7030: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
7040: 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
7050: 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
7060: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
7070: 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
7080: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  table..**.*/.sta
7090: 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49  tic double bestI
70a0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
70b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
70c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
70d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
70e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
70f0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
7100: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
7110: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7120: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
7130: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
7140: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
7150: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
7160: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
7170: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
7180: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
7190: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
71a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
71b0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
71c0: 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
71d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
71e0: 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20   **ppIndex,     
71f0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a         /* Make *
7200: 70 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f  ppIndex point to
7210: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
7220: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73  */.  int *pFlags
7230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7240: 20 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65   /* Put flags de
7250: 73 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68  scribing this ch
7260: 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20  oice in *pFlags 
7270: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20  */.  int *pnEq  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62   /* Put the numb
72a0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
72b0: 6f 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20  onstraints here 
72c0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
72d0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65  m *pTerm;.  Inde
72e0: 78 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20  x *bestIdx = 0; 
72f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
7300: 20 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20   that gives the 
7310: 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20  lowest cost */. 
7320: 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f   double lowestCo
7330: 73 74 20 3d 20 31 2e 30 65 39 39 3b 20 2f 2a 20  st = 1.0e99; /* 
7340: 54 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  The cost of usin
7350: 67 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69  g bestIdx */.  i
7360: 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30  nt bestFlags = 0
7370: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
7380: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
7390: 69 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20  ith bestIdx */. 
73a0: 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30   int bestNEq = 0
73b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
73c0: 42 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e  Best value for n
73d0: 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  Eq */.  int iCur
73e0: 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
73f0: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
7400: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
7410: 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
7420: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
7430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7440: 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
7450: 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
7460: 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20    int rev;      
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7480: 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e   True to scan in
7490: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
74a0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
74d0: 74 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20  ted with pProbe 
74e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  */.  int nEq;   
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
7510: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
7520: 74 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63  ts */.  double c
7530: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
7540: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75      /* Cost of u
7550: 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a  sing pProbe */..
7560: 20 20 54 52 41 43 45 28 28 22 62 65 73 74 49 6e    TRACE(("bestIn
7570: 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52  dex: tbl=%s notR
7580: 65 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63  eady=%x\n", pSrc
7590: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  ->pTab->zName, n
75a0: 6f 74 52 65 61 64 79 29 29 3b 0a 0a 20 20 2f 2a  otReady));..  /*
75b0: 20 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77   Check for a row
75c0: 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64  id=EXPR or rowid
75d0: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
75e0: 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65  aints.  */.  pTe
75f0: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
7600: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
7610: 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
7620: 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IN, 0);.  if( pT
7630: 65 72 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20  erm ){.    Expr 
7640: 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49  *pExpr;.    *ppI
7650: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65  ndex = 0;.    be
7660: 73 74 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  stFlags = WHERE_
7670: 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66  ROWID_EQ;.    if
7680: 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f  ( pTerm->operato
7690: 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20  r & WO_EQ ){.   
76a0: 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73     /* Rowid== is
76b0: 20 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74   always the best
76c0: 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20   pick.  Look no 
76d0: 66 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73  further.  Becaus
76e0: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
76f0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20  a single row is 
7700: 67 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75  generated, outpu
7710: 74 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73  t is always in s
7720: 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
7730: 20 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57       *pFlags = W
7740: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20  HERE_ROWID_EQ | 
7750: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
7760: 20 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20      *pnEq = 1;. 
7770: 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e       TRACE(("...
7780: 20 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e   best is rowid\n
7790: 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
77a0: 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n 0.0;.    }else
77b0: 20 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54   if( (pExpr = pT
77c0: 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69  erm->pExpr)->pLi
77d0: 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st!=0 ){.      /
77e0: 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54  * Rowid IN (LIST
77f0: 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e  ): cost is NlogN
7800: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
7810: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20  number of list. 
7820: 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
7830: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65  .  */.      lowe
7840: 73 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e  stCost = pExpr->
7850: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
7860: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a      lowestCost *
7870: 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43  = estLog(lowestC
7880: 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ost);.    }else{
7890: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  .      /* Rowid 
78a0: 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73  IN (SELECT): cos
78b0: 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
78c0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
78d0: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
78e0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
78f0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c  of the inner sel
7900: 65 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f  ect.  We have no
7910: 20 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65   way to estimate
7920: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76  .      ** that v
7930: 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77  alue so make a w
7940: 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20  ild guess. */.  
7950: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
7960: 20 32 30 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20   200.0;.    }.  
7970: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f    TRACE(("... ro
7980: 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39  wid IN cost: %.9
7990: 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74  g\n", lowestCost
79a0: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73  ));.  }..  /* Es
79b0: 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20  timate the cost 
79c0: 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  of a table scan.
79d0: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b    If we do not k
79e0: 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a  now how many.  *
79f0: 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e  * entries are in
7a00: 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20   the table, use 
7a10: 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67  1 million as a g
7a20: 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 72  uess..  */.  pPr
7a30: 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  obe = pSrc->pTab
7a40: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f 73 74  ->pIndex;.  cost
7a50: 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f   = pProbe ? pPro
7a60: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  be->aiRowEst[0] 
7a70: 3a 20 31 30 30 30 30 30 30 2e 30 3b 0a 20 20 54  : 1000000.0;.  T
7a80: 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
7a90: 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
7aa0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
7ab0: 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52  ;.  flags = WHER
7ac0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a  E_ROWID_RANGE;..
7ad0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
7ae0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20  onstraints on a 
7af0: 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20  range of rowids 
7b00: 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  in a table scan.
7b10: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
7b20: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
7b30: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
7b40: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
7b50: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
7b60: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
7b70: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
7b80: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
7b90: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
7ba0: 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
7bb0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
7bc0: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
7bd0: 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 20   cost *= 0.333; 
7be0: 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
7bf0: 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e  owid<EXPR elimin
7c00: 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
7c10: 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d  or rows */.    }
7c20: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
7c30: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
7c40: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
7c50: 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_GE, 0) ){.  
7c60: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
7c70: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
7c80: 20 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33      cost *= 0.33
7c90: 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
7ca0: 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69  t rowid>EXPR eli
7cb0: 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
7cc0: 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  ds of rows */.  
7cd0: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
7ce0: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
7cf0: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
7d00: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
7d10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
7d20: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ags = 0;.  }..  
7d30: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
7d40: 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61  scan does not sa
7d50: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
7d60: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
7d70: 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73  ase.  ** the cos
7d80: 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
7d90: 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
7da0: 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
7db0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
7dc0: 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c  .    if( sortabl
7dd0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
7de0: 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29 20 29  OrderBy, &rev) )
7df0: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
7e00: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57   WHERE_ORDERBY|W
7e10: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
7e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20  ;.      if( rev 
7e30: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
7e40: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
7e50: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
7e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74  else{.      cost
7e70: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
7e80: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52 41  cost);.      TRA
7e90: 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
7ea0: 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
7eb0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
7ec0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
7ed0: 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43  if( cost<lowestC
7ee0: 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73  ost ){.    lowes
7ef0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
7f00: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c    bestFlags = fl
7f10: 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ags;.  }..  /* L
7f20: 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
7f30: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  x..  */.  for(; 
7f40: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
7f50: 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
7f60: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
7f90: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  */.    double in
7fa0: 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 2e 30  Multiplier = 1.0
7fb0: 3b 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e  ;..    TRACE((".
7fc0: 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c  .. index %s:\n",
7fd0: 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29   pProbe->zName))
7fe0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
7ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
8000: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
8010: 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69  ex that are sati
8020: 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sfied.    ** by 
8030: 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  x=EXPR constrain
8040: 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  ts or x IN (...)
8050: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
8060: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d    */.    flags =
8070: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
8080: 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
8090: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
80a0: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
80b0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
80c0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
80d0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
80e0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
80f0: 51 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29  Q|WO_IN, pProbe)
8100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
8110: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
8120: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8130: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
8140: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f      if( pTerm->o
8150: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
8160: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
8170: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
8180: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66  pExpr;.        f
8190: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
81a0: 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
81b0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
81c0: 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect!=0 ){.      
81d0: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
81e0: 20 2a 3d 20 31 30 30 2e 30 3b 0a 20 20 20 20 20   *= 100.0;.     
81f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8200: 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  pr->pList!=0 ){.
8210: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
8220: 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d  iplier *= pExpr-
8230: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  >pList->nExpr + 
8240: 31 2e 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1.0;.        }. 
8250: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8260: 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e   cost = pProbe->
8270: 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e  aiRowEst[i] * in
8280: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74  Multiplier * est
8290: 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72  Log(inMultiplier
82a0: 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a  );.    nEq = i;.
82b0: 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
82c0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
82d0: 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
82e0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
82f0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71  .         && nEq
8300: 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  ==pProbe->nColum
8310: 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  n ){.      flags
8320: 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
8330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
8340: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25  E(("...... nEq=%
8350: 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f  d inMult=%.9g co
8360: 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c  st=%.9g\n", nEq,
8370: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63   inMultiplier, c
8380: 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ost));..    /* L
8390: 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f  ook for range co
83a0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f  nstraints.    */
83b0: 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
83c0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
83d0: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
83e0: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
83f0: 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
8400: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
8410: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
8420: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
8430: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
8440: 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
8450: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  pTerm ){.       
8460: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
8470: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
8480: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
8490: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
84a0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
84b0: 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20  |WO_LE, pProbe) 
84c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
84d0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
84e0: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
84f0: 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 0a   cost *= 0.333;.
8500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8510: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
8520: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
8530: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
8540: 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  GE, pProbe) ){. 
8550: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
8560: 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
8570: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
8580: 74 20 2a 3d 20 30 2e 33 33 33 3b 0a 20 20 20 20  t *= 0.333;.    
8590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52      }.        TR
85a0: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e  ACE(("...... ran
85b0: 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ge reduces cost 
85c0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
85d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
85e0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
85f0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73  e additional cos
8600: 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20  t of sorting if 
8610: 74 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72  that is a factor
8620: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
8630: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
8640: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
8650: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
8660: 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
8670: 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78    isSortingIndex
8680: 28 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 70  (pParse,pProbe,p
8690: 53 72 63 2d 3e 70 54 61 62 2c 69 43 75 72 2c 70  Src->pTab,iCur,p
86a0: 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76  OrderBy,nEq,&rev
86b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
86c0: 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20   flags==0 ){.   
86d0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
86e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
86f0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
8700: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8710: 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
8720: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
8730: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
8740: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
8750: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8770: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
8780: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
8790: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e      TRACE(("....
87a0: 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65  .. orderby incre
87b0: 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
87c0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
87d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
87e0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
87f0: 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61   if we can get a
8800: 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a  way with using j
8810: 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69  ust the index wi
8820: 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65  thout.    ** eve
8830: 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61  r reading the ta
8840: 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73  ble.  If that is
8850: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
8860: 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a  halve the.    **
8870: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e   cost of this in
8880: 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
8890: 69 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72  if( flags && pSr
88a0: 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28  c->colUsed < (((
88b0: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
88c0: 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69  -1)) ){.      Bi
88d0: 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
88e0: 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
88f0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
8900: 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e  j=0; j<pProbe->n
8910: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
8920: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
8930: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  robe->aiColumn[j
8940: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
8950: 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
8960: 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
8970: 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
8980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8990: 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
89a0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
89b0: 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
89c0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2a  ;.        cost *
89d0: 3d 20 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 54  = 0.5;.        T
89e0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64  RACE(("...... id
89f0: 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63  x-only reduces c
8a00: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
8a10: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
8a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
8a30: 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20   this index has 
8a40: 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77  achieved the low
8a50: 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c  est cost so far,
8a60: 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20   then use it..  
8a70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73    */.    if( cos
8a80: 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29  t < lowestCost )
8a90: 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20  {.      bestIdx 
8aa0: 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20  = pProbe;.      
8ab0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
8ac0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
8ad0: 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20   flags!=0 );.   
8ae0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
8af0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74  lags;.      best
8b00: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d  NEq = nEq;.    }
8b10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
8b20: 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  t the best resul
8b30: 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65  t.  */.  *ppInde
8b40: 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54  x = bestIdx;.  T
8b50: 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65  RACE(("best inde
8b60: 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e  x is %s, cost=%.
8b70: 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45  9g, flags=%x, nE
8b80: 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  q=%d\n",.       
8b90: 20 62 65 73 74 49 64 78 20 3f 20 62 65 73 74 49   bestIdx ? bestI
8ba0: 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f  dx->zName : "(no
8bb0: 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74  ne)", lowestCost
8bc0: 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73  , bestFlags, bes
8bd0: 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67  tNEq));.  *pFlag
8be0: 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20  s = bestFlags;. 
8bf0: 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71   *pnEq = bestNEq
8c00: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73  ;.  return lowes
8c10: 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tCost;.}.../*.**
8c20: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
8c30: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
8c40: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
8c50: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
8c60: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
8c70: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
8c80: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
8c90: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
8ca0: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
8cb0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
8cc0: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
8cd0: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
8ce0: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
8cf0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
8d00: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
8d10: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
8d20: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
8d30: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
8d40: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
8d50: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
8d60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
8d70: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
8d80: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
8d90: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
8da0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
8db0: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
8dc0: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
8dd0: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
8de0: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
8df0: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
8e00: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
8e10: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
8e20: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
8e30: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
8e40: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
8e50: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
8e60: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
8e70: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
8e80: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
8e90: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
8ea0: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
8eb0: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
8ec0: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
8ed0: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
8ee0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
8ef0: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
8f00: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
8f10: 69 6f 6e 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  ion.  We would g
8f20: 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  et the correct.*
8f30: 2a 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  * results if not
8f40: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
8f50: 69 73 61 62 6c 65 64 2c 20 62 75 74 20 6a 6f 69  isabled, but joi
8f60: 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
8f70: 69 74 74 6c 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e  ittle.** slower.
8f80: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
8f90: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
8fa0: 68 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  h as we can with
8fb0: 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 0a 2a 2a  out disabling.**
8fc0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
8fd0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
8fe0: 29 2c 20 77 65 27 64 20 67 65 74 20 74 68 65 20  ), we'd get the 
8ff0: 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 0a 2a 2a  wrong answer..**
9000: 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
9010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9020: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
9030: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
9040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
9050: 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
9060: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
9070: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
9080: 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
9090: 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
90a0: 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
90b0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
90c0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
90d0: 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
90e0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
90f0: 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
9100: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
9110: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
9120: 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
9130: 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
9140: 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
9150: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
9160: 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
9170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
9180: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
9190: 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
91a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
91b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
91c0: 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61  de that builds a
91d0: 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e   probe for an in
91e0: 64 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a  dex.  Details:.*
91f0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b  *.**    *  Check
9200: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
9210: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20   entries on the 
9220: 73 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a  stack.  If any.*
9230: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  *       of those
9240: 20 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c   entries are NUL
9250: 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  L, jump immediat
9260: 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20  ely to brk,.**  
9270: 20 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68       which is th
9280: 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e  e loop exit, sin
9290: 63 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72  ce no index entr
92a0: 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20  y will match.** 
92b0: 20 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72        if any par
92c0: 74 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  t of the key is 
92d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  NULL..**.**    *
92e0: 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72    Construct a pr
92f0: 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  obe entry from t
9300: 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65  he top nColumn e
9310: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20  ntries in.**    
9320: 20 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74     the stack wit
9330: 68 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70  h affinities app
9340: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
9350: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
9360: 69 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64  ic void buildInd
9370: 65 78 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c  exProbe(Vdbe *v,
9380: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e   int nColumn, in
9390: 74 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49  t brk, Index *pI
93a0: 64 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx){.  sqlite3Vd
93b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
93c0: 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c  tNull, -nColumn,
93d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
93e0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
93f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9400: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
9410: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  lumn, 0);.  sqli
9420: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9430: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29  OP_Goto, 0, brk)
9440: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9450: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
9460: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
9470: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64  0);.  sqlite3Ind
9480: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
9490: 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pIdx);.}.../*.*
94a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
94b0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
94c0: 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
94d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
94e0: 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
94f0: 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
9500: 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
9510: 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
9520: 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
9530: 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
9540: 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
9550: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
9560: 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
9570: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
9580: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
9590: 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
95a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
95b0: 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
95c0: 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
95d0: 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
95e0: 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
95f0: 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
9600: 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
9610: 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
9620: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
9630: 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
9640: 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
9650: 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
9660: 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
9670: 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c  c void codeEqual
9680: 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
9690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
96a0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
96b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
96c0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
96d0: 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
96e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
96f0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
9700: 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20  int brk,        
9710: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
9720: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
9730: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c  loop */.  WhereL
9740: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a  evel *pLevel  /*
9750: 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
9760: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
9770: 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
9780: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
9790: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
97a0: 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d  ;.  if( pX->op!=
97b0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
97c0: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
97d0: 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  EQ );.    sqlite
97e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
97f0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23  , pX->pRight);.#
9800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9810: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
9820: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61  lse{.    int iTa
9830: 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b  b;.    int *aIn;
9840: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
9850: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
9860: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
9870: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
9880: 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20  pX);.    iTab = 
9890: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
98a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
98b0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
98c0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56  Tab, brk);.    V
98d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
98e0: 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61  # %.*s", pX->spa
98f0: 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29  n.n, pX->span.z)
9900: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  );.    pLevel->n
9910: 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
9920: 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 61 49 6e 20  ->aInLoop = aIn 
9930: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
9940: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c  pLevel->aInLoop,
9950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
9980: 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a 70  >aInLoop[0])*3*p
9990: 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20  Level->nIn);.   
99a0: 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20   if( aIn ){.    
99b0: 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    aIn += pLevel-
99c0: 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20  >nIn*3 - 3;.    
99d0: 20 20 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65    aIn[0] = OP_Ne
99e0: 78 74 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d  xt;.      aIn[1]
99f0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61   = iTab;.      a
9a00: 49 6e 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 56  In[2] = sqlite3V
9a10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
9a20: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b  olumn, iTab, 0);
9a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9a40: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20    pLevel->nIn = 
9a50: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
9a60: 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
9a70: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
9a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
9a90: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
9aa0: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
9ab0: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
9ac0: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
9ad0: 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
9ae0: 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
9af0: 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
9b00: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
9b10: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
9b20: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
9b30: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
9b40: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
9b50: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
9b60: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9b70: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
9b80: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
9b90: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
9ba0: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
9bb0: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
9bc0: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
9bd0: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
9be0: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
9bf0: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
9c00: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
9c10: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
9c20: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
9c30: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
9c40: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
9c50: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
9c60: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
9c70: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
9c80: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
9c90: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
9ca0: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
9cb0: 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
9cc0: 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
9cd0: 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
9ce0: 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
9cf0: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
9d00: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
9d10: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
9d20: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
9d30: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
9d40: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
9d50: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
9d60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
9d70: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
9d80: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
9d90: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
9da0: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
9db0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
9dc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9dd0: 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
9de0: 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
9df0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
9e00: 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64  d puts.** the ad
9e10: 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65  dress of that me
9e20: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65  mory cell in pLe
9e30: 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20  vel->iMem.  The 
9e40: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
9e50: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
9e60: 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d  will use pLevel-
9e70: 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74  >iMem to store t
9e80: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
9e90: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
9ea0: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
9eb0: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
9ec0: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
9ed0: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
9ee0: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
9ef0: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
9f00: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
9f10: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
9f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f30: 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
9f40: 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
9f50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
9f60: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9f70: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
9f80: 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
9f90: 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
9fa0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
9fb0: 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
9fc0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9fd0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
9fe0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42  RE clause */.  B
9ff0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
a000: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61       /* Which pa
a010: 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65  rts of FROM have
a020: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
a030: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ded */.  int brk
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a050: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
a060: 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29  nd the loop */.)
a070: 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
a080: 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20  evel->nEq;      
a090: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
a0a0: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
a0b0: 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
a0c0: 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e  */.  int termsIn
a0d0: 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Mem = 0;        
a0e0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
a0f0: 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65  tore value in me
a100: 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56  m[] cells */.  V
a110: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a120: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
a130: 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
a140: 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
a150: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
a160: 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  x *pIdx = pLevel
a170: 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65  ->pIdx;   /* The
a180: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
a190: 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
a1a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
a1b0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
a1c0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
a1d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
a1e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a1f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
a200: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e   /* A single con
a210: 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a  straint term */.
a220: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
a250: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
a260: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d  out how many mem
a270: 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c  ory cells we wil
a280: 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f  l need then allo
a290: 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20  cate them..  ** 
a2a0: 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61  We always need a
a2b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64  t least one used
a2c0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f   to store the lo
a2d0: 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20  op terminator.  
a2e0: 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  ** value.  If th
a2f0: 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61  ere are IN opera
a300: 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20  tors we'll need 
a310: 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20  one for each == 
a320: 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74  or.  ** IN const
a330: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c  raint..  */.  pL
a340: 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
a350: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69  rse->nMem++;.  i
a360: 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
a370: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
a380: 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  IN ){.    pParse
a390: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c  ->nMem += pLevel
a3a0: 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73  ->nEq;.    terms
a3b0: 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a  InMem = 1;.  }..
a3c0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
a3d0: 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
a3e0: 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f  raints.  */.  fo
a3f0: 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
a400: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
a410: 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
a420: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
a430: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
a440: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
a450: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
a460: 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20  WO_IN, pIdx);.  
a470: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
a480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
a490: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
a4a0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
a4b0: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71  =0 );.    codeEq
a4c0: 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
a4d0: 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70  e, pTerm, brk, p
a4e0: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Level);.    if( 
a4f0: 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20  termsInMem ){.  
a500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a510: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
a520: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
a530: 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d  m+j+1, 1);.    }
a540: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
a550: 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==nEq );..  /* M
a560: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
a570: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
a580: 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f  es are on the to
a590: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20  p of the stack. 
a5a0: 20 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49   */.  if( termsI
a5b0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  nMem ){.    for(
a5c0: 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
a5d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a5e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a5f0: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
a600: 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20  iMem+j+1, 0);.  
a610: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65    }.  }.}..#ifde
a620: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
a630: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a640: 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
a650: 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
a660: 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
a670: 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
a680: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
a690: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
a6a0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
a6b0: 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
a6c0: 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
a6d0: 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
a6e0: 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
a6f0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
a700: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
a710: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
a720: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
a730: 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
a740: 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
a750: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
a760: 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
a770: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a780: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
a790: 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
a7a0: 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
a7b0: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
a7c0: 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /..../*.** Gener
a7d0: 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
a7e0: 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
a7f0: 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
a800: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
a810: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
a820: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
a830: 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
a840: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
a850: 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
a860: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
a870: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
a880: 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
a890: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
a8a0: 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
a8b0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
a8c0: 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
a8d0: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
a8e0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
a8f0: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
a900: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a910: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
a920: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a930: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
a940: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
a950: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
a960: 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
a970: 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
a980: 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
a990: 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
a9a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
a9b0: 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
a9c0: 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
a9d0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
a9e0: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
a9f0: 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
aa00: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
aa10: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
aa20: 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
aa30: 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
aa40: 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
aa50: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
aa60: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
aa70: 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
aa80: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
aa90: 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
aaa0: 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
aab0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
aac0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
aad0: 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
aae0: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
aaf0: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
ab00: 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
ab10: 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
ab20: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
ab30: 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
ab40: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
ab50: 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
ab60: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
ab70: 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
aba0: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
abb0: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
abc0: 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
abd0: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
abe0: 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
ac10: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
ac20: 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
ac30: 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
ac40: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
ac50: 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
ac60: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ac70: 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
ac80: 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
ac90: 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
aca0: 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
acb0: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
acc0: 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
acd0: 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
ace0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
acf0: 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
ad00: 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
ad10: 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
ad20: 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
ad30: 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
ad40: 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
ad50: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
ad60: 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
ad70: 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
ad80: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
ad90: 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
ada0: 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
adb0: 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
adc0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
add0: 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
ade0: 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
adf0: 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
ae00: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
ae10: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
ae20: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
ae30: 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
ae40: 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
ae50: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
ae60: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
ae70: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
ae80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
ae90: 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
aea0: 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
aeb0: 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
aec0: 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
aed0: 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
aee0: 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
aef0: 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
af00: 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
af10: 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
af20: 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
af30: 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
af40: 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
af50: 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
af60: 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
af70: 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
af80: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
af90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
afa0: 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
afb0: 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
afc0: 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
afd0: 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
afe0: 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
aff0: 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
b000: 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
b010: 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
b020: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
b030: 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
b040: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
b050: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
b060: 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
b070: 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
b080: 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
b090: 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
b0a0: 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
b0b0: 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
b0c0: 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
b0d0: 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
b0e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
b0f0: 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
b100: 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
b110: 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
b120: 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
b130: 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
b140: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
b150: 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
b160: 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
b170: 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
b180: 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
b190: 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
b1a0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
b1b0: 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
b1c0: 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
b1d0: 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
b1e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
b1f0: 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
b200: 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
b210: 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
b220: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
b230: 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
b240: 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
b250: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
b260: 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
b270: 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
b280: 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
b290: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
b2a0: 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
b2b0: 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
b2c0: 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
b2d0: 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
b2e0: 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
b2f0: 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
b300: 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
b310: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
b320: 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
b330: 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
b340: 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
b350: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
b360: 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
b370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
b380: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
b390: 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
b3a0: 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
b3b0: 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
b3c0: 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
b3d0: 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
b3e0: 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
b3f0: 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
b400: 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
b410: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
b420: 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
b430: 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
b440: 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
b450: 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
b460: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
b470: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
b480: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
b490: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
b4a0: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
b4b0: 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
b4c0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
b4d0: 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
b4e0: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
b4f0: 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
b500: 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
b510: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
b520: 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
b530: 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
b540: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
b550: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
b560: 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
b570: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b580: 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
b590: 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
b5a0: 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
b5b0: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
b5c0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
b5d0: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
b5e0: 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
b5f0: 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
b600: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b610: 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
b620: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
b630: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
b640: 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
b650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b660: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
b670: 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
b680: 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
b690: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
b6a0: 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
b6b0: 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
b6c0: 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
b6d0: 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
b6e0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
b6f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b700: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
b710: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
b720: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
b730: 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
b740: 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
b750: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
b760: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
b770: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
b780: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
b790: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
b7a0: 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20  pOrderBy  /* An 
b7b0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
b7c0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
b7d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b7f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b800: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
b810: 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
b820: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
b830: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
b840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
b850: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b860: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
b870: 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
b880: 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
b890: 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d   int brk, cont =
b8a0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
b8b0: 64 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75  ddresses used du
b8c0: 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
b8d0: 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
b8e0: 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
b8f0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
b900: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
b910: 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
b920: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
b930: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  m;          /* A
b940: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   single term in 
b950: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
b960: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
b970: 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  t maskSet;      
b980: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b990: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
b9a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b9c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b9d0: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
b9e0: 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  these terms */. 
b9f0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ba00: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
ba10: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
ba20: 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
ba30: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
ba40: 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
ba50: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
ba60: 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
ba70: 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
ba80: 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
bab0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
bac0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
bad0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
bae0: 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
baf0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
bb00: 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f   wc.a[].flags */
bb10: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
bb20: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
bb30: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
bb40: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
bb50: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
bb60: 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
bb70: 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
bb80: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
bb90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bba0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bbb0: 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
bbc0: 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
bbd0: 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
bbe0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c  0;.  }..  /* Spl
bbf0: 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
bc00: 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
bc10: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
bc20: 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
bc30: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
bc40: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
bc50: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
bc60: 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
bc70: 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20  et(&maskSet);.  
bc80: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
bc90: 26 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  &wc, pParse);.  
bca0: 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20  whereSplit(&wc, 
bcb0: 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
bcc0: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .    .  /* Alloc
bcd0: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
bce0: 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
bcf0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bd00: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
bd10: 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
bd20: 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  e..  */.  pWInfo
bd30: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
bd40: 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66   sizeof(WhereInf
bd50: 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e  o) + pTabList->n
bd60: 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  Src*sizeof(Where
bd70: 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73  Level));.  if( s
bd80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
bd90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
bda0: 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d   whereBeginNoMem
bdb0: 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
bdc0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
bdd0: 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
bde0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
bdf0: 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
be00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
be10: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
be20: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
be30: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
be40: 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
be50: 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
be60: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
be70: 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
be80: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
be90: 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
bea0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
beb0: 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74  ere && (pTabList
bec0: 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->nSrc==0 || sql
bed0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
bee0: 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  nt(pWhere)) ){. 
bef0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
bf00: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
bf10: 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
bf20: 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57  reak, 1);.    pW
bf30: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
bf40: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
bf50: 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
bf60: 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
bf70: 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
bf80: 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
bf90: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
bfa0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
bfb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
bfc0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
bfd0: 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
bfe0: 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
bff0: 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
c000: 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
c010: 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
c020: 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
c030: 68 61 74 20 74 68 65 79 20 61 64 64 65 64 20 76  hat they added v
c040: 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
c050: 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
c060: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
c070: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
c080: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72  rc; i++){.    cr
c090: 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65  eateMask(&maskSe
c0a0: 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
c0b0: 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
c0c0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
c0d0: 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b  (pTabList, &mask
c0e0: 53 65 74 2c 20 26 77 63 29 3b 0a 20 20 69 66 28  Set, &wc);.  if(
c0f0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
c100: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  failed ){.    go
c110: 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
c120: 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  em;.  }..  /* Ch
c130: 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64  ose the best ind
c140: 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  ex to use for ea
c150: 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
c160: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
c170: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
c180: 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f   fills in the fo
c190: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
c1a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e    **.  **   pWIn
c1b0: 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20  fo->a[].pIdx    
c1c0: 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75    The index to u
c1d0: 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65  se for this leve
c1e0: 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  l of the loop.. 
c1f0: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
c200: 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52  ].flags     WHER
c210: 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f  E_xxx flags asso
c220: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
c230: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
c240: 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68  a[].nEq       Th
c250: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61  e number of == a
c260: 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
c270: 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  s.  **   pWInfo-
c280: 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57  >a[].iFrom     W
c290: 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20  hen term of the 
c2a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
c2b0: 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
c2c0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
c2d0: 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
c2e0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
c2f0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
c300: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
c310: 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
c320: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
c330: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20  the index.  **. 
c340: 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
c350: 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
c360: 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
c370: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
c380: 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
c390: 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
c3a0: 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
c3b0: 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
c3c0: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
c3d0: 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
c3e0: 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
c3f0: 7e 30 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f  ~0;.  for(i=iFro
c400: 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  m=0, pLevel=pWIn
c410: 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
c420: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
c430: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
c440: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
c450: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c460: 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
c470: 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
c480: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20      int flags;  
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69  /* Flags asssoci
c4b0: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
c4c0: 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20  /.    int nEq;  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
c4f0: 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
c500: 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  nts */.    doubl
c510: 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
c520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
c530: 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  st for pIdx */. 
c540: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c560: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
c570: 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
c580: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65  /.    Index *pBe
c590: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
c5a0: 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e    /* The best in
c5b0: 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20  dex seen so far 
c5c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46  */.    int bestF
c5d0: 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
c5e0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
c5f0: 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
c600: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  t */.    int bes
c610: 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20  tNEq = 0;       
c620: 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f       /* nEq asso
c630: 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
c640: 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  t */.    double 
c650: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 31 2e 30  lowestCost = 1.0
c660: 65 39 39 3b 20 2f 2a 20 43 6f 73 74 20 6f 66 20  e99; /* Cost of 
c670: 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20  the pBest */.   
c680: 20 69 6e 74 20 62 65 73 74 4a 3b 20 20 20 20 20   int bestJ;     
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6a0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
c6b0: 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
c6e0: 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
c6f0: 4a 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  J */..    for(j=
c700: 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d  iFrom, pTabItem=
c710: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
c720: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
c730: 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  c; j++, pTabItem
c740: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 67  ++){.      m = g
c750: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
c760: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
c770: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  or);.      if( (
c780: 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  m & notReady)==0
c790: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c7a0: 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
c7b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
c7c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
c7d0: 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49      cost = bestI
c7e0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63  ndex(pParse, &wc
c7f0: 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
c800: 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6a 3d               (j=
c820: 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29  =0 && ppOrderBy)
c830: 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
c840: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
c850: 20 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c            &pIdx,
c860: 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a   &flags, &nEq);.
c870: 20 20 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c        if( cost<l
c880: 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20  owestCost ){.   
c890: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
c8a0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  = cost;.        
c8b0: 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
c8c0: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
c8d0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
c8e0: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
c8f0: 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
c900: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
c910: 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e   if( (pTabItem->
c920: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
c930: 46 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  FT)!=0.         
c940: 7c 7c 20 28 6a 3e 30 20 26 26 20 28 70 54 61 62  || (j>0 && (pTab
c950: 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70  Item[-1].jointyp
c960: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 29  e & JT_LEFT)!=0)
c970: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
c980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c990: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
c9a0: 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52  bestFlags & WHER
c9b0: 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
c9c0: 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42  .      *ppOrderB
c9d0: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
c9e0: 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
c9f0: 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
ca00: 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74  el->flags = best
ca10: 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
ca20: 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b  l->pIdx = pBest;
ca30: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  .    pLevel->nEq
ca40: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20   = bestNEq;.    
ca50: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
ca60: 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
ca70: 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  >nIn = 0;.    if
ca80: 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
ca90: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
caa0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
cab0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
cac0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
cad0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
cae0: 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
caf0: 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
cb00: 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
cb10: 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
cb20: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
cb30: 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 0a  m = bestJ;.  }..
cb40: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
cb50: 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
cb60: 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
cb70: 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
cb80: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
cb90: 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
cba0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
cbb0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
cbc0: 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
cbd0: 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
cbe0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
cbf0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
cc00: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
cc10: 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
cc20: 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
cc30: 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
cc40: 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
cc50: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
cc60: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
cc70: 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
cc80: 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
cc90: 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
cca0: 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  /.  pLevel = pWI
ccb0: 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  nfo->a;.  for(i=
ccc0: 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
ccd0: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
cce0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
ccf0: 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
cd00: 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65   *pTab;.    Inde
cd10: 78 20 2a 70 49 78 3b 0a 20 20 20 20 69 6e 74 20  x *pIx;.    int 
cd20: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
cd30: 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20  ->iIdxCur;..    
cd40: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
cd50: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
cd60: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
cd70: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
cd80: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  b;.    if( pTab-
cd90: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20  >isTransient || 
cda0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
cdb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
cdc0: 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
cdd0: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
cde0: 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
cdf0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46  qlite3OpenTableF
ce00: 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 70 54 61  orReading(v, pTa
ce10: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
ce20: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
ce30: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
ce40: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
ce50: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
ce60: 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
ce70: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  x)!=0 ){.      s
ce80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
cea0: 49 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  Ix->iDb, 0);.   
ceb0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
cec0: 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e  v, "# %s", pIx->
ced0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
cee0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
cef0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
cf00: 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
cf10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf20: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
cf30: 49 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  Ix->keyInfo, P3_
cf40: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
cf50: 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
cf60: 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
cf70: 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  DX_ONLY)!=0 ){. 
cf80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
cfa0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43  umColumns, iIdxC
cfb0: 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e  ur, pIx->nColumn
cfc0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
cfd0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
cfe0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
cff0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20  Tab->iDb);.  }. 
d000: 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
d010: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d020: 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
d030: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
d040: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
d050: 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
d060: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
d070: 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
d080: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
d090: 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
d0a0: 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
d0b0: 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
d0c0: 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
d0d0: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
d0e0: 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
d0f0: 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
d100: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
d110: 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
d120: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74    int j;.    int
d130: 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
d140: 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54  ->iCursor;  /* T
d150: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
d160: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
d170: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
d180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
d190: 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
d1a0: 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
d1b0: 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f  iIdxCur;       /
d1c0: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
d1d0: 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
d1e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54  */.    int omitT
d1f0: 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75  able;     /* Tru
d200: 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
d210: 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
d220: 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
d230: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
d240: 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
d250: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
d260: 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65   */..    pTabIte
d270: 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
d280: 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
d290: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62  .    iCur = pTab
d2a0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
d2b0: 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
d2c0: 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78  ->pIdx;.    iIdx
d2d0: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
d2e0: 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20  dxCur;.    bRev 
d2f0: 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
d300: 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
d310: 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61  )!=0;.    omitTa
d320: 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  ble = (pLevel->f
d330: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
d340: 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20  _ONLY)!=0;..    
d350: 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
d360: 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
d370: 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
d380: 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
d390: 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
d3a0: 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
d3b0: 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20  to brk to break 
d3c0: 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
d3d0: 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f     ** Jump to co
d3e0: 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
d3f0: 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
d400: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
d410: 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  e.    ** loop.. 
d420: 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20     */.    brk = 
d430: 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71  pLevel->brk = sq
d440: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d450: 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20  el(v);.    cont 
d460: 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
d470: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d480: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
d490: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
d4a0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
d4b0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
d4c0: 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
d4d0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
d4e0: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
d4f0: 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
d500: 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
d510: 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
d520: 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
d530: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
d540: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d550: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
d560: 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d  && (pTabItem[-1]
d570: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
d580: 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  EFT)!=0 ){.     
d590: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d   if( !pParse->nM
d5a0: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
d5b0: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  m++;.      pLeve
d5c0: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70  l->iLeftJoin = p
d5d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
d5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
d600: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
d610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d620: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
d630: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
d640: 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 1);.      Vdb
d650: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
d660: 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
d670: 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
d680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
d690: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
d6a0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
d6b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
d6c0: 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
d6d0: 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
d6e0: 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
d6f0: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   an.      **    
d700: 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
d710: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
d720: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
d730: 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20  d.  Or.      ** 
d740: 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
d750: 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
d760: 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
d770: 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
d780: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
d790: 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20  onstruct..      
d7a0: 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  */.      pTerm =
d7b0: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
d7c0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
d7d0: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
d7e0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
d7f0: 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
d800: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
d810: 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
d820: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
d830: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
d840: 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73  iCur );.      as
d850: 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
d860: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
d870: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
d880: 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c  rse, pTerm, brk,
d890: 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
d8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8b0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d8c0: 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  , 1, brk);.     
d8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d8e0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  p(v, OP_NotExist
d8f0: 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  s, iCur, brk);. 
d900: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d910: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
d920: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
d930: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
d940: 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
d950: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
d960: 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
d970: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
d980: 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
d990: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
d9a0: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
d9b0: 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
d9c0: 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
d9d0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
d9e0: 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
d9f0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
da00: 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
da10: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
da20: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
da30: 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
da40: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
da50: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
da60: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
da70: 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64       pEnd = find
da80: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
da90: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
daa0: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
dab0: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
dac0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
dad0: 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   pStart;.       
dae0: 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
daf0: 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
db00: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
db10: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
db20: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
db30: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
db40: 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
db50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
db60: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
db70: 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
db80: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
db90: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
dba0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
dbb0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
dbc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dbd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dbe0: 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f  _ForceInt, pX->o
dbf0: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e  p==TK_LE || pX->
dc00: 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b  op==TK_GT, brk);
dc10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65  VdbeAddOp(v, bRe
dc30: 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20  v ? OP_MoveLt : 
dc40: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
dc50: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56   brk);.        V
dc60: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
dc70: 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64  pk"));.        d
dc80: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
dc90: 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
dca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcc0: 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  p(v, bRev ? OP_L
dcd0: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
dce0: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
dcf0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
dd00: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45  End ){.        E
dd10: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
dd20: 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
dd30: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
dd40: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
dd50: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
dd60: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
dd70: 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
dd80: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
dd90: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
dda0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
ddb0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
ddc0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
ddd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dde0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
ddf0: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
de00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
de10: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
de20: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
de30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
de40: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
de50: 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
de60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de70: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
de80: 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
de90: 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Gt;.        }.  
dea0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
deb0: 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
dec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ded0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
dee0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
def0: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
df00: 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
df10: 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
df20: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
df30: 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
df40: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
df50: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  ;.      if( test
df60: 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
df70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
df90: 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  wid, iCur, 0);. 
dfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dfb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
dfc0: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
dfd0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
dfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dff0: 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27  p(v, testOp, 'n'
e000: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
e010: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
e020: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e030: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
e040: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
e050: 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
e060: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
e070: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
e080: 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
e090: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
e0a0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
e0b0: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
e0c0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e0d0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
e0e0: 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
e0f0: 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
e100: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
e110: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
e120: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
e130: 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
e140: 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
e150: 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
e160: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e170: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
e180: 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
e190: 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
e1a0: 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
e1b0: 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
e1c0: 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
e1d0: 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
e1e0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
e1f0: 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
e200: 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
e210: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
e220: 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
e230: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
e240: 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
e250: 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
e260: 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
e270: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
e280: 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
e290: 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
e2a0: 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
e2b0: 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
e2c0: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
e2d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
e2e0: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
e2f0: 20 20 20 20 69 6e 74 20 6c 65 46 6c 61 67 3d 30      int leFlag=0
e300: 2c 20 67 65 46 6c 61 67 3d 30 3b 0a 20 20 20 20  , geFlag=0;.    
e310: 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20    int testOp;.  
e320: 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74      int topLimit
e330: 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
e340: 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
e350: 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  MIT)!=0;.      i
e360: 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70  nt btmLimit = (p
e370: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e380: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
e390: 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  =0;..      /* Ge
e3a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
e3b0: 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
e3c0: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
e3d0: 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
e3e0: 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74    ** and level t
e3f0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
e400: 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
e410: 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
e420: 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
e430: 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
e440: 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
e450: 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a  notReady, brk);.
e460: 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63  .      /* Duplic
e470: 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
e480: 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63   term values bec
e490: 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ause they will a
e4a0: 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75  ll be.      ** u
e4b0: 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20  sed twice: once 
e4c0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d  to make the term
e4d0: 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20  ination key and 
e4e0: 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  once to make the
e4f0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20  .      ** start 
e500: 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
e510: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
e520: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; j++){.      
e530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e540: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45  Op(v, OP_Dup, nE
e550: 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  q-1, 0);.      }
e560: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
e570: 61 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ate the terminat
e580: 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69  ion key.  This i
e590: 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
e5a0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  that.      ** wi
e5b0: 6c 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63  ll end the searc
e5c0: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
e5d0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20  termination key 
e5e0: 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  if there.      *
e5f0: 2a 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74  * are no equalit
e600: 79 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22  y terms and no "
e610: 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20  X<..." term..   
e620: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
e630: 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61  002-Dec-04: On a
e640: 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73   reverse-order s
e650: 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c  can, the so-call
e660: 65 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22  ed "termination"
e670: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f  .      ** key co
e680: 6d 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c  mputed here real
e690: 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
e6a0: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a   the start key..
e6b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e6c0: 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20  f( topLimit ){. 
e6d0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
e6e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
e6f0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e700: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
e710: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
e720: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
e730: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
e740: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
e750: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
e760: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
e770: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
e780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e790: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
e7a0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
e7b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e7c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e7d0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
e7e0: 20 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20         leFlag = 
e7f0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20  pX->op==TK_LE;. 
e800: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
e810: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
e820: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  );.        testO
e830: 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20  p = OP_IdxGE;.  
e840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e850: 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e     testOp = nEq>
e860: 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f  0 ? OP_IdxGE : O
e870: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
e880: 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  leFlag = 1;.    
e890: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
e8a0: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
e8b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
e8c0: 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
e8d0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  it;.        pLev
e8e0: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
e8f0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
e900: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
e910: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c  be(v, nCol, brk,
e920: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
e930: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
e940: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 6c        int op = l
e950: 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 4c  eFlag ? OP_MoveL
e960: 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  e : OP_MoveLt;. 
e970: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e980: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
e990: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
e9a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e9b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e9c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e9d0: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
e9e0: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
e9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ea00: 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
ea10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ea20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73  eAddOp(v, OP_Las
ea30: 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  t, iIdxCur, brk)
ea40: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ea50: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
ea60: 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69   start key.  Thi
ea70: 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61  s is the key tha
ea80: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f  t defines the lo
ea90: 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75  wer.      ** bou
eaa0: 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  nd on the search
eab0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73  .  There is no s
eac0: 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72  tart key if ther
ead0: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a  e are no.      *
eae0: 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  * equality terms
eaf0: 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73   and if there is
eb00: 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d   no "X>..." term
eb10: 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74  .  In.      ** t
eb20: 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61  hat case, genera
eb30: 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e  te a "Rewind" in
eb40: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61  struction in pla
eb50: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
eb60: 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61  ** start key sea
eb70: 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rch..      **.  
eb80: 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
eb90: 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20  04: In the case 
eba0: 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  of a reverse-ord
ebb0: 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73  er search, the s
ebc0: 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a  o-called.      *
ebd0: 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65  * "start" key re
ebe0: 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69  ally ends up bei
ebf0: 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74  ng used as the t
ec00: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a  ermination key..
ec10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ec20: 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20  f( btmLimit ){. 
ec30: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
ec40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
ec50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ec60: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
ec70: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
ec80: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
ec90: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
eca0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
ecb0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
ecc0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
ecd0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
ece0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ecf0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
ed00: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
ed10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ed20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ed30: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
ed40: 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20         geFlag = 
ed50: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20  pX->op==TK_GE;. 
ed60: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
ed70: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
ed80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ed90: 20 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d          geFlag =
eda0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
edb0: 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62    if( nEq>0 || b
edc0: 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
edd0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
ede0: 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20  q + btmLimit;.  
edf0: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
ee00: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62  Probe(v, nCol, b
ee10: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
ee20: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
ee30: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
ee40: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
ee50: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
ee60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee70: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
ee80: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
ee90: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74   1);.          t
eea0: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54  estOp = OP_IdxLT
eeb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
eec0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
eed0: 70 20 3d 20 67 65 46 6c 61 67 20 3f 20 4f 50 5f  p = geFlag ? OP_
eee0: 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
eef0: 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
ef00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef10: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
ef20: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rk);.        }. 
ef30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
ef40: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
ef50: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
ef60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ef70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
ef90: 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
efa0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
efb0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
efc0: 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
efd0: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
efe0: 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
eff0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
f000: 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
f010: 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
f020: 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
f030: 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
f040: 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
f050: 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
f060: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f070: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
f080: 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
f090: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
f0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f0b0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
f0c0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
f0d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f0e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
f0f0: 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72  tOp, iIdxCur, br
f100: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
f110: 28 6c 65 46 6c 61 67 20 26 26 20 21 62 52 65 76  (leFlag && !bRev
f120: 29 20 7c 7c 20 28 21 67 65 46 6c 61 67 20 26 26  ) || (!geFlag &&
f130: 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20   bRev) ){.      
f140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f150: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
f160: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
f170: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f180: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f190: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f1a0: 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
f1b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f1c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f1d0: 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 20  _IdxIsNull, nEq 
f1e0: 2b 20 74 6f 70 4c 69 6d 69 74 2c 20 63 6f 6e 74  + topLimit, cont
f1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
f200: 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
f210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f220: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
f230: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
f240: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f260: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
f270: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f280: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
f290: 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
f2a0: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
f2b0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
f2c0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
f2d0: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
f2e0: 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
f2f0: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
f300: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70  iIdxCur;.      p
f310: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
f320: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
f330: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
f340: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
f350: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
f360: 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61  e 4:  There is a
f370: 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20  n index and all 
f380: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
f390: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20  RE clause that. 
f3a0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f3b0: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e   refer to the in
f3c0: 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d  dex using the "=
f3d0: 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
f3e0: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tors..      */. 
f3f0: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
f400: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
f410: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20  pLevel->nEq;..  
f420: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f430: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
f440: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
f450: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
f460: 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
f470: 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75  d leave the valu
f480: 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
f490: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
f4a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
f4b0: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
f4c0: 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
f4d0: 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
f4e0: 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20  y, brk);..      
f4f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 69  /* Generate a si
f500: 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69  ngle key that wi
f510: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f  ll be used to bo
f520: 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  th start and ter
f530: 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  minate.      ** 
f540: 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20  the search.     
f550: 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64 49   */.      buildI
f560: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71  ndexProbe(v, nEq
f570: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
f580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f590: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
f5a0: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
f5b0: 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
f5c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
f5d0: 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
f5e0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
f5f0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
f600: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
f610: 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
f620: 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
f630: 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
f640: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
f650: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
f660: 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
f670: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
f680: 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
f690: 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
f6a0: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
f6b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
f6c0: 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
f6d0: 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
f6e0: 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
f6f0: 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
f700: 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
f710: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
f720: 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
f730: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
f740: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
f750: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
f760: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
f770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f780: 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78   OP_MoveLe, iIdx
f790: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
f7a0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
f7b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f7c0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
f7d0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
f7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c  AddOp(v, OP_IdxL
f800: 54 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  T, iIdxCur, brk)
f810: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
f820: 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
f830: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f840: 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
f850: 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65  the forward orde
f860: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
f870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f880: 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78   OP_MoveGe, iIdx
f890: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
f8a0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
f8b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f8c0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
f8d0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
f8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f8f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c  Op3(v, OP_IdxGE,
f900: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22   iIdxCur, brk, "
f910: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
f920: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
f930: 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
f940: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f950: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f960: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
f970: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
f980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f990: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
f9a0: 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  nEq, cont);.    
f9b0: 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
f9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f9d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f9e0: 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
f9f0: 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
fa00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa10: 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
fa20: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
fa30: 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
fa40: 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
fa50: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
fa60: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
fa70: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
fa80: 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
fa90: 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
faa0: 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
fab0: 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
fac0: 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
fad0: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
fae0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
faf0: 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
fb00: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
fb10: 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
fb20: 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
fb30: 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
fb40: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
fb50: 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
fb60: 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
fb70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fb80: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
fb90: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a  ur, brk);.    }.
fba0: 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
fbb0: 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
fbc0: 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
fbd0: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
fbe0: 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
fbf0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
fc00: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
fc10: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
fc20: 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
fc30: 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
fc40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
fc50: 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77  (pTerm=wc.a, j=w
fc60: 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  c.nTerm; j>0; j-
fc70: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
fc80: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
fc90: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
fca0: 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
fcb0: 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
fcc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fcd0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
fce0: 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
fcf0: 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
fd00: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
fd10: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
fd20: 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
fd30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
fd40: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
fd50: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
fd60: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
fd70: 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
fd80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
fd90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fda0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
fdb0: 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a  , pE, cont, 1);.
fdc0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
fdd0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
fde0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fdf0: 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
fe00: 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
fe10: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
fe20: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
fe30: 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
fe40: 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
fe50: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
fe60: 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
fe70: 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
fe80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
fe90: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
fea0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
feb0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fec0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
fed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
fef0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
ff00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ff10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
ff20: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  re, pLevel->iLef
ff30: 74 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20  tJoin, 1);.     
ff40: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ff50: 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20   "# record LEFT 
ff60: 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
ff70: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
ff80: 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65  a, j=0; j<wc.nTe
ff90: 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
ffa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
ffb0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
ffc0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
ffd0: 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
ffe0: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
fff0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
10000 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
10010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
10030 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
10040 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10050 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
10060 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f  pTerm->pExpr, co
10070 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  nt, 1);.        
10080 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
10090 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
100a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
100b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
100c0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
100d0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
100e0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
100f0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
10100 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
10110 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
10120 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
10130 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
10140 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
10150 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
10160 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
10170 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
10180 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
10190 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
101a0 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
101b0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
101c0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
101d0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
101e0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
101f0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
10200 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
10210 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
10220 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10230 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
10240 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
10250 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
10260 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
10270 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
10280 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
10290 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
102a0 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
102b0 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
102c0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
102d0 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Name;.    n = st
102e0 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
102f0 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
10300 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
10310 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
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 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
10340 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
10350 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
10360 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
10370 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20  an], "{}");.    
10380 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
10390 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
103a0 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
103b0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
103c0 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20  [nQPlan], z);.  
103d0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
103e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
103f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
10400 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
10410 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ' ';.    }.    i
10420 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
10430 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
10440 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
10450 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 73  ANGE) ){.      s
10460 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
10470 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
10480 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20 20  ], "* ");.      
10490 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
104a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
104b0 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  l->pIdx==0 ){.  
104c0 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
104d0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
104e0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a  QPlan], "{} ");.
104f0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
10500 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
10510 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70      n = strlen(p
10520 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
10530 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
10540 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
10550 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
10560 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
10570 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
10580 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
10590 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49  lan], pLevel->pI
105a0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
105b0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
105c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
105d0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
105e0 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
105f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10600 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
10610 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
10620 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
10630 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
10640 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
10650 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
10660 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
10670 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
10680 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
10690 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
106a0 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
106b0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
106c0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
106d0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
106e0 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
106f0 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
10700 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
10710 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
10720 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
10730 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69    */.  pWInfo->i
10740 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b  Continue = cont;
10750 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
10760 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75  ear(&wc);.  retu
10770 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
10780 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
10790 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
107a0 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20  ereBeginNoMem:. 
107b0 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
107c0 72 28 26 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  r(&wc);.  sqlite
107d0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
107e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
107f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
10800 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
10810 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
10820 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
10830 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10840 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10850 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
10860 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
10870 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
10880 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
10890 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
108a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
108b0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
108c0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
108d0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
108e0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
108f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
10900 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
10910 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
10920 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
10930 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
10940 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
10950 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
10960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10970 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
10980 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
10990 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
109a0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
109b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
109c0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
109d0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
109e0 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
109f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10a10 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
10a20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49    if( pLevel->nI
10a30 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  n ){.      int *
10a40 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  a;.      int j;.
10a50 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
10a60 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76  el->nIn, a=&pLev
10a70 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d  el->aInLoop[j*3-
10a80 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d  3]; j>0; j--, a-
10a90 3d 33 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  =3){.        sql
10aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10ab0 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32   a[0], a[1], a[2
10ac0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
10ad0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65    sqliteFree(pLe
10ae0 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  vel->aInLoop);. 
10af0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
10b00 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
10b10 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
10b20 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
10b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b40 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
10b50 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
10b60 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10b70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10b80 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61  OP_NotNull, 1, a
10b90 64 64 72 2b 34 20 2b 20 28 70 4c 65 76 65 6c 2d  ddr+4 + (pLevel-
10ba0 3e 69 49 64 78 43 75 72 3e 3d 30 29 29 3b 0a 20  >iIdxCur>=0));. 
10bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10bc0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
10bd0 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
10be0 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b  [i].iCursor, 0);
10bf0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
10c00 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
10c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10c20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10c30 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
10c40 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20  >iIdxCur, 0);.  
10c50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10c60 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10c70 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
10c80 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 7d 0a  el->top);.    }.
10c90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
10ca0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
10cb0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
10cc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
10cd0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
10ce0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
10cf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10d00 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
10d10 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
10d20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
10d30 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
10d40 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
10d50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
10d60 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
10d70 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
10d80 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
10d90 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
10da0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
10db0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
10dc0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
10dd0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
10de0 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
10df0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
10e00 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
10e10 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
10e20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
10e30 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d  ansient || pTab-
10e40 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
10e50 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
10e60 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
10e70 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
10e80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10e90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10ea0 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
10eb0 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  ->iCursor, 0);. 
10ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
10ed0 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a  vel->pIdx!=0 ){.
10ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ef0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10f00 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
10f10 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  Cur, 0);.    }..
10f20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73      /* Make curs
10f30 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  or substitutions
10f40 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 72 65   for cases where
10f50 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73 65 0a   we want to use.
10f60 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68 65 20      ** just the 
10f70 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65 72 20  index and never 
10f80 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
10f90 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ble..    ** .   
10fa0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
10fb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
10fc0 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
10fd0 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
10fe0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
10ff0 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
11000 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
11010 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
11020 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
11030 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
11040 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
11050 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
11060 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
11070 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
11080 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
11090 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
110a0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
110b0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
110c0 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
110d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
110e0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
110f0 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
11100 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c 61      int i, j, la
11110 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
11120 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
11130 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
11140 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20  l->pIdx;..      
11150 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
11160 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
11170 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
11180 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
11190 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
111a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
111b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
111c0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(i=pWInfo->iT
111d0 6f 70 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c  op; i<last; i++,
111e0 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
111f0 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
11200 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
11210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11220 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
11230 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
11240 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
11250 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
11260 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Cur;.          f
11270 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
11280 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
11290 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
112a0 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
112b0 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
112c0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
112d0 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
112e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
112f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11310 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
11320 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
11330 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
11340 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
11350 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
11360 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
11370 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
11380 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
11390 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75  p->opcode==OP_Nu
113a0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
113b0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
113c0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
113d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
113e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
113f0 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
11400 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e   sqliteFree(pWIn
11410 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
11420 0a                                               .