/ Hex Artifact Content
Login

Artifact d69b304e506a78a1cf6b31e7a58408703a166dc2:


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 39   where.c,v 1.169
0340: 20 32 30 30 35 2f 30 39 2f 30 38 20 31 34 3a 31   2005/09/08 14:1
0350: 37 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  7:20 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 6e 50 61 74 74  All;.  int nPatt
4720: 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d  ern;.  int isCom
4730: 70 6c 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71  plete;..  if( sq
4740: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
4750: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4760: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
4770: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4780: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
4790: 66 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ft);.  pTerm->pr
47a0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
47b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
47c0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
47d0: 68 74 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  ht);.  pTerm->pr
47e0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
47f0: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
4800: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4810: 45 78 70 72 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  Expr);.  pTerm->
4820: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
4830: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
4840: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
4850: 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  >operator = 0;. 
4860: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
4870: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70 54  Expr->op) && (pT
4880: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
4890: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
48a0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
48b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
48c0: 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  eft;.    Expr *p
48d0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
48e0: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70  Right;.    if( p
48f0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
4900: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
4910: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
4920: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
4930: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
4940: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
4950: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
4960: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
4970: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
4980: 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  Expr->op);.    }
4990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
49a0: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
49b0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
49c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
49d0: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
49e0: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
49f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4a00: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
4a10: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
4a20: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
4a30: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
4a40: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
4a50: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
4a60: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
4a70: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
4a80: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
4a90: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
4ab0: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
4ac0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
4ad0: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
4ae0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
4af0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
4b00: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
4b10: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
4b20: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
4b30: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
4b40: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
4b50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b60: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
4b70: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
4b80: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
4b90: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
4ba0: 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c  (pDup);.      pL
4bb0: 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66  eft = pDup->pLef
4bc0: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  t;.      pNew->l
4bd0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
4be0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
4bf0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d   pNew->leftColum
4c00: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
4c10: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  mn;.      pNew->
4c20: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
4c30: 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20  ereqLeft;.      
4c40: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
4c50: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
4c60: 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61 74 6f     pNew->operato
4c70: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
4c80: 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20  (pDup->op);.    
4c90: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
4ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
4cb0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
4cc0: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
4cd0: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
4ce0: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
4cf0: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
4d00: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
4d10: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
4d20: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
4d30: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a   implements..  *
4d40: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
4d50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
4d60: 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  EN ){.    ExprLi
4d70: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
4d80: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  r->pList;.    in
4d90: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
4da0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
4db0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
4dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4dd0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
4de0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
4df0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
4e00: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
4e10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
4e20: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
4e30: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
4e40: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
4e50: 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71 6c  Expr(ops[i], sql
4e60: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
4e70: 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20  r->pLeft),.     
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4ea0: 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e 61 5b  xprDup(pList->a[
4eb0: 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20  i].pExpr), 0);. 
4ec0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
4ed0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
4ee0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
4ef0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
4f00: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
4f10: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
4f20: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
4f30: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
4f40: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
4f50: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
4f60: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
4f70: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
4f80: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
4f90: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
4fa0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
4fb0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
4fc0: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
4fd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
4fe0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
4ff0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 74 74 65  ZATION.  /* Atte
5000: 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f  mpt to convert O
5010: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
5020: 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  s into an IN ope
5030: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20  rator so that.  
5040: 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65  ** they can make
5050: 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
5060: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
5070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
5080: 52 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 3b  R ){.    int ok;
5090: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
50a0: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20     int iColumn, 
50b0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68 65  iCursor;.    Whe
50c0: 72 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20 20  reClause sOr;.  
50d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
50e0: 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72  Term;..    asser
50f0: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
5100: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29   & TERM_DYNAMIC)
5110: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72 65  ==0 );.    where
5120: 43 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72 2c  ClauseInit(&sOr,
5130: 20 70 57 43 2d 3e 70 50 61 72 73 65 29 3b 0a 20   pWC->pParse);. 
5140: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 73     whereSplit(&s
5150: 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Or, pExpr, TK_OR
5160: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
5170: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4d 61 73  zeAll(pSrc, pMas
5180: 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a 20 20 20  kSet, &sOr);.   
5190: 20 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54 65   assert( sOr.nTe
51a0: 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20  rm>0 );.    j = 
51b0: 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
51c0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61   iColumn = sOr.a
51d0: 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  [j].leftColumn;.
51e0: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
51f0: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75 72  sOr.a[j].leftCur
5200: 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d 20  sor;.      ok = 
5210: 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20 20  iCursor>=0;.    
5220: 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72    for(i=sOr.nTer
5230: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72  m-1, pOrTerm=sOr
5240: 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20  .a; i>=0 && ok; 
5250: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
5260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
5270: 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 21 3d  Term->operator!=
5280: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  WO_EQ ){.       
5290: 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70     goto or_not_p
52a0: 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20 20  ossible;.       
52b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
52c0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
52d0: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26 26 20 70  or==iCursor && p
52e0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75  OrTerm->leftColu
52f0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
5300: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
5310: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
5320: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
5330: 65 6c 73 65 20 69 66 28 20 28 70 4f 72 54 65 72  else if( (pOrTer
5340: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
5350: 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20 20  COPIED)!=0 ||.  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61    ((pOrTerm->fla
5380: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
5390: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
53b0: 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  Or.a[pOrTerm->iP
53c0: 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20 54  arent].flags & T
53d0: 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20 29  ERM_OR_OK)!=0) )
53e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
53f0: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54  erm->flags &= ~T
5400: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
5410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5420: 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20 20      ok = 0;.    
5430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5440: 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26 26    }while( !ok &&
5450: 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61   (sOr.a[j++].fla
5460: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
5470: 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e 54  )!=0 && j<sOr.nT
5480: 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  erm );.    if( o
5490: 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  k ){.      ExprL
54a0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  ist *pList = 0;.
54b0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
54c0: 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 66  , *pDup;.      f
54d0: 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31  or(i=sOr.nTerm-1
54e0: 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b  , pOrTerm=sOr.a;
54f0: 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d   i>=0 && ok; i--
5500: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
5510: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
5520: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5530: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
5540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
5550: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
5560: 72 44 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70 45  rDup(pOrTerm->pE
5570: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
5580: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
5590: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
55a0: 65 6e 64 28 70 4c 69 73 74 2c 20 70 44 75 70 2c  end(pList, pDup,
55b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
55c0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
55d0: 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c  3Expr(TK_COLUMN,
55e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
55f0: 20 69 66 28 20 70 44 75 70 20 29 7b 0a 20 20 20   if( pDup ){.   
5600: 20 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62 6c       pDup->iTabl
5610: 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
5620: 20 20 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c 75       pDup->iColu
5630: 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = iColumn;.  
5640: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
5650: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5660: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
5670: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
5680: 77 20 29 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  w ) pNew->pList 
5690: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = pList;.      p
56a0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Term->pExpr = pN
56b0: 65 77 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  ew;.      pTerm-
56c0: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 44  >flags |= TERM_D
56d0: 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20 20 65 78  YNAMIC;.      ex
56e0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
56f0: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69  pMaskSet, pWC, i
5700: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70  dxTerm);.      p
5710: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5720: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 7d 0a 6f  dxTerm];.    }.o
5730: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a  r_not_possible:.
5740: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
5750: 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a  lear(&sOr);.  }.
5760: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5770: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
5780: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
5790: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
57a0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
57b0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
57c0: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
57d0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
57e0: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
57f0: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
5800: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
5810: 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50  keOrGlob(pWC->pP
5820: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
5830: 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43   &nPattern, &isC
5840: 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20  omplete) ){.    
5850: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52  Expr *pLeft, *pR
5860: 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  ight;.    Expr *
5870: 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20  pStr1, *pStr2;. 
5880: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
5890: 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  r1, *pNewExpr2;.
58a0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c      int idxNew1,
58b0: 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70   idxNew2;..    p
58c0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
58d0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
58e0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
58f0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
5900: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
5910: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  1 = sqlite3Expr(
5920: 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  TK_STRING, 0, 0,
5930: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
5940: 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r1 ){.      sqli
5950: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53  te3TokenCopy(&pS
5960: 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69  tr1->token, &pRi
5970: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
5980: 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e     pStr1->token.
5990: 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  n = nPattern;.  
59a0: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
59b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
59c0: 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  Str1);.    if( p
59d0: 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73  Str2 ){.      as
59e0: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
59f0: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
5a00: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
5a10: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
5a20: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
5a30: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
5a40: 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71  e3Expr(TK_GE, sq
5a50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
5a60: 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  ft), pStr1, 0);.
5a70: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
5a80: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5a90: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
5aa0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
5ab0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
5ac0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
5ad0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
5ae0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
5af0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
5b00: 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71  e3Expr(TK_LT, sq
5b10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
5b20: 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a  ft), pStr2, 0);.
5b30: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
5b40: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5b50: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
5b60: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
5b70: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
5b80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
5b90: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
5ba0: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
5bb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5bc0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
5bd0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
5be0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5bf0: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
5c00: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
5c10: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
5c20: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
5c30: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
5c40: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
5c50: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5c60: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5c70: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d  PTIMIZATION */.}
5c80: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
5c90: 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66  utine decides if
5ca0: 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
5cb0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
5cc0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
5cd0: 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c  use.  If it can,
5ce0: 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20   it returns 1.  
5cf0: 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73  If pIdx cannot s
5d00: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52  atisfy the.** OR
5d10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
5d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5d30: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72  rns 0..**.** pOr
5d40: 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45  derBy is an ORDE
5d50: 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
5d60: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
5d70: 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68  ent.  pTab is th
5d80: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
5d90: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
5da0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
5db0: 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74  same SELECT stat
5dc0: 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ement and.** the
5dd0: 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72   table has a cur
5de0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
5df0: 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61  ase".  pIdx is a
5e00: 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e  n index on pTab.
5e10: 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73  .**.** nEqCol is
5e20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5e30: 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74  olumns of pIdx t
5e40: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
5e50: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
5e60: 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66  traints.  Any of
5e70: 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   these columns m
5e80: 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72  ay be missing fr
5e90: 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  om the ORDER BY.
5ea0: 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  ** clause and th
5eb0: 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c  e match can stil
5ec0: 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a  l be a success..
5ed0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20  **.** All terms 
5ee0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
5ef0: 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e  that match again
5f00: 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  st the index mus
5f10: 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41  t be either.** A
5f20: 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65  SC or DESC.  (Te
5f30: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
5f40: 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20   BY clause past 
5f50: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49  the end of a UNI
5f60: 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20  QUE.** index do 
5f70: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69  not need to sati
5f80: 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61  sfy this constra
5f90: 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65  int.)  The *pbRe
5fa0: 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  v value is.** se
5fb0: 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52  t to 1 if the OR
5fc0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
5fd0: 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74   all DESC and it
5fe0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a   is set to 0 if.
5ff0: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
6000: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53  clause is all AS
6010: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  C..*/.static int
6020: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
6030: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
6050: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6060: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6080: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
6090: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c  esting */.  Tabl
60a0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
60b0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
60c0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
60d0: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
60e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
60f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
6100: 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pTab */.  ExprLi
6110: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
6120: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
6130: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
6140: 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20  t nEqCol,       
6150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6160: 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  of index columns
6170: 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61   with == constra
6180: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ints */.  int *p
6190: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
61a0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
61b0: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
61c0: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
61d0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
61f0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
6200: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
6210: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 20 20  SQLITE_SO_ASC;  
6220: 2f 2a 20 57 68 69 63 68 20 64 69 72 65 63 74 69  /* Which directi
6230: 6f 6e 20 77 65 20 61 72 65 20 73 6f 72 74 69 6e  on we are sortin
6240: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  g */.  int nTerm
6250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6260: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6270: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
6280: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
6290: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
62a0: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
62b0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
62c0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
62d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
62e0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
62f0: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
6300: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
6310: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
6320: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
6330: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
6340: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6350: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
6360: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
6370: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
6380: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
6390: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
63a0: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
63b0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
63c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
63d0: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
63e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
63f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
6400: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
6410: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
6420: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
6430: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
6440: 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d   */..    pExpr =
6450: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
6460: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
6470: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
6480: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61  Expr->iTable!=ba
6490: 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  se ){.      /* C
64a0: 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  an not use an in
64b0: 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74  dex sort on anyt
64c0: 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  hing that is not
64d0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
64e0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d  .      ** left-m
64f0: 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ost table of the
6500: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6520: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
6530: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6540: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
6550: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
6560: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
6570: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6580: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
6590: 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn!=pIdx->aiCol
65a0: 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f 6c 6c 21  umn[i] || pColl!
65b0: 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  =pIdx->keyInfo.a
65c0: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
65d0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
65e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
65f0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
6600: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
6610: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
6620: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
6630: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6640: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
6650: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
6660: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
6670: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
6680: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
6690: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
66a0: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
66b0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
66c0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
66d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
66e0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
66f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6700: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
6710: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
6720: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
6730: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
6740: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
6750: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
6760: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
6770: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
6780: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
6790: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
67b0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
67c0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74   if( pTerm->sort
67d0: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
67e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
67f0: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
6800: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
6810: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
6820: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
6830: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
6840: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
6850: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
6860: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
6870: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
6880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6890: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 54 65   sortOrder = pTe
68a0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
68b0: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
68c0: 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    pTerm++;.  }..
68d0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
68e0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
68f0: 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74 65  orting if all te
6900: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6910: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
6920: 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20 20 2a  are covered..  *
6930: 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d  /.  if( j>=nTerm
6940: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
6950: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
6960: 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 20 20  TE_SO_DESC;.    
6970: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6980: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6990: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
69a0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
69b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
69c0: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
69d0: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
69e0: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
69f0: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
6a00: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
6a10: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
6a20: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
6a30: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
6a40: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
6a50: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
6a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
6a70: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
6a80: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
6aa0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
6ab0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
6ac0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6ad0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
6ae0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
6af0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ause */.  int *p
6b00: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
6b10: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
6b20: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
6b30: 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  C */.){.  Expr *
6b40: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p;..  assert( pO
6b50: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
6b60: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
6b70: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20  >nExpr>0 );.  p 
6b80: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
6b90: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4f  .pExpr;.  if( pO
6ba0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
6bb0: 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
6bc0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
6bd0: 65 3d 3d 62 61 73 65 0a 20 20 20 20 20 20 20 20  e==base.        
6be0: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
6bf0: 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  =-1 ){.    *pbRe
6c00: 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  v = pOrderBy->a[
6c10: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
6c20: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
6c30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6c40: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
6c50: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
6c60: 20 74 68 65 20 6c 6f 67 6f 72 69 74 68 6d 20 6f   the logorithm o
6c70: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
6c80: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
6c90: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
6ca0: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
6cb0: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
6cc0: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
6cd0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
6ce0: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  orming operating
6cf0: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
6d00: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
6d10: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
6d20: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
6d30: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
6d40: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
6d50: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
6d60: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
6d70: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
6d80: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
6d90: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 2e 30 3b  uble logN = 1.0;
6da0: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
6db0: 2e 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78  .0;.  while( N>x
6dc0: 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20   ){.    logN += 
6dd0: 31 2e 30 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  1.0;.    x *= 10
6de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
6df0: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ogN;.}../*.** Fi
6e00: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  nd the best inde
6e10: 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  x for accessing 
6e20: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
6e30: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
6e40: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
6e50: 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61  index, flags tha
6e60: 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74  t describe how t
6e70: 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
6e80: 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20  be used, the.** 
6e90: 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
6ea0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
6eb0: 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66  and the "cost" f
6ec0: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a  or this index..*
6ed0: 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
6ee0: 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e  cost index wins.
6ef0: 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
6f00: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
6f10: 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
6f20: 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
6f30: 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
6f40: 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
6f50: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
6f60: 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  dex..** Factors 
6f70: 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
6f80: 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
6f90: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
6fa0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
6fb0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
6fc0: 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
6fd0: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
6fe0: 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
6ff0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
7000: 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
7010: 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
7020: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
7030: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
7040: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
7050: 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
7060: 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
7070: 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
7080: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  able..**.*/.stat
7090: 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e  ic double bestIn
70a0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
70b0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
70c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
70d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
70e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
70f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7100: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7110: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7120: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
7130: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7140: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
7150: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
7160: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
7170: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
7180: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
7190: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
71a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
71b0: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
71c0: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
71d0: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
71e0: 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20  **ppIndex,      
71f0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70        /* Make *p
7200: 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20  pIndex point to 
7210: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a  the best index *
7220: 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  /.  int *pFlags,
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73  /* Put flags des
7250: 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f  cribing this cho
7260: 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a  ice in *pFlags *
7270: 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20  /.  int *pnEq   
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65  /* Put the numbe
72a0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
72b0: 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a  nstraints here *
72c0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
72d0: 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78   *pTerm;.  Index
72e0: 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20   *bestIdx = 0;  
72f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
7300: 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c  that gives the l
7310: 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20  owest cost */.  
7320: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
7330: 74 20 3d 20 31 2e 30 65 39 39 3b 20 2f 2a 20 54  t = 1.0e99; /* T
7340: 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
7350: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
7360: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
7370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7380: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
7390: 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20  th bestIdx */.  
73a0: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
73c0: 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45  est value for nE
73d0: 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  q */.  int iCur 
73e0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
73f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
7400: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
7410: 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
7420: 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7440: 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
7450: 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
7460: 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
7490: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
74a0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
74d0: 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a  ed with pProbe *
74e0: 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  /.  int nEq;    
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
7510: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7520: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
7530: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
7540: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
7550: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
7560: 20 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64   TRACE(("bestInd
7570: 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65  ex: tbl=%s notRe
7580: 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d  ady=%x\n", pSrc-
7590: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f  >pTab->zName, no
75a0: 74 52 65 61 64 79 29 29 3b 0a 0a 20 20 2f 2a 20  tReady));..  /* 
75b0: 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69  Check for a rowi
75c0: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
75d0: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
75e0: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72  ints.  */.  pTer
75f0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
7600: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
7610: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
7620: 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  N, 0);.  if( pTe
7630: 72 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  rm ){.    Expr *
7640: 70 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e  pExpr;.    *ppIn
7650: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73  dex = 0;.    bes
7660: 74 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  tFlags = WHERE_R
7670: 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28  OWID_EQ;.    if(
7680: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
7690: 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20   & WO_EQ ){.    
76a0: 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20    /* Rowid== is 
76b0: 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20  always the best 
76c0: 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66  pick.  Look no f
76d0: 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65  urther.  Because
76e0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61   only.      ** a
76f0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
7700: 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
7710: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
7720: 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
7730: 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48      *pFlags = WH
7740: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57  ERE_ROWID_EQ | W
7750: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
7760: 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20     *pnEq = 1;.  
7770: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
7780: 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22  best is rowid\n"
7790: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
77a0: 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   0.0;.    }else 
77b0: 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65  if( (pExpr = pTe
77c0: 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73  rm->pExpr)->pLis
77d0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t!=0 ){.      /*
77e0: 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29   Rowid IN (LIST)
77f0: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
7800: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
7810: 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20  umber of list.  
7820: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
7830: 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73    */.      lowes
7840: 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  tCost = pExpr->p
7850: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
7860: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d     lowestCost *=
7870: 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f   estLog(lowestCo
7880: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
7890: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
78a0: 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74  N (SELECT): cost
78b0: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
78c0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
78d0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
78e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
78f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
7900: 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
7910: 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
7920: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
7930: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
7940: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
7950: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
7960: 32 30 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20  200.0;.    }.   
7970: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77   TRACE(("... row
7980: 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67  id IN cost: %.9g
7990: 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29  \n", lowestCost)
79a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74  );.  }..  /* Est
79b0: 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  imate the cost o
79c0: 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20  f a table scan. 
79d0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   If we do not kn
79e0: 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a  ow how many.  **
79f0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
7a00: 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31  the table, use 1
7a10: 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75   million as a gu
7a20: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 72 6f  ess..  */.  pPro
7a30: 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  be = pSrc->pTab-
7a40: 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f 73 74 20  >pIndex;.  cost 
7a50: 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62  = pProbe ? pProb
7a60: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a  e->aiRowEst[0] :
7a70: 20 31 30 30 30 30 30 30 2e 30 3b 0a 20 20 54 52   1000000.0;.  TR
7a80: 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20  ACE(("... table 
7a90: 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a 20  scan base cost: 
7aa0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
7ab0: 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  .  flags = WHERE
7ac0: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20  _ROWID_RANGE;.. 
7ad0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
7ae0: 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72  nstraints on a r
7af0: 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69  ange of rowids i
7b00: 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  n a table scan..
7b10: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66    */.  pTerm = f
7b20: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
7b30: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
7b40: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
7b50: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
7b60: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
7b70: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
7b80: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
7b90: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
7ba0: 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  LE, 0) ){.      
7bb0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  flags |= WHERE_T
7bc0: 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
7bd0: 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 20 20  cost *= 0.333;  
7be0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
7bf0: 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid<EXPR elimina
7c00: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
7c10: 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  r rows */.    }.
7c20: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
7c30: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
7c40: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
7c50: 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
7c60: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
7c70: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
7c80: 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33     cost *= 0.333
7c90: 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
7ca0: 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d   rowid>EXPR elim
7cb0: 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
7cc0: 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s of rows */.   
7cd0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
7ce0: 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72  .. rowid range r
7cf0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
7d00: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
7d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
7d20: 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gs = 0;.  }..  /
7d30: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73  * If the table s
7d40: 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  can does not sat
7d50: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
7d60: 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61  Y clause, increa
7d70: 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74  se.  ** the cost
7d80: 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76   by NlogN to cov
7d90: 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f  er the expense o
7da0: 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  f sorting. */.  
7db0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
7dc0: 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
7dd0: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
7de0: 72 64 65 72 42 79 2c 20 26 72 65 76 29 20 29 7b  rderBy, &rev) ){
7df0: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
7e00: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48  WHERE_ORDERBY|WH
7e10: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
7e20: 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29  .      if( rev )
7e30: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
7e40: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
7e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7e60: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20  lse{.      cost 
7e70: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
7e80: 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ost);.      TRAC
7e90: 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20  E(("... sorting 
7ea0: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
7eb0: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
7ec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
7ed0: 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  f( cost<lowestCo
7ee0: 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74  st ){.    lowest
7ef0: 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
7f00: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
7f10: 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  gs;.  }..  /* Lo
7f20: 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65 78  ok at each index
7f30: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70  ..  */.  for(; p
7f40: 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
7f50: 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
7f60: 20 20 69 6e 74 20 69 3b 20 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 2f                 /
7f80: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
7f90: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d  /.    double inM
7fa0: 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 2e 30 3b  ultiplier = 1.0;
7fb0: 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  ..    TRACE(("..
7fc0: 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
7fd0: 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
7fe0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
7ff0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
8000: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
8010: 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
8020: 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
8030: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
8040: 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  s or x IN (...) 
8050: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
8060: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
8070: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
8080: 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
8090: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
80a0: 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
80b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
80c0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
80d0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
80e0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
80f0: 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29 3b  |WO_IN, pProbe);
8100: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
8110: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8120: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8130: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
8140: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70     if( pTerm->op
8150: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
8160: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
8170: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
8180: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c  Expr;.        fl
8190: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
81a0: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
81b0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
81c0: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
81d0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
81e0: 2a 3d 20 31 30 30 2e 30 3b 0a 20 20 20 20 20 20  *= 100.0;.      
81f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
8200: 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20  r->pList!=0 ){. 
8210: 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
8220: 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e  plier *= pExpr->
8230: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31  pList->nExpr + 1
8240: 2e 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  .0;.        }.  
8250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8260: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  cost = pProbe->a
8270: 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
8280: 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c  ultiplier * estL
8290: 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
82a0: 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
82b0: 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
82c0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
82d0: 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
82e0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a  E_COLUMN_IN)==0.
82f0: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d           && nEq=
8300: 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
8310: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
8320: 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
8330: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
8340: 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64  (("...... nEq=%d
8350: 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73   inMult=%.9g cos
8360: 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c 20  t=%.9g\n", nEq, 
8370: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f  inMultiplier, co
8380: 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  st));..    /* Lo
8390: 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e  ok for range con
83a0: 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a  straints.    */.
83b0: 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f      if( nEq<pPro
83c0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
83d0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
83e0: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  obe->aiColumn[nE
83f0: 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  q];.      pTerm 
8400: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
8410: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
8420: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
8430: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f  O_GT|WO_GE, pPro
8440: 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  be);.      if( p
8450: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
8460: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
8470: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
8480: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
8490: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
84a0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
84b0: 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_LE, pProbe) )
84c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
84d0: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
84e0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
84f0: 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 0a 20  cost *= 0.333;. 
8500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8510: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
8520: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
8530: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
8540: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
8550: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8560: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
8570: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
8580: 20 2a 3d 20 30 2e 33 33 33 3b 0a 20 20 20 20 20   *= 0.333;.     
8590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
85a0: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
85b0: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
85c0: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
85d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
85e0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
85f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
8600: 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
8610: 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
8620: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8630: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8640: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
8650: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
8660: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
8670: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
8680: 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 70 53  pParse,pProbe,pS
8690: 72 63 2d 3e 70 54 61 62 2c 69 43 75 72 2c 70 4f  rc->pTab,iCur,pO
86a0: 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29  rderBy,nEq,&rev)
86b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
86c0: 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20  flags==0 ){.    
86d0: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
86e0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
86f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8700: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8710: 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
8720: 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
8730: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
8740: 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
8750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8770: 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
8780: 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
8790: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
87a0: 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
87b0: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
87c0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
87d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
87e0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
87f0: 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77  if we can get aw
8800: 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75  ay with using ju
8810: 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  st the index wit
8820: 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72  hout.    ** ever
8830: 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62   reading the tab
8840: 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  le.  If that is 
8850: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68  the case, then h
8860: 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  alve the.    ** 
8870: 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64  cost of this ind
8880: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
8890: 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63  f( flags && pSrc
88a0: 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42  ->colUsed < (((B
88b0: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
88c0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74  1)) ){.      Bit
88d0: 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
88e0: 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
88f0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
8900: 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; j<pProbe->nC
8910: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
8920: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72       int x = pPr
8930: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  obe->aiColumn[j]
8940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
8950: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
8960: 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
8970: 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
8980: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8990: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
89a0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
89b0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
89c0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2a 3d  .        cost *=
89d0: 20 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 54 52   0.5;.        TR
89e0: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78  ACE(("...... idx
89f0: 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f  -only reduces co
8a00: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
8a10: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
8a20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8a30: 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61  this index has a
8a40: 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65  chieved the lowe
8a50: 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20  st cost so far, 
8a60: 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20  then use it..   
8a70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74   */.    if( cost
8a80: 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b   < lowestCost ){
8a90: 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d  .      bestIdx =
8aa0: 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c   pProbe;.      l
8ab0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
8ac0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8ad0: 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20  flags!=0 );.    
8ae0: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c    bestFlags = fl
8af0: 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e  ags;.      bestN
8b00: 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a  Eq = nEq;.    }.
8b10: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
8b20: 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
8b30: 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78  .  */.  *ppIndex
8b40: 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54 52   = bestIdx;.  TR
8b50: 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
8b60: 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39   is %s, cost=%.9
8b70: 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71  g, flags=%x, nEq
8b80: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
8b90: 62 65 73 74 49 64 78 20 3f 20 62 65 73 74 49 64  bestIdx ? bestId
8ba0: 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e  x->zName : "(non
8bb0: 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c  e)", lowestCost,
8bc0: 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74   bestFlags, best
8bd0: 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73  NEq));.  *pFlags
8be0: 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
8bf0: 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b  *pnEq = bestNEq;
8c00: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74  .  return lowest
8c10: 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cost;.}.../*.** 
8c20: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
8c30: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
8c40: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
8c50: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
8c60: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
8c70: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
8c80: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
8c90: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
8ca0: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
8cb0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
8cc0: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
8cd0: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
8ce0: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
8cf0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
8d00: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
8d10: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
8d20: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
8d30: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
8d40: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
8d50: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
8d60: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
8d70: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
8d80: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
8d90: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
8da0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
8db0: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
8dc0: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
8dd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
8de0: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
8df0: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
8e00: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
8e10: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
8e20: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
8e30: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
8e40: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
8e50: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
8e60: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
8e70: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
8e80: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
8e90: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
8ea0: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
8eb0: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
8ec0: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
8ed0: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
8ee0: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
8ef0: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
8f00: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
8f10: 6f 6e 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  on.  We would ge
8f20: 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  t the correct.**
8f30: 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
8f40: 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
8f50: 73 61 62 6c 65 64 2c 20 62 75 74 20 6a 6f 69 6e  sabled, but join
8f60: 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
8f70: 74 74 6c 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e 20  ttle.** slower. 
8f80: 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
8f90: 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
8fa0: 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
8fb0: 75 74 20 64 69 73 61 62 6c 69 6e 67 0a 2a 2a 20  ut disabling.** 
8fc0: 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
8fd0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
8fe0: 2c 20 77 65 27 64 20 67 65 74 20 74 68 65 20 77  , we'd get the w
8ff0: 72 6f 6e 67 20 61 6e 73 77 65 72 2e 0a 2a 2a 20  rong answer..** 
9000: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
9010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9020: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
9030: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
9040: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
9050: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
9060: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
9070: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
9080: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
9090: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
90a0: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
90b0: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
90c0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
90d0: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
90e0: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
90f0: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
9100: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
9110: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
9120: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
9130: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
9140: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
9150: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
9160: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
9170: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
9180: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
9190: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
91a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
91b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
91c0: 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20  e that builds a 
91d0: 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64  probe for an ind
91e0: 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a  ex.  Details:.**
91f0: 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20  .**    *  Check 
9200: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
9210: 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73  entries on the s
9220: 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a  tack.  If any.**
9230: 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20         of those 
9240: 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c  entries are NULL
9250: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
9260: 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20  ly to brk,.**   
9270: 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65      which is the
9280: 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63   loop exit, sinc
9290: 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79  e no index entry
92a0: 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20   will match.**  
92b0: 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74       if any part
92c0: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e   of the key is N
92d0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ULL..**.**    * 
92e0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f   Construct a pro
92f0: 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  be entry from th
9300: 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e  e top nColumn en
9310: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20  tries in.**     
9320: 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68    the stack with
9330: 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70 72   affinities appr
9340: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
9350: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
9360: 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65  c void buildInde
9370: 78 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c 20  xProbe(Vdbe *v, 
9380: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e 74  int nColumn, int
9390: 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49 64   brk, Index *pId
93a0: 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x){.  sqlite3Vdb
93b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
93c0: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20  Null, -nColumn, 
93d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
93e0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
93f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9400: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
9410: 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  umn, 0);.  sqlit
9420: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9430: 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b  P_Goto, 0, brk);
9440: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9450: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
9460: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
9470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65  );.  sqlite3Inde
9480: 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
9490: 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pIdx);.}.../*.**
94a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
94b0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
94c0: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
94d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
94e0: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
94f0: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
9500: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
9510: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
9520: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
9530: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
9540: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
9550: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
9560: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
9570: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
9580: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
9590: 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
95a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
95b0: 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
95c0: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
95d0: 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
95e0: 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
95f0: 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
9600: 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
9610: 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
9620: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9630: 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
9640: 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
9650: 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
9660: 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
9670: 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69   void codeEquali
9680: 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
9690: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
96a0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
96b0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
96c0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
96d0: 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
96e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
96f0: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
9700: 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20 20  nt brk,         
9710: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
9720: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c  to abandon the l
9730: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  oop */.  WhereLe
9740: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20  vel *pLevel  /* 
9750: 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68  When level of th
9760: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
9770: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
9780: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
9790: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
97a0: 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54  .  if( pX->op!=T
97b0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
97c0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  rt( pX->op==TK_E
97d0: 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Q );.    sqlite3
97e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
97f0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69   pX->pRight);.#i
9800: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9810: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
9820: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  se{.    int iTab
9830: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a  ;.    int *aIn;.
9840: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9850: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
9860: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
9870: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
9880: 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  X);.    iTab = p
9890: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
98a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
98b0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
98c0: 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64  ab, brk);.    Vd
98d0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
98e0: 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e   %.*s", pX->span
98f0: 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
9900: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
9910: 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
9920: 3e 61 49 6e 4c 6f 6f 70 20 3d 20 61 49 6e 20 3d  >aInLoop = aIn =
9930: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
9940: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a  Level->aInLoop,.
9950: 20 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 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
9980: 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a 70 4c  aInLoop[0])*3*pL
9990: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
99a0: 69 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20 20  if( aIn ){.     
99b0: 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   aIn += pLevel->
99c0: 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20  nIn*3 - 3;.     
99d0: 20 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78   aIn[0] = OP_Nex
99e0: 74 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20  t;.      aIn[1] 
99f0: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49  = iTab;.      aI
9a00: 6e 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  n[2] = sqlite3Vd
9a10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
9a20: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a  lumn, iTab, 0);.
9a30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a40: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30   pLevel->nIn = 0
9a50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9a60: 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
9a70: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
9a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9a90: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9aa0: 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
9ab0: 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
9ac0: 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
9ad0: 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65  ndex.  The value
9ae0: 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
9af0: 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f  aints are left o
9b00: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  n the stack..**.
9b10: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
9b20: 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
9b30: 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
9b40: 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
9b50: 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
9b60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9b70: 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
9b80: 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
9b90: 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
9ba0: 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
9bb0: 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
9bc0: 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
9bd0: 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
9be0: 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
9bf0: 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
9c00: 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
9c10: 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
9c20: 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
9c30: 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
9c40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
9c50: 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
9c60: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
9c70: 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
9c80: 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
9c90: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
9ca0: 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c   and b will be l
9cb0: 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  eft.** on the st
9cc0: 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64  ack - a is the d
9cd0: 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68 65  eepest and b the
9ce0: 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a   shallowest..**.
9cf0: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
9d00: 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
9d10: 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
9d20: 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
9d30: 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
9d40: 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
9d50: 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
9d60: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
9d70: 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
9d80: 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
9d90: 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
9da0: 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
9db0: 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a  em memory cell..
9dc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9dd0: 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
9de0: 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
9df0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
9e00: 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64   puts.** the add
9e10: 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d  ress of that mem
9e20: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76  ory cell in pLev
9e30: 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63  el->iMem.  The c
9e40: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
9e50: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
9e60: 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e  ill use pLevel->
9e70: 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68  iMem to store th
9e80: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
9e90: 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
9ea0: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
9eb0: 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
9ec0: 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
9ed0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
9ee0: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
9ef0: 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
9f00: 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
9f10: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
9f20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
9f30: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
9f40: 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
9f50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
9f60: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9f70: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
9f80: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
9f90: 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
9fa0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
9fb0: 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
9fc0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9fd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
9fe0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
9ff0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
a000: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
a010: 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
a020: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
a030: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20  ed */.  int brk 
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a050: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e   Jump here to en
a060: 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  d the loop */.){
a070: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65  .  int nEq = pLe
a080: 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20  vel->nEq;       
a090: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
a0a0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
a0b0: 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
a0c0: 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d  /.  int termsInM
a0d0: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  em = 0;         
a0e0: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74    /* If true, st
a0f0: 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d  ore value in mem
a100: 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64  [] cells */.  Vd
a110: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a120: 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
a130: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a140: 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
a150: 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
a160: 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
a170: 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20  >pIdx;   /* The 
a180: 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
a190: 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
a1a0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
a1b0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
a1c0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
a1d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
a1e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a1f0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
a200: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
a210: 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
a220: 20 69 6e 74 20 6a 3b 20 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 2f                 /
a240: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a250: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
a260: 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
a270: 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
a280: 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
a290: 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57  ate them..  ** W
a2a0: 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74  e always need at
a2b0: 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20   least one used 
a2c0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f  to store the loo
a2d0: 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a  p terminator.  *
a2e0: 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  * value.  If the
a2f0: 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74  re are IN operat
a300: 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f  ors we'll need o
a310: 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f  ne for each == o
a320: 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72  r.  ** IN constr
a330: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65  aint..  */.  pLe
a340: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
a350: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66  se->nMem++;.  if
a360: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
a370: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
a380: 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  N ){.    pParse-
a390: 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d  >nMem += pLevel-
a3a0: 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49  >nEq;.    termsI
a3b0: 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  nMem = 1;.  }.. 
a3c0: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
a3d0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
a3e0: 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  aints.  */.  for
a3f0: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
a400: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
a410: 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
a420: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
a430: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
a440: 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
a450: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
a460: 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_IN, pIdx);.   
a470: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
a480: 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
a490: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
a4a0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
a4b0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71 75  0 );.    codeEqu
a4c0: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
a4d0: 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
a4e0: 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 74  evel);.    if( t
a4f0: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
a500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a510: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
a520: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
a530: 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  +j+1, 1);.    }.
a540: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
a550: 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =nEq );..  /* Ma
a560: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
a570: 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
a580: 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70  s are on the top
a590: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20   of the stack.  
a5a0: 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e  */.  if( termsIn
a5b0: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  Mem ){.    for(j
a5c0: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
a5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a5e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
a5f0: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
a600: 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20  Mem+j+1, 0);.   
a610: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66   }.  }.}..#ifdef
a620: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
a630: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a640: 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
a650: 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
a660: 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
a670: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
a680: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
a690: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a6a0: 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
a6b0: 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
a6c0: 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
a6d0: 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
a6e0: 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
a6f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
a700: 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
a710: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
a720: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
a730: 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
a740: 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
a750: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
a760: 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
a770: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a780: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
a790: 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
a7a0: 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
a7b0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
a7c0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ..../*.** Genera
a7d0: 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
a7e0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
a7f0: 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
a800: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
a810: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
a820: 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
a830: 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
a840: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
a850: 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
a860: 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
a870: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
a880: 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
a890: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
a8a0: 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
a8b0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
a8c0: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
a8d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
a8e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
a8f0: 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
a900: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a910: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
a920: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a930: 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
a940: 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
a950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
a960: 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
a970: 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
a980: 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
a990: 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
a9a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
a9b0: 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
a9c0: 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
a9d0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
a9e0: 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
a9f0: 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
aa00: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
aa10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
aa20: 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
aa30: 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
aa40: 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
aa50: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
aa60: 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
aa70: 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
aa80: 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
aa90: 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
aaa0: 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
aab0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
aac0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
aad0: 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
aae0: 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
aaf0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
ab00: 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
ab10: 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
ab20: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
ab30: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
ab40: 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
ab50: 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
ab60: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
ab70: 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
aba0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
abb0: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
abc0: 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
abd0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
abe0: 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      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 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
ac10: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
ac20: 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
ac30: 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
ac40: 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
ac50: 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
ac60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
ac70: 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
ac80: 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
ac90: 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
aca0: 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
acb0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
acc0: 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
acd0: 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
ace0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
acf0: 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
ad00: 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
ad10: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
ad20: 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
ad30: 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
ad40: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
ad50: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
ad60: 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
ad70: 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
ad80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ad90: 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
ada0: 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
adb0: 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
adc0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
add0: 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
ade0: 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
adf0: 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
ae00: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
ae10: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
ae20: 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
ae30: 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
ae40: 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
ae50: 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
ae60: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
ae70: 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
ae80: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
ae90: 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
aea0: 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
aeb0: 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
aec0: 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
aed0: 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
aee0: 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
aef0: 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
af00: 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
af10: 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
af20: 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
af30: 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
af40: 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
af50: 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
af60: 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
af70: 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
af80: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
af90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
afa0: 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
afb0: 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
afc0: 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
afd0: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
afe0: 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
aff0: 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
b000: 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
b010: 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
b020: 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
b030: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
b040: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
b050: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
b060: 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
b070: 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
b080: 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
b090: 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
b0a0: 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
b0b0: 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
b0c0: 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
b0d0: 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
b0e0: 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
b0f0: 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
b100: 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
b110: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
b120: 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
b130: 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
b140: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
b150: 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
b160: 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
b170: 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
b180: 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
b190: 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
b1a0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
b1b0: 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
b1c0: 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
b1d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
b1e0: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
b1f0: 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
b200: 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
b210: 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
b220: 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
b230: 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
b240: 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
b250: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
b260: 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
b270: 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
b280: 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
b290: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
b2a0: 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
b2b0: 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
b2c0: 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
b2d0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
b2e0: 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
b2f0: 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
b300: 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
b310: 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
b320: 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
b330: 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
b340: 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
b350: 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
b360: 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
b370: 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
b380: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
b390: 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
b3a0: 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
b3b0: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
b3c0: 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
b3d0: 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
b3e0: 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
b3f0: 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
b400: 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
b410: 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
b420: 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
b430: 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
b440: 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
b450: 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
b460: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
b470: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
b480: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
b490: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
b4a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b4b0: 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
b4c0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
b4d0: 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
b4e0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
b4f0: 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
b500: 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
b510: 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
b520: 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
b530: 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
b540: 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
b550: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
b560: 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
b570: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b580: 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
b590: 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
b5a0: 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
b5b0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
b5c0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
b5d0: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
b5e0: 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
b5f0: 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
b600: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
b610: 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
b620: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
b630: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
b640: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
b650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
b660: 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
b670: 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
b680: 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
b690: 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
b6a0: 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
b6b0: 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
b6c0: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
b6d0: 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
b6e0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
b6f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b700: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
b710: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
b720: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
b730: 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
b740: 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
b750: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
b760: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
b770: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
b780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
b790: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
b7a0: 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f  OrderBy  /* An O
b7b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
b7c0: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
b7d0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b7f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b800: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
b810: 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
b820: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
b830: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
b840: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
b850: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
b860: 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
b870: 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
b880: 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
b890: 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20  int brk, cont = 
b8a0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  0;         /* Ad
b8b0: 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72  dresses used dur
b8c0: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
b8d0: 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
b8e0: 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
b8f0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
b900: 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
b910: 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
b920: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
b930: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
b940: 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74  single term in t
b950: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b960: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
b970: 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20   maskSet;       
b980: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
b990: 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
b9a0: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
b9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b9c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
b9d0: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
b9e0: 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  hese terms */.  
b9f0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
ba00: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
ba10: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72  /* A single entr
ba20: 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20  y from pTabList 
ba30: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
ba40: 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
ba50: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
ba60: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57   level in the pW
ba70: 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69  Info list */.  i
ba80: 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20  nt iFrom;       
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
baa0: 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46  * First unused F
bab0: 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
bac0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46  nt */.  int andF
bad0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
bae0: 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d     /* AND-ed com
baf0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  bination of all 
bb00: 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a  wc.a[].flags */.
bb10: 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
bb20: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
bb30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
bb40: 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
bb50: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
bb60: 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
bb70: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
bb80: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
bb90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bba0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bbb0: 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
bbc0: 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
bbd0: 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
bbe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69  ;.  }..  /* Spli
bbf0: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
bc00: 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
bc10: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
bc20: 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
bc30: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
bc40: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
bc50: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
bc60: 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
bc70: 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(&maskSet);.  w
bc80: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
bc90: 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 77  wc, pParse);.  w
bca0: 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20 70  hereSplit(&wc, p
bcb0: 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
bcc0: 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61      .  /* Alloca
bcd0: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
bce0: 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
bcf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
bd00: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
bd10: 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
bd20: 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  ..  */.  pWInfo 
bd30: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
bd40: 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
bd50: 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ) + pTabList->nS
bd60: 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  rc*sizeof(WhereL
bd70: 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73 71  evel));.  if( sq
bd80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
bd90: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
bda0: 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
bdb0: 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  .  }.  pWInfo->p
bdc0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
bdd0: 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
bde0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
bdf0: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
be00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
be10: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
be20: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
be30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
be40: 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
be50: 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
be60: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
be70: 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
be80: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
be90: 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
bea0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
beb0: 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  re && (pTabList-
bec0: 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nSrc==0 || sqli
bed0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
bee0: 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  t(pWhere)) ){.  
bef0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
bf00: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
bf10: 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
bf20: 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68  eak, 1);.    pWh
bf30: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
bf40: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
bf50: 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
bf60: 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
bf70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
bf80: 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
bf90: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
bfa0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
bfb0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
bfc0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
bfd0: 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
bfe0: 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
bff0: 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
c000: 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
c010: 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
c020: 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
c030: 61 74 20 74 68 65 79 20 61 64 64 65 64 20 76 69  at they added vi
c040: 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
c050: 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
c060: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
c070: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
c080: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
c090: 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  ateMask(&maskSet
c0a0: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
c0b0: 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  .iCursor);.  }. 
c0c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
c0d0: 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b 53  pTabList, &maskS
c0e0: 65 74 2c 20 26 77 63 29 3b 0a 20 20 69 66 28 20  et, &wc);.  if( 
c0f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
c100: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
c110: 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
c120: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
c130: 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
c140: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
c150: 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
c160: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
c170: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
c180: 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
c190: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
c1a0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
c1b0: 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
c1c0: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
c1d0: 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
c1e0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
c1f0: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c200: 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
c210: 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
c220: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
c230: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
c240: 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
c250: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
c260: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
c270: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
c280: 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
c290: 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
c2a0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
c2b0: 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
c2c0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
c2d0: 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
c2e0: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
c2f0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
c300: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c310: 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
c320: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
c330: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
c340: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
c350: 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
c360: 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
c370: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
c380: 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
c390: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
c3a0: 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
c3b0: 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
c3c0: 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
c3d0: 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
c3e0: 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
c3f0: 30 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  0;.  for(i=iFrom
c400: 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
c410: 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
c420: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
c430: 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
c440: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
c450: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c460: 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
c470: 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
c480: 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20     int flags;   
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4a0: 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61  * Flags asssocia
c4b0: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
c4c0: 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  .    int nEq;   
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
c4f0: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
c500: 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  ts */.    double
c510: 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
c520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
c530: 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  t for pIdx */.  
c540: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c560: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
c570: 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
c580: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73  .    Index *pBes
c590: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
c5a0: 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64   /* The best ind
c5b0: 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  ex seen so far *
c5c0: 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c  /.    int bestFl
c5d0: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
c5e0: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
c5f0: 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
c600: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
c610: 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
c620: 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63      /* nEq assoc
c630: 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
c640: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c   */.    double l
c650: 6f 77 65 73 74 43 6f 73 74 20 3d 20 31 2e 30 65  owestCost = 1.0e
c660: 39 39 3b 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74  99; /* Cost of t
c670: 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  he pBest */.    
c680: 69 6e 74 20 62 65 73 74 4a 3b 20 20 20 20 20 20  int bestJ;      
c690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c6a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
c6b0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
c6e0: 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
c6f0: 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 69   */..    for(j=i
c700: 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26  From, pTabItem=&
c710: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
c720: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
c730: 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
c740: 2b 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65  +){.      m = ge
c750: 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
c760: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
c770: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d  r);.      if( (m
c780: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
c790: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
c7a0: 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b  ==iFrom ) iFrom+
c7b0: 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
c7c0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
c7d0: 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e     cost = bestIn
c7e0: 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c  dex(pParse, &wc,
c7f0: 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
c800: 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
c810: 20 20 20 20 20 20 20 20 20 20 20 20 28 6a 3d 3d              (j==
c820: 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29 20  0 && ppOrderBy) 
c830: 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30  ? *ppOrderBy : 0
c840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c850: 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c 20           &pIdx, 
c860: 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20  &flags, &nEq);. 
c870: 20 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f       if( cost<lo
c880: 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
c890: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
c8a0: 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70   cost;.        p
c8b0: 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
c8c0: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
c8d0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
c8e0: 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20  bestNEq = nEq;. 
c8f0: 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
c900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c910: 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a  if( (pTabItem->j
c920: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
c930: 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  T)!=0.         |
c940: 7c 20 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49  | (j>0 && (pTabI
c950: 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  tem[-1].jointype
c960: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 29 0a   & JT_LEFT)!=0).
c970: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
c980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 62      }.    if( (b
c9a0: 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45  estFlags & WHERE
c9b0: 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a  _ORDERBY)!=0 ){.
c9c0: 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79        *ppOrderBy
c9d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
c9e0: 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74  andFlags &= best
c9f0: 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
ca00: 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46  l->flags = bestF
ca10: 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
ca20: 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a  ->pIdx = pBest;.
ca30: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20      pLevel->nEq 
ca40: 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70  = bestNEq;.    p
ca50: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d  Level->aInLoop =
ca60: 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   0;.    pLevel->
ca70: 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nIn = 0;.    if(
ca80: 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
ca90: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
caa0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
cab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cac0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
cad0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ur = -1;.    }. 
cae0: 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
caf0: 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
cb00: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  , pTabList->a[be
cb10: 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  stJ].iCursor);. 
cb20: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
cb30: 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 0a 20   = bestJ;.  }.. 
cb40: 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c   /* If the total
cb50: 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65   query only sele
cb60: 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  cts a single row
cb70: 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52  , then the ORDER
cb80: 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20   BY.  ** clause 
cb90: 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20  is irrelevant.. 
cba0: 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c   */.  if( (andFl
cbb0: 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
cbc0: 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65  UE)!=0 && ppOrde
cbd0: 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72  rBy ){.    *ppOr
cbe0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
cbf0: 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
cc00: 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
cc10: 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
cc20: 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
cc30: 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
cc40: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
cc50: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
cc60: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
cc70: 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
cc80: 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
cc90: 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
cca0: 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  .  pLevel = pWIn
ccb0: 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  fo->a;.  for(i=0
ccc0: 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
ccd0: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
cce0: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
ccf0: 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
cd00: 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78  *pTab;.    Index
cd10: 20 2a 70 49 78 3b 0a 20 20 20 20 69 6e 74 20 69   *pIx;.    int i
cd20: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
cd30: 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 70  >iIdxCur;..    p
cd40: 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
cd50: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
cd60: 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
cd70: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
cd80: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
cd90: 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70  isTransient || p
cda0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
cdb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
cdc0: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
cdd0: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
cde0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
cdf0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
ce00: 72 52 65 61 64 69 6e 67 28 76 2c 20 70 54 61 62  rReading(v, pTab
ce10: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
ce20: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
ce30: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
ce40: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
ce50: 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49  sor;.    if( (pI
ce60: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
ce70: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
ce80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ce90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
cea0: 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  x->iDb, 0);.    
ceb0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cec0: 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e 7a  , "# %s", pIx->z
ced0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
cee0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cef0: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
cf00: 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
cf10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49        (char*)&pI
cf30: 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
cf40: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20  EYINFO);.    }. 
cf50: 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
cf60: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
cf70: 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  X_ONLY)!=0 ){.  
cf80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cf90: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
cfa0: 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75  mColumns, iIdxCu
cfb0: 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  r, pIx->nColumn+
cfc0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
cfd0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
cfe0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
cff0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20  ab->iDb);.  }.  
d000: 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
d010: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d020: 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
d030: 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
d040: 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
d050: 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
d060: 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
d070: 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
d080: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
d090: 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
d0a0: 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
d0b0: 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
d0c0: 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
d0d0: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
d0e0: 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
d0f0: 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
d100: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
d110: 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
d120: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20   int j;.    int 
d130: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
d140: 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68  >iCursor;  /* Th
d150: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
d160: 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
d170: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
d180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
d190: 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
d1a0: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
d1b0: 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a  IdxCur;       /*
d1c0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
d1d0: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
d1e0: 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61  /.    int omitTa
d1f0: 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  ble;     /* True
d200: 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
d210: 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20  ndex only */.   
d220: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
d230: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
d240: 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
d250: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
d260: 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  */..    pTabItem
d270: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
d280: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
d290: 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49      iCur = pTabI
d2a0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
d2b0: 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
d2c0: 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  >pIdx;.    iIdxC
d2d0: 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
d2e0: 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d  xCur;.    bRev =
d2f0: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
d300: 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
d310: 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62  !=0;.    omitTab
d320: 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  le = (pLevel->fl
d330: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
d340: 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  ONLY)!=0;..    /
d350: 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
d360: 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
d370: 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
d380: 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20  nstructions.    
d390: 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
d3a0: 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
d3b0: 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  o brk to break o
d3c0: 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
d3d0: 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
d3e0: 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
d3f0: 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
d400: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
d410: 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  .    ** loop..  
d420: 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70    */.    brk = p
d430: 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c  Level->brk = sql
d440: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d450: 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d  l(v);.    cont =
d460: 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20   pLevel->cont = 
d470: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d480: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
d490: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
d4a0: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
d4b0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
d4c0: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
d4d0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
d4e0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
d4f0: 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
d500: 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
d510: 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77  s any.    ** row
d520: 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
d530: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
d540: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
d550: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
d560: 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e  & (pTabItem[-1].
d570: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
d580: 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
d590: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65  if( !pParse->nMe
d5a0: 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
d5b0: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ++;.      pLevel
d5c0: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50  ->iLeftJoin = pP
d5d0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
d5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
d600: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
d610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d620: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
d630: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
d640: 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
d650: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
d660: 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
d670: 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
d680: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
d690: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
d6a0: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
d6b0: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
d6c0: 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
d6d0: 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
d6e0: 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
d6f0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
d700: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
d710: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
d720: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
d730: 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
d740: 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
d750: 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
d760: 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
d770: 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
d780: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
d790: 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
d7a0: 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  /.      pTerm = 
d7b0: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
d7c0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
d7d0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
d7e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d7f0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
d800: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
d810: 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
d830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
d840: 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
d850: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
d860: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  0 );.      codeE
d870: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
d880: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
d890: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  pLevel);.      s
d8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d8b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
d8c0: 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   1, brk);.      
d8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8e0: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
d8f0: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
d900: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d910: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
d920: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
d930: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
d940: 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
d950: 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
d960: 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  D_RANGE ){.     
d970: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
d980: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
d990: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
d9a0: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
d9b0: 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
d9c0: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
d9d0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
d9e0: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
d9f0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
da00: 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
da10: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
da20: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
da30: 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
da40: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
da50: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
da60: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
da70: 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
da80: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
da90: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
daa0: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
dab0: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
dac0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
dad0: 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  pStart;.        
dae0: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
daf0: 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54         pEnd = pT
db00: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
db10: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
db20: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
db30: 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
db40: 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
db50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
db60: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
db70: 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
db80: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
db90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
dba0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
dbb0: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
dbc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dbd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dbe0: 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70  ForceInt, pX->op
dbf0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LE || pX->o
dc00: 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a  p==TK_GT, brk);.
dc10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc20: 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
dc30: 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f   ? OP_MoveLt : O
dc40: 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20  P_MoveGe, iCur, 
dc50: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64  brk);.        Vd
dc60: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
dc70: 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69  k"));.        di
dc80: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
dc90: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
dca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dcb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dcc0: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
dcd0: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
dce0: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
dcf0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
dd00: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
dd10: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
dd20: 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
dd30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
dd40: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
dd50: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
dd60: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
dd70: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
dd80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
dd90: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
dda0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
ddb0: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
ddc0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
ddd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dde0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
ddf0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
de00: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
de10: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
de20: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
de30: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
de40: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
de50: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
de60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de70: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
de80: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
de90: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
dea0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
deb0: 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
dec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
ded0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
dee0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
def0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
df00: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
df10: 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
df20: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
df30: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
df40: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
df50: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
df60: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
df70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
df90: 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  id, iCur, 0);.  
dfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dfb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
dfc0: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
dfd0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
dfe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dff0: 28 76 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27 2c  (v, testOp, 'n',
e000: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
e010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
e020: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
e030: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
e040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
e050: 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c   3: The WHERE cl
e060: 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72  ause term that r
e070: 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67  efers to the rig
e080: 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ht-most.      **
e090: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
e0a0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
e0b0: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
e0c0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
e0d0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e0e0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e   the index is on
e0f0: 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65   (x,y,z) and the
e100: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
e110: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
e120: 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78           form "x
e130: 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65  =5 AND y<10" the
e140: 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75  n this case is u
e150: 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20  sed.  Only the. 
e160: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
e170: 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
e180: 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
e190: 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
e1a0: 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  t must.      ** 
e1b0: 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
e1c0: 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
e1d0: 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
e1e0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
e1f0: 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
e200: 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
e210: 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
e220: 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a  E clause.      *
e230: 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
e240: 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
e250: 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
e260: 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
e270: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e280: 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
e290: 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
e2a0: 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
e2b0: 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  R BY..      */. 
e2c0: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
e2d0: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
e2e0: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20  pLevel->nEq;.   
e2f0: 20 20 20 69 6e 74 20 6c 65 46 6c 61 67 3d 30 2c     int leFlag=0,
e300: 20 67 65 46 6c 61 67 3d 30 3b 0a 20 20 20 20 20   geFlag=0;.     
e310: 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20   int testOp;.   
e320: 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20     int topLimit 
e330: 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
e340: 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
e350: 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e  IT)!=0;.      in
e360: 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c  t btmLimit = (pL
e370: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e380: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
e390: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  0;..      /* Gen
e3a0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
e3b0: 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
e3c0: 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
e3d0: 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20  g == or IN.     
e3e0: 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68   ** and level th
e3f0: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
e400: 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73  e terms on the s
e410: 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tack..      */. 
e420: 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61       codeAllEqua
e430: 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
e440: 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e  , pLevel, &wc, n
e450: 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a  otReady, brk);..
e460: 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61        /* Duplica
e470: 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
e480: 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61  term values beca
e490: 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  use they will al
e4a0: 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73  l be.      ** us
e4b0: 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74  ed twice: once t
e4c0: 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69  o make the termi
e4d0: 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f  nation key and o
e4e0: 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  nce to make the.
e4f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b        ** start k
e500: 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
e510: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
e520: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; j++){.       
e530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e540: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71  p(v, OP_Dup, nEq
e550: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  -1, 0);.      }.
e560: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
e570: 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  te the terminati
e580: 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73  on key.  This is
e590: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
e5a0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  hat.      ** wil
e5b0: 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63 68  l end the search
e5c0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74  .  There is no t
e5d0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69  ermination key i
e5e0: 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  f there.      **
e5f0: 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79   are no equality
e600: 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58   terms and no "X
e610: 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20  <..." term..    
e620: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30    **.      ** 20
e630: 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20  02-Dec-04: On a 
e640: 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
e650: 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65  an, the so-calle
e660: 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a  d "termination".
e670: 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d        ** key com
e680: 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c  puted here reall
e690: 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
e6a0: 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20  the start key.. 
e6b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e6c0: 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ( topLimit ){.  
e6d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
e6e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
e6f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e700: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
e710: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
e720: 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
e730: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
e740: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
e750: 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
e760: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
e770: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
e780: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
e790: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
e7a0: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
e7b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e7c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e7d0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
e7e0: 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20 70        leFlag = p
e7f0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20 20  X->op==TK_LE;.  
e800: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
e810: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
e820: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  ;.        testOp
e830: 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20   = OP_IdxGE;.   
e840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e850: 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30    testOp = nEq>0
e860: 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50   ? OP_IdxGE : OP
e870: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 6c  _Noop;.        l
e880: 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20  eFlag = 1;.     
e890: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65 73   }.      if( tes
e8a0: 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
e8b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
e8c0: 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69   = nEq + topLimi
e8d0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  t;.        pLeve
e8e0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
e8f0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
e900: 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
e910: 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c 20  e(v, nCol, brk, 
e920: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
e930: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
e940: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 6c 65       int op = le
e950: 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65  Flag ? OP_MoveLe
e960: 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20   : OP_MoveLt;.  
e970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e980: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
e990: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
e9a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e9b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e9c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e9d0: 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
e9e0: 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
e9f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ea00: 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
ea10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ea20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
ea30: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
ea60: 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73  start key.  This
ea70: 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74   is the key that
ea80: 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77   defines the low
ea90: 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e  er.      ** boun
eaa0: 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e  d on the search.
eab0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74    There is no st
eac0: 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65  art key if there
ead0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a   are no.      **
eae0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
eaf0: 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
eb00: 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e  no "X>..." term.
eb10: 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68    In.      ** th
eb20: 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  at case, generat
eb30: 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73  e a "Rewind" ins
eb40: 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63  truction in plac
eb50: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
eb60: 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72  * start key sear
eb70: 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ch..      **.   
eb80: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
eb90: 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  4: In the case o
eba0: 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  f a reverse-orde
ebb0: 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f  r search, the so
ebc0: 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a  -called.      **
ebd0: 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61   "start" key rea
ebe0: 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e  lly ends up bein
ebf0: 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65  g used as the te
ec00: 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20  rmination key.. 
ec10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
ec20: 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  ( btmLimit ){.  
ec30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
ec40: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
ec50: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
ec60: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
ec70: 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
ec80: 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
ec90: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
eca0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ecb0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
ecc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
ecd0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
ece0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
ecf0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
ed00: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
ed10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ed20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ed30: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
ed40: 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20 70        geFlag = p
ed50: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20 20  X->op==TK_GE;.  
ed60: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
ed70: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
ed80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ed90: 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20         geFlag = 
eda0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
edb0: 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74   if( nEq>0 || bt
edc0: 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
edd0: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71    int nCol = nEq
ede0: 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20   + btmLimit;.   
edf0: 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
ee00: 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72  robe(v, nCol, br
ee10: 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
ee20: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
ee30: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
ee40: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
ee50: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Mem++;.         
ee60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee70: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
ee80: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
ee90: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  1);.          te
eea0: 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b  stOp = OP_IdxLT;
eeb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
eec0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
eed0: 20 3d 20 67 65 46 6c 61 67 20 3f 20 4f 50 5f 4d   = geFlag ? OP_M
eee0: 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47  oveGe : OP_MoveG
eef0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
ef00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ef10: 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72   op, iIdxCur, br
ef20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
ef30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
ef40: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ev ){.        te
ef50: 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
ef60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ef70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ef80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
ef90: 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  nd, iIdxCur, brk
efa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
efb0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
efc0: 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  e the top of the
efd0: 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72 65   loop.  If there
efe0: 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f   is a terminatio
eff0: 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 77  n.      ** key w
f000: 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20 66  e have to test f
f010: 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64 20  or that key and 
f020: 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f 70  abort at the top
f030: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
f040: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
f050: 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
f060: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f070: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69  Addr(v);.      i
f080: 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
f090: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  op ){.        sq
f0a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f0b0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
f0c0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
f0d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f0e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74  dbeAddOp(v, test
f0f0: 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Op, iIdxCur, brk
f100: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
f110: 6c 65 46 6c 61 67 20 26 26 20 21 62 52 65 76 29  leFlag && !bRev)
f120: 20 7c 7c 20 28 21 67 65 46 6c 61 67 20 26 26 20   || (!geFlag && 
f130: 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  bRev) ){.       
f140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f150: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b  angeP3(v, -1, "+
f160: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
f170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f190: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
f1a0: 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
f1b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f1c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f1d0: 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 20 2b  IdxIsNull, nEq +
f1e0: 20 74 6f 70 4c 69 6d 69 74 2c 20 63 6f 6e 74 29   topLimit, cont)
f1f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  ;.      if( !omi
f200: 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
f210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f220: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  Op(v, OP_IdxRowi
f230: 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  d, iIdxCur, 0);.
f240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
f260: 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b  oveGe, iCur, 0);
f270: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f280: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
f290: 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
f2a0: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
f2b0: 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
f2c0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
f2d0: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
f2e0: 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
f2f0: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
f300: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  IdxCur;.      pL
f310: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
f320: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f330: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
f340: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
f350: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
f360: 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e   4:  There is an
f370: 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74   index and all t
f380: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
f390: 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20  E clause that.  
f3a0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
f3b0: 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64  refer to the ind
f3c0: 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d  ex using the "==
f3d0: 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
f3e0: 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ors..      */.  
f3f0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
f400: 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
f410: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20  Level->nEq;..   
f420: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
f430: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
f440: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
f450: 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
f460: 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
f470: 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75 65   leave the value
f480: 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
f490: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
f4a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
f4b0: 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
f4c0: 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  ms(pParse, pLeve
f4d0: 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79  l, &wc, notReady
f4e0: 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f  , brk);..      /
f4f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e  * Generate a sin
f500: 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69 6c  gle key that wil
f510: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f 74  l be used to bot
f520: 68 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d  h start and term
f530: 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  inate.      ** t
f540: 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20 20  he search.      
f550: 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64 49 6e  */.      buildIn
f560: 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c  dexProbe(v, nEq,
f570: 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
f580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f590: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
f5a0: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
f5b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
f5c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 31  Generate code (1
f5d0: 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65  ) to move to the
f5e0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
f5f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
f600: 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
f610: 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f 64  hen generate cod
f620: 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70 73  e (2) that jumps
f630: 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72 20   to "brk" after 
f640: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 61  the cursor is pa
f650: 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  st.      ** the 
f660: 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c  last matching el
f670: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
f680: 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28 31  le.  The code (1
f690: 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20 20  ) is executed.  
f6a0: 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69      ** once to i
f6b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 65  nitialize the se
f6c0: 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20 28  arch, the code (
f6d0: 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20 62  2) is executed b
f6e0: 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20 20  efore each.     
f6f0: 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66   ** iteration of
f700: 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65 65   the scan to see
f710: 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61 73   if the scan has
f720: 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20   finished. */.  
f730: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
f740: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
f750: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
f760: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
f770: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f780: 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43  OP_MoveLe, iIdxC
f790: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
f7a0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
f7b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f7c0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
f7d0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
f7e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f7f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54  ddOp(v, OP_IdxLT
f800: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
f810: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
f820: 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
f830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f840: 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74      /* Scan in t
f850: 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
f860: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
f870: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f880: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43  OP_MoveGe, iIdxC
f890: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
f8a0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
f8b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f8c0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
f8d0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f8f0: 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20  p3(v, OP_IdxGE, 
f900: 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b  iIdxCur, brk, "+
f910: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
f920: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f         pLevel->o
f930: 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
f940: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f950: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f960: 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75  P_RowKey, iIdxCu
f970: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f980: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f990: 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e   OP_IdxIsNull, n
f9a0: 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  Eq, cont);.     
f9b0: 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
f9c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f9d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f9e0: 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
f9f0: 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
fa00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa10: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
fa20: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
fa30: 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
fa40: 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
fa50: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
fa60: 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73   start;.    }els
fa70: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  e{.      /* Case
fa80: 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   5:  There is no
fa90: 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
faa0: 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
fab0: 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20  plete.      **  
fac0: 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
fad0: 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
fae0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
faf0: 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
fb00: 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  le==0 );.      a
fb10: 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29  ssert( bRev==0 )
fb20: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
fb30: 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
fb40: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
fb50: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
fb60: 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
fb70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fb80: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
fb90: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  r, brk);.    }. 
fba0: 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
fbb0: 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
fbc0: 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a  , iCur);..    /*
fbd0: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
fbe0: 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
fbf0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
fc00: 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
fc10: 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
fc20: 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
fc30: 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
fc40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
fc50: 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63  pTerm=wc.a, j=wc
fc60: 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  .nTerm; j>0; j--
fc70: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
fc80: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
fc90: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
fca0: 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
fcb0: 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
fcc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
fcd0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
fce0: 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
fcf0: 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
fd00: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54 65  ;.      pE = pTe
fd10: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
fd20: 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
fd30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
fd40: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
fd50: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
fd60: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
fd70: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
fd80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fda0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
fdb0: 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20   pE, cont, 1);. 
fdc0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
fdd0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
fde0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
fdf0: 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
fe00: 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
fe10: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
fe20: 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
fe30: 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61  at.    ** at lea
fe40: 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
fe50: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
fe60: 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
fe70: 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20  ft table.  .    
fe80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
fe90: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
fea0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f        pLevel->to
feb0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
fec0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
fed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
fef0: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
ff00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff10: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
ff20: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  e, pLevel->iLeft
ff30: 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  Join, 1);.      
ff40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ff50: 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  "# record LEFT J
ff60: 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
ff70: 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
ff80: 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72  , j=0; j<wc.nTer
ff90: 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
ffa0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
ffb0: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45  erm->flags & (TE
ffc0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
ffd0: 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
ffe0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
fff0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
10000 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
10010 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10020 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10030 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
10040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
10050 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
10060 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e  Term->pExpr, con
10070 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 1);.        p
10080 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
10090 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20  ERM_CODED;.     
100a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
100b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
100c0 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67    /* For testing
100d0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
100e0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20  se only */.  /* 
100f0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75  Record in the qu
10100 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61  ery plan informa
10110 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
10120 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a  urrent table.  *
10130 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
10140 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69  used to access i
10150 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20  t (if any).  If 
10160 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
10170 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
10180 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a  d, its name is j
10190 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f  ust '{}'.  If no
101a0 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20   index is used. 
101b0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
101c0 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e   listed as "{}".
101d0 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79    If the primary
101e0 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65   key is used the
101f0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65  .  ** index name
10200 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20   is '*'..  */.  
10210 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
10220 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
10230 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
10240 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65    int n;.    pLe
10250 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
10260 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65  [i];.    pTabIte
10270 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
10280 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
10290 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65  .    z = pTabIte
102a0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69  m->zAlias;.    i
102b0 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54  f( z==0 ) z = pT
102c0 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
102d0 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  ame;.    n = str
102e0 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  len(z);.    if( 
102f0 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
10300 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
10310 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20  plan)-10 ){.    
10320 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
10330 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
10340 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
10350 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
10360 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
10370 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20  n], "{}");.     
10380 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
10390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
103a0 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
103b0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
103c0 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20  nQPlan], z);.   
103d0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
103e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
103f0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
10400 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
10410 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   ';.    }.    if
10420 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
10430 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
10440 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
10450 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74  NGE) ){.      st
10460 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
10470 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
10480 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e  , "* ");.      n
10490 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
104a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
104b0 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ->pIdx==0 ){.   
104c0 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
104d0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
104e0 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20  Plan], "{} ");. 
104f0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
10500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10510 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c     n = strlen(pL
10520 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
10530 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
10540 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
10550 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
10560 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
10570 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
10580 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
10590 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64  an], pLevel->pId
105a0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
105b0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
105c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
105d0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
105e0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
105f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10600 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
10610 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
10620 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
10630 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
10640 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
10650 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
10660 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
10670 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
10680 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
10690 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
106a0 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
106b0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
106c0 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
106d0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
106e0 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
106f0 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
10700 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
10710 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
10720 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
10730 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43   */.  pWInfo->iC
10740 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a  ontinue = cont;.
10750 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
10760 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72  ar(&wc);.  retur
10770 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
10780 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
10790 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
107a0 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20  reBeginNoMem:.  
107b0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
107c0 28 26 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 46  (&wc);.  sqliteF
107d0 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72  ree(pWInfo);.  r
107e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
107f0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
10800 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
10810 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
10820 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
10830 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
10840 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
10850 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
10860 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
10870 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
10880 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
10890 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
108a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
108b0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
108c0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
108d0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
108e0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
108f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
10900 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
10910 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   code..  */.  fo
10920 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  r(i=pTabList->nS
10930 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rc-1; i>=0; i--)
10940 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
10950 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
10960 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10970 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
10980 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20  vel->cont);.    
10990 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
109a0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
109b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109c0 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  p(v, pLevel->op,
109d0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
109e0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  vel->p2);.    }.
109f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
10a00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
10a10 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
10a20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e   if( pLevel->nIn
10a30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   ){.      int *a
10a40 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
10a50 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
10a60 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65  l->nIn, a=&pLeve
10a70 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33  l->aInLoop[j*3-3
10a80 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d  ]; j>0; j--, a-=
10a90 33 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3){.        sqli
10aa0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10ab0 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
10ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10ad0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76   sqliteFree(pLev
10ae0 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  el->aInLoop);.  
10af0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
10b00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
10b10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10b20 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10b40 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
10b50 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c  evel->iLeftJoin,
10b60 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10b70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10b80 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61 64  P_NotNull, 1, ad
10b90 64 72 2b 34 20 2b 20 28 70 4c 65 76 65 6c 2d 3e  dr+4 + (pLevel->
10ba0 69 49 64 78 43 75 72 3e 3d 30 29 29 3b 0a 20 20  iIdxCur>=0));.  
10bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10bc0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  ddOp(v, OP_NullR
10bd0 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
10be0 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a  i].iCursor, 0);.
10bf0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
10c00 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a  ->iIdxCur>=0 ){.
10c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
10c30 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
10c40 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
10c50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10c60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10c70 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
10c80 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  l->top);.    }. 
10c90 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
10ca0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
10cb0 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
10cc0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
10cd0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
10ce0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
10cf0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10d00 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
10d10 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43  iBreak);..  /* C
10d20 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
10d30 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
10d40 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
10d50 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
10d60 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
10d70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
10d80 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
10d90 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
10da0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
10db0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
10dc0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
10dd0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
10de0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
10df0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
10e00 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
10e10 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
10e20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
10e30 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e  nsient || pTab->
10e40 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
10e50 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  ue;.    if( (pLe
10e60 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
10e70 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
10e80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10e90 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10ea0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
10eb0 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  >iCursor, 0);.  
10ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
10ed0 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20  el->pIdx!=0 ){. 
10ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ef0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
10f00 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
10f10 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ur, 0);.    }.. 
10f20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f     /* Make curso
10f30 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  r substitutions 
10f40 66 6f 72 20 63 61 73 65 73 20 77 68 65 72 65 20  for cases where 
10f50 77 65 20 77 61 6e 74 20 74 6f 20 75 73 65 0a 20  we want to use. 
10f60 20 20 20 2a 2a 20 6a 75 73 74 20 74 68 65 20 69     ** just the i
10f70 6e 64 65 78 20 61 6e 64 20 6e 65 76 65 72 20 72  ndex and never r
10f80 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
10f90 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  le..    ** .    
10fa0 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
10fb0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
10fc0 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
10fd0 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
10fe0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
10ff0 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
11000 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
11010 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
11020 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
11030 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
11040 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
11050 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
11060 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
11070 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
11080 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
11090 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
110a0 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
110b0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
110c0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
110d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
110e0 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
110f0 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
11100 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c 61 73     int i, j, las
11110 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  t;.      VdbeOp 
11120 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65  *pOp;.      Inde
11130 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  x *pIdx = pLevel
11140 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61  ->pIdx;..      a
11150 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
11160 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
11170 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
11180 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b  , pWInfo->iTop);
11190 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
111a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
111b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
111c0 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f  or(i=pWInfo->iTo
111d0 70 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c 20  p; i<last; i++, 
111e0 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
111f0 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
11200 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
11210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11220 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
11230 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
11240 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
11250 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
11260 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ur;.          fo
11270 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
11280 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
11290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
112a0 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43  p->p2==pIdx->aiC
112b0 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20  olumn[j] ){.    
112c0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
112d0 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  2 = j;.         
112e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
112f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
11310 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
11320 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
11330 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
11340 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
11350 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
11360 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
11370 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
11380 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
11390 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c  ->opcode==OP_Nul
113a0 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  lRow ){.        
113b0 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
113c0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
113d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
113e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
113f0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
11400 73 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66  sqliteFree(pWInf
11410 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.