/ Hex Artifact Content
Login

Artifact f794d15f5f0503b7b5cdb3fa49fd1f76c015e80d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 32 35   where.c,v 1.225
0340: 20 32 30 30 36 2f 30 36 2f 32 37 20 30 32 3a 33   2006/06/27 02:3
0350: 33 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  3:40 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
03f0: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
0400: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0410: 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  array..*/.#defin
0420: 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20 20  e ARRAYSIZE(X)  
0430: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
0440: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
0450: 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63  Trace output mac
0460: 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ros.*/.#if defin
0470: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
0480: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0490: 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71 6c  E_DEBUG).int sql
04a0: 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65  ite3_where_trace
04b0: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 54   = 0;.# define T
04c0: 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c 69  RACE(X)  if(sqli
04d0: 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29  te3_where_trace)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  ntf X.#else.# de
0500: 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65  fine TRACE(X).#e
0510: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
0520: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
0530: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0540: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
0550: 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ause;../*.** The
0560: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
0570: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
0580: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
0590: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
05a0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
05b0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
05c0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
05d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
05e0: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
05f0: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0600: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0610: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0620: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
0630: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
0640: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
0650: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
0660: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
0670: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
0680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
0690: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
06a0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
06b0: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
06c0: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
06d0: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
06e0: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
06f0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
0710: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
0720: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
0730: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
0740: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
0750: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
0760: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
0770: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
0780: 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c  hereTerm.leftCol
0790: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07a0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07b0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07c0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07d0: 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63  erm.operator rec
07e0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
07f0: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
0800: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
0810: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
0820: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
0830: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
0840: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
0850: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
0860: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
0870: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
0880: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
0890: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
08a0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
08b0: 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20  .** prereqRight 
08c0: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
08d0: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
08e0: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
08f0: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0900: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0910: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0920: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0930: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0940: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0950: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0960: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0970: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0980: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0990: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
09a0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
09b0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
09c0: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
09d0: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
09e0: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
09f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0a00: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0a10: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0a20: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0a30: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0a40: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0a50: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0a60: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0a70: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0a80: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
0a90: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
0aa0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
0ab0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0ac0: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0ad0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0ae0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0af0: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0b00: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0b10: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0b20: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0b30: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0b40: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0b50: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
0b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
0b70: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
0b80: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
0b90: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f   0 through 7..*/
0ba0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bb0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0bc0: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0bd0: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0be0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0bf0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0c00: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0c10: 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65  n */.  i16 iPare
0c20: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
0c30: 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61  * Disable pWC->a
0c40: 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74  [iParent] when t
0c50: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0c60: 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43  d */.  i16 leftC
0c70: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0c80: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0c90: 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20  of X in "X <op> 
0ca0: 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36  <expr>" */.  i16
0cb0: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
0cc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0cd0: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0ce0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0cf0: 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72  .  u16 eOperator
0d00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
0d10: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
0d20: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
0d30: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20           /* Bit 
0d50: 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f  flags.  See belo
0d60: 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64  w */.  u8 nChild
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0d80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  * Number of chil
0d90: 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64  dren that must d
0da0: 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57  isable us */.  W
0db0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c         /* The cl
0dd0: 61 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69  ause this term i
0de0: 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42  s part of */.  B
0df0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67  itmask prereqRig
0e00: 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ht;    /* Bitmas
0e10: 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  k of tables used
0e20: 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20   by pRight */.  
0e30: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
0e40: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
0e50: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
0e60: 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a  erenced by p */.
0e70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
0e80: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
0e90: 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23  eTerm.flags.*/.#
0ea0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
0eb0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
0ec0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
0ed0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ee0: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
0ef0: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
0f00: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
0f10: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
0f20: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
0f30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f40: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
0f50: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
0f60: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
0f70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f80: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
0f90: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
0fa0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
0fb0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31  M_OR_OK      0x1
0fc0: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
0fd0: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
0fe0: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
0ff0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1010: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1020: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1030: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1040: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1050: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1060: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1070: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1080: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1090: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
10a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
10b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
10c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
10d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
10e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10f0: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
1100: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
1110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1120: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1130: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
1140: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
1150: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
1160: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
1170: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
1180: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1190: 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20  m aStatic[10];  
11a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
11b0: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
11c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
11e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
11f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1200: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1210: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1220: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1230: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1240: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1250: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1260: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1270: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1280: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1290: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
12a0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
12b0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
12c0: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
12d0: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
12e0: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
12f0: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1310: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1320: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1330: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1340: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1350: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1360: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1370: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1380: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1390: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
13a0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
13b0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
13c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
13d0: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
13e0: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
13f0: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1400: 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65  ** If ExprMaskSe
1410: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
1420: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
1430: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
1440: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
1450: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
1460: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
1470: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
1480: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
1490: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
14a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
14c0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
14d0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
14e0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
14f0: 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d   Then the  ExprM
1500: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
1510: 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68  .** would map th
1520: 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ose cursor numbe
1530: 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74  rs into bits 0 t
1540: 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20  hrough 5..**.** 
1550: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  Note that the ma
1560: 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  pping is not nec
1570: 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64  essarily ordered
1580: 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  .  In the exampl
1590: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20  e.** above, the 
15a0: 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f  mapping might go
15b0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e   like this:  4->
15c0: 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32  3, 5->1, 8->2, 2
15d0: 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20  9->0,.** 57->5, 
15e0: 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f  73->4.  Or one o
15f0: 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62  f 719 other comb
1600: 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62  inations might b
1610: 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f  e used. It.** do
1620: 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61  es not really ma
1630: 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69  tter.  What is i
1640: 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74  mportant is that
1650: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a   sparse cursor.*
1660: 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65  * numbers all ge
1670: 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69  t mapped into bi
1680: 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62  t numbers that b
1690: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
16a0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61  contain.** no ga
16b0: 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ps..*/.typedef s
16c0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16d0: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73  t ExprMaskSet;.s
16e0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16f0: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1720: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1730: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1740: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
1750: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
1760: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1770: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
1780: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
1790: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
17a0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
17b0: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
17c0: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
17d0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
17e0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
17f0: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1800: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1810: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1820: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1830: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1840: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
1850: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
1860: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
1870: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
1880: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
1890: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
18a0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
18b0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
18c0: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
18d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
18e0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18f0: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
1900: 65 20 57 4f 5f 4d 41 54 43 48 20 20 36 34 0a 0a  e WO_MATCH  64..
1910: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
1920: 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1930: 79 20 62 65 73 74 49 6e 64 65 78 28 29 0a 2a 2f  y bestIndex().*/
1940: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1950: 4f 57 49 44 5f 45 51 20 20 20 20 20 20 20 30 78  OWID_EQ       0x
1960: 30 30 30 31 20 20 20 2f 2a 20 72 6f 77 69 64 3d  0001   /* rowid=
1970: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
1980: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1990: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  e WHERE_ROWID_RA
19a0: 4e 47 45 20 20 20 20 30 78 30 30 30 32 20 20 20  NGE    0x0002   
19b0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
19c0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
19d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
19e0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 20 20  _COLUMN_EQ      
19f0: 30 78 30 30 31 30 20 20 20 2f 2a 20 78 3d 45 58  0x0010   /* x=EX
1a00: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
1a10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1a20: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 20  E_COLUMN_RANGE  
1a30: 20 30 78 30 30 32 30 20 20 20 2f 2a 20 78 3c 45   0x0020   /* x<E
1a40: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
1a50: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1a60: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
1a70: 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20 78 20    0x0040   /* x 
1a80: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1a90: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
1aa0: 4d 49 54 20 20 20 20 20 20 30 78 30 31 30 30 20  MIT      0x0100 
1ab0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
1ac0: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
1ad0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
1ae0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
1af0: 20 20 30 78 30 32 30 30 20 20 20 2f 2a 20 78 3e    0x0200   /* x>
1b00: 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20  EXPR or x>=EXPR 
1b10: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
1b20: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f  efine WHERE_IDX_
1b30: 4f 4e 4c 59 20 20 20 20 20 20 20 30 78 30 38 30  ONLY       0x080
1b40: 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  0   /* Use index
1b50: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
1b60: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
1b70: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
1b80: 20 20 20 30 78 31 30 30 30 20 20 20 2f 2a 20 4f     0x1000   /* O
1b90: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
1ba0: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
1bb0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1bc0: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
1bd0: 20 20 20 30 78 32 30 30 30 20 20 20 2f 2a 20 53     0x2000   /* S
1be0: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1bf0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1c00: 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20  WHERE_UNIQUE    
1c10: 20 20 20 20 20 30 78 34 30 30 30 20 20 20 2f 2a       0x4000   /*
1c20: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
1c30: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
1c40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
1c50: 49 52 54 55 41 4c 54 41 42 4c 45 20 20 20 30 78  IRTUALTABLE   0x
1c60: 38 30 30 30 20 20 20 2f 2a 20 55 73 65 20 76 69  8000   /* Use vi
1c70: 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63  rtual-table proc
1c80: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
1c90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
1ca0: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
1cb0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cd0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1ce0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
1cf0: 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  C, Parse *pParse
1d00: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
1d10: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
1d20: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
1d30: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52 52 41  WC->nSlot = ARRA
1d40: 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74 61 74  YSIZE(pWC->aStat
1d50: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
1d60: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
1d70: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1d80: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
1d90: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1da0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
1db0: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
1dc0: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
1dd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
1de0: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
1df0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
1e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e10: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1e20: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
1e30: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
1e40: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66  hereTerm *a;.  f
1e50: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
1e60: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
1e70: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
1e80: 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26    if( a->flags &
1e90: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
1ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eb0: 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78 70  prDelete(a->pExp
1ec0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1ed0: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
1ee0: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
1ef0: 73 71 6c 69 74 65 46 72 65 65 28 70 57 43 2d 3e  sqliteFree(pWC->
1f00: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1f10: 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 69   Add a new entri
1f20: 65 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  es to the WhereC
1f30: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
1f40: 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61    Increase the a
1f50: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61 63  llocated.** spac
1f60: 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
1f70: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20  **.** WARNING:  
1f80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
1f90: 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68  ht reallocate th
1fa0: 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  e space used to 
1fb0: 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65  store.** WhereTe
1fc0: 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65  rms.  All pointe
1fd0: 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73  rs to WhereTerms
1fe0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c   should be inval
1ff0: 69 64 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61  ided after.** ca
2000: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
2010: 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65  ne.  Such pointe
2020: 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74  rs may be reinit
2030: 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72  ialized by refer
2040: 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57  encing.** the pW
2050: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  C->a[] array..*/
2060: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2070: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68  eClauseInsert(Wh
2080: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2090: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
20a0: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
20b0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
20c0: 64 78 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e  dx;.  if( pWC->n
20d0: 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74  Term>=pWC->nSlot
20e0: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
20f0: 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61  m *pOld = pWC->a
2100: 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73  ;.    pWC->a = s
2110: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
2120: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
2130: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
2140: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
2150: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2160: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
2170: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
2180: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
2190: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
21a0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
21b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
21c0: 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 7d  ree(pOld);.    }
21d0: 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  .    pWC->nSlot 
21e0: 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65 72  *= 2;.  }.  pTer
21f0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
2200: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  = pWC->nTerm];. 
2210: 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b 0a 20   pWC->nTerm++;. 
2220: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
2230: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67  p;.  pTerm->flag
2240: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 54 65  s = flags;.  pTe
2250: 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  rm->pWC = pWC;. 
2260: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
2270: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69  = -1;.  return i
2280: 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dx;.}../*.** Thi
2290: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
22a0: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
22b0: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
22c0: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
22d0: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
22e0: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
22f0: 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72   by the AND oper
2300: 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ator or some oth
2310: 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73  er.** operator s
2320: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
2330: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54  op parameter.  T
2340: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
2350: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66  tructure.** is f
2360: 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74  illed with point
2370: 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73  ers to subexpres
2380: 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d  sions.  For exam
2390: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48  ple:.**.**    WH
23a0: 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20  ERE  a=='hello' 
23b0: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31  AND coalesce(b,1
23c0: 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21  1)<10 AND (c+12!
23d0: 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20  =d OR c==22).** 
23e0: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
23f0: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
2400: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  _________/     \
2410: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
2420: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
2430: 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20  slot[0]         
2440: 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20     slot[1]      
2450: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d           slot[2]
2460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
2470: 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
2480: 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61   in pExpr is una
2490: 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69  ltered.  All thi
24a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
24b0: 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d  s is make slot[]
24c0: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74   entries point t
24d0: 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77  o substructure w
24e0: 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a  ithin pExpr..**.
24f0: 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f  ** In the previo
2500: 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20  us sentence and 
2510: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20  in the diagram, 
2520: 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20  "slot[]" refers 
2530: 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43  to.** the WhereC
2540: 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e  lause.a[] array.
2550: 20 20 54 68 69 73 20 61 72 72 61 79 20 67 72 6f    This array gro
2560: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
2570: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
2580: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2590: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  E clause..*/.sta
25a0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70  tic void whereSp
25b0: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
25c0: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
25d0: 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 66  r, int op){.  if
25e0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
25f0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
2600: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
2610: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
2620: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
2630: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2640: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
2650: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
2660: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
2670: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
2680: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
2690: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
26a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
26b0: 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65 66  mask set.*/.#def
26c0: 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  ine initMaskSet(
26d0: 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c  P)  memset(P, 0,
26e0: 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a   sizeof(*P))../*
26f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
2700: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
2710: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
2720: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
2730: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
2740: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
2750: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2760: 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61 73   getMask(ExprMas
2770: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2780: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2790: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27a0: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
27b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
27c0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
27d0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
27e0: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
27f0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
2800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2810: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2820: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
2830: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
2840: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
2850: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
2860: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2870: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
2880: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
2890: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28a0: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
28b0: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
28c0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
28d0: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
28e0: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
28f0: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
2900: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
2910: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
2920: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
2930: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
2940: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
2950: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
2960: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
2970: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 52 52  MaskSet->n < ARR
2980: 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65 74 2d  AYSIZE(pMaskSet-
2990: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
29a0: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
29b0: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
29c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
29d0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65  outine walks (re
29e0: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
29f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
2a00: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
2a10: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
2a20: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
2a30: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
2a40: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
2a50: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  tree..**.** In o
2a60: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f  rder for this ro
2a70: 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74  utine to work, t
2a80: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2a90: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  ion must have.**
2aa0: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f   previously invo
2ab0: 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72 52  ked sqlite3ExprR
2ac0: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f 6e  esolveNames() on
2ad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2ae0: 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61    See.** the hea
2af0: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
2b00: 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
2b10: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2b20: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73  mation..** The s
2b30: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
2b40: 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65  eNames() routine
2b50: 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75  s looks for colu
2b60: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20  mn names and.** 
2b70: 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64  sets their opcod
2b80: 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  es to TK_COLUMN 
2b90: 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e 69  and their Expr.i
2ba0: 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a  Table fields to.
2bb0: 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72 73  ** the VDBE curs
2bc0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
2bd0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
2be0: 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74  utine just has t
2bf0: 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74  o.** translate t
2c00: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2c10: 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76  s into bitmask v
2c20: 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c  alues and OR all
2c30: 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73  .** the bitmasks
2c40: 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74   together..*/.st
2c50: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2c60: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
2c70: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 45 78  ExprMaskSet*, Ex
2c80: 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
2c90: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
2ca0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45 78  ectTableUsage(Ex
2cb0: 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  prMaskSet*, Sele
2cc0: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
2cd0: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
2ce0: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2cf0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
2d00: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
2d10: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
2d20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2d30: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
2d40: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
2d50: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
2d60: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
2d70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
2d80: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
2d90: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2da0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
2db0: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
2dc0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2dd0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
2de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
2df0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2e00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2e10: 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ist);.  mask |= 
2e20: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
2e30: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2e40: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
2e50: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
2e60: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2e70: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 45  ListTableUsage(E
2e80: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2e90: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
2ea0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
2eb0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
2ec0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
2ed0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2ee0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2ef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
2f00: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
2f10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
2f20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
2f30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f40: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
2f50: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2f60: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
2f70: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2f80: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
2f90: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
2fa0: 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d 3d 30  ask;.  if( pS==0
2fb0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30   ){.    mask = 0
2fc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
2fd0: 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ask = exprListTa
2fe0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2ff0: 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a  t, pS->pEList);.
3000: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3010: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3020: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72  MaskSet, pS->pGr
3030: 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  oupBy);.    mask
3040: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3050: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3060: 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a   pS->pOrderBy);.
3070: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3080: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3090: 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29  Set, pS->pWhere)
30a0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
30b0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
30c0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69  skSet, pS->pHavi
30d0: 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ng);.  }.  retur
30e0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
30f0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
3100: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
3110: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
3120: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
3130: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
3140: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
3150: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3160: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
3170: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
3180: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
3190: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
31a0: 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IN"..*/.static i
31b0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
31c0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
31d0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
31e0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
31f0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
3200: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
3210: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3220: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
3230: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
3240: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3250: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
3260: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
3270: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
3280: 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f 2a 0a  <=TK_GE);.}../*.
3290: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
32a0: 63 74 73 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a  cts of type T..*
32b0: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
32c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
32d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
32e0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
32f0: 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f 70 65 72  comparision oper
3300: 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f  ator.  Expressio
3310: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ns of the form "
3320: 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63  X op Y".** are c
3330: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59  onverted into "Y
3340: 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74 61 74 69   op X"..*/.stati
3350: 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75  c void exprCommu
3360: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
3370: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
3380: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
3390: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
33a0: 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28 43 6f  _IN );.  SWAP(Co
33b0: 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52  llSeq*,pExpr->pR
33c0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70  ight->pColl,pExp
33d0: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29  r->pLeft->pColl)
33e0: 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  ;.  SWAP(Expr*,p
33f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
3400: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
3410: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3420: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
3430: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
3440: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3450: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
3460: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3470: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
3480: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
3490: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
34a0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
34b0: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
34c0: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
34d0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
34e0: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
34f0: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
3500: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
3510: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
3520: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
3530: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
3540: 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  int operatorMask
3550: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20  (int op){.  int 
3560: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
3570: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
3580: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
3590: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
35a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d    }else{.    c =
35b0: 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45   WO_EQ<<(op-TK_E
35c0: 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  Q);.  }.  assert
35d0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
35e0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
35f0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
3600: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
3610: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
3620: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
3630: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3640: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
3650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3660: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
3670: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
3680: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
3690: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
36a0: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
36b0: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
36c0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
36d0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
36e0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
36f0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
3700: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
3710: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
3720: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
3730: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
3740: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
3750: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
3760: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
3770: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
3780: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3790: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
37a0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
37b0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
37c0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
37d0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
37e0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
37f0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
3800: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
3810: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3830: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
3840: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
3850: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
3860: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3870: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
3880: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
3890: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
38a0: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
38b0: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31  his mask */.  u1
38c0: 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  6 op,           
38d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
38e0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
38f0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
3900: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
3920: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
3930: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
3940: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
3950: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
3960: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
3970: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
3980: 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
3990: 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  m; k; k--, pTerm
39a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
39b0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
39c0: 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28  iCur.       && (
39d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
39e0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
39f0: 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72  0.       && pTer
3a00: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  m->leftColumn==i
3a10: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26  Column.       &&
3a20: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3a30: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
3a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 75  ){.      if( iCu
3a50: 72 3e 3d 30 20 26 26 20 70 49 64 78 20 29 7b 0a  r>=0 && pIdx ){.
3a60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
3a70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
3a80: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
3a90: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
3aa0: 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20   char idxaff;.  
3ab0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3ac0: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
3ad0: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
3ae0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61 66  ;..        idxaf
3af0: 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  f = pIdx->pTable
3b00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
3b10: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
3b20: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
3b30: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
3b40: 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74  , idxaff) ) cont
3b50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 43  inue;.        pC
3b60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
3b70: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3b80: 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20   pX->pLeft);.   
3b90: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
3ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3bb0: 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20   pX->pRight ){. 
3bc0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
3be0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
3bf0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
3c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3c10: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3c30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
3c40: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
3c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3c60: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3c70: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
3c80: 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75   && pIdx->aiColu
3c90: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
3ca0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 61  j++){}.        a
3cb0: 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e  ssert( j<pIdx->n
3cc0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
3cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3ce0: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3cf0: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
3d00: 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j]) ) continue;.
3d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
3d20: 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20  turn pTerm;.    
3d30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3d40: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3d50: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3d60: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
3d70: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 45  lyze(SrcList*, E
3d80: 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57 68 65  xprMaskSet*, Whe
3d90: 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b  reClause*, int);
3da0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
3db0: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
3dc0: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
3dd0: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
3de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3df0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
3e00: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3e10: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
3e20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3e30: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
3e40: 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 74  pMaskSet,   /* t
3e50: 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  able masks */.  
3e60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
3e80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
3e90: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
3ea0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
3eb0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
3ec0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
3ed0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
3ee0: 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65 74 2c  bList, pMaskSet,
3ef0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
3f00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f10: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
3f20: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
3f30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
3f40: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
3f50: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
3f60: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
3f70: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
3f80: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
3f90: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
3fa0: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
3fb0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
3fc0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
3fd0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
3fe0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
3ff0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
4000: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
4010: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
4020: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
4030: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
4040: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
4050: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
4060: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73 71  LikeOrGlob(.  sq
4070: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
4080: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4090: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
40a0: 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ,      /* Test t
40b0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
40c0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65  /.  int *pnPatte
40d0: 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  rn,   /* Number 
40e0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
40f0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
4100: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  s */.  int *pisC
4110: 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75 65  omplete  /* True
4120: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
4130: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
4140: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
4150: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
4160: 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20 2a  har *z;.  Expr *
4170: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
4180: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4190: 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b  t;.  int c, cnt;
41a0: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20  .  int noCase;. 
41b0: 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20 43   char wc[3];.  C
41c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
41d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
41e0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
41f0: 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65 2c   pExpr, &noCase,
4200: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
4210: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
4220: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
4230: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ;.  pRight = pLi
4240: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
4250: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
4260: 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  !=TK_STRING ){. 
4270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4280: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
4290: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
42a0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
42b0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
42c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
42d0: 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70  pColl = pLeft->p
42e0: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f 6c  Coll;.  if( pCol
42f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  l==0 ){.    pCol
4300: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
4310: 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43  l;.  }.  if( (pC
4320: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
4330: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c  E_COLL_BINARY ||
4340: 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20 20   noCase) &&.    
4350: 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d    (pColl->type!=
4360: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41  SQLITE_COLL_NOCA
4370: 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20 29  SE || !noCase) )
4380: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4390: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
43a0: 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74 29  uoteExpr(pRight)
43b0: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29  ;.  z = (char *)
43c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b  pRight->token.z;
43d0: 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 28 63  .  for(cnt=0; (c
43e0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
43f0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
4400: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 3b  [1] && c!=wc[2];
4410: 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66 28 20   cnt++){}.  if( 
4420: 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28  cnt==0 || 255==(
4430: 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20 20  u8)z[cnt] ){.   
4440: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4450: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
4460: 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26  z[cnt]==wc[0] &&
4470: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
4480: 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e 74  *pnPattern = cnt
4490: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
44c0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
44d0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
44e0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
44f0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
4500: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
4510: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
4520: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
4530: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
4540: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
4550: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
4560: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
4570: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
4580: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
4590: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
45a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
45b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
45c0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
45d0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
45e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
45f0: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
4600: 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 20 73  >token.n!=5 || s
4610: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
4620: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
4630: 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20  atch",5)!=0 ){. 
4640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4650: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
4660: 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4690: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
46a0: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
46b0: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
46c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
46d0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
46e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
46f0: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
4700: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
4710: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
4720: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
4730: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
4740: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
4750: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
4760: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
4770: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
4780: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
4790: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
47a0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
47b0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
47c0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
47d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
47e0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
47f0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
4800: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
4810: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.}.../*.** The
4820: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
4830: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
4840: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
4850: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
4860: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
4870: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
4880: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
4890: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
48a0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
48b0: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
48c0: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
48d0: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
48e0: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
48f0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
4900: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4910: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4920: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
4930: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
4940: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
4950: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
4960: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20  p> <expr>".  If 
4970: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4980: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4990: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
49a0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
49b0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
49c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
49d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
49e0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
49f0: 65 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65  ew virtual expre
4a00: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
4a10: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20  m.** "Y <op> X" 
4a20: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4a30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
4a40: 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61   analyzed separa
4a50: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
4a60: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4a70: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
4a80: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
4a90: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
4aa0: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
4ab0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20  t *pMaskSet,    
4ac0: 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a  /* table masks *
4ad0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
4ae0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
4af0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4b00: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
4b10: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
4b20: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
4b30: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
4b40: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
4b50: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
4b60: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
4b70: 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  ;.  Expr *pExpr 
4b80: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
4b90: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
4ba0: 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Left;.  Bitmask 
4bb0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74  prereqAll;.  int
4bc0: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74   nPattern;.  int
4bd0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20   isComplete;..  
4be0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
4bf0: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
4c00: 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  rn;.  prereqLeft
4c10: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
4c20: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
4c30: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
4c40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
4c50: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
4c60: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
4c70: 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  0 );.    pTerm->
4c80: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
4c90: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4ca0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4cb0: 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20  ->pList).       
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54     | exprSelectT
4ce0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4cf0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  et, pExpr->pSele
4d00: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
4d10: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
4d20: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
4d30: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4d40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
4d50: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
4d60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4d70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4d80: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
4d90: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4da0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
4db0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
4dc0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
4dd0: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
4de0: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a  JoinTable);.  }.
4df0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
4e00: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
4e10: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
4e20: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
4e30: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
4e40: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
4e50: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
4e60: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
4e70: 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70  op) && (pTerm->p
4e80: 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65  rereqRight & pre
4e90: 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20  reqLeft)==0 ){. 
4ea0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
4eb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
4ec0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
4ed0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4ee0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
4ef0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4f00: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
4f10: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
4f20: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
4f30: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
4f40: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
4f50: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
4f60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
4f70: 72 61 74 6f 72 4d 61 73 6b 28 70 45 78 70 72 2d  ratorMask(pExpr-
4f80: 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >op);.    }.    
4f90: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
4fa0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
4fb0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65  UMN ){.      Whe
4fc0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20  reTerm *pNew;.  
4fd0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a      Expr *pDup;.
4fe0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
4ff0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
5000: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
5010: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
5020: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
5030: 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20  Dup(pExpr);.    
5040: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
5050: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
5060: 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56  WC, pDup, TERM_V
5070: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
5080: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66  MIC);.        if
5090: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65  ( idxNew==0 ) re
50a0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e  turn;.        pN
50b0: 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  ew = &pWC->a[idx
50c0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  New];.        pN
50d0: 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew->iParent = id
50e0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
50f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5100: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
5110: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
5120: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   1;.        pTer
5130: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
5140: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
5150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
5160: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
5170: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
5180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5190: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75 70  exprCommute(pDup
51a0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
51b0: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
51c0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
51d0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
51e0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
51f0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  ->leftColumn = p
5200: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
5210: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
5220: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c  qRight = prereqL
5230: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
5240: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
5250: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
5260: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
5270: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
5280: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
5290: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
52a0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
52b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
52c0: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
52d0: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
52e0: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
52f0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
5300: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
5310: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
5320: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
5330: 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  lements..  */.  
5340: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
5350: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
5360: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
5370: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
5380: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
5390: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
53a0: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
53b0: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
53c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
53d0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
53e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
53f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
5400: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
5410: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
5420: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
5430: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
5440: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
5450: 28 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33  (ops[i], sqlite3
5460: 45 78 70 72 44 75 70 28 70 45 78 70 72 2d 3e 70  ExprDup(pExpr->p
5470: 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20  Left),.         
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
54a0: 75 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  up(pList->a[i].p
54b0: 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  Expr), 0);.     
54c0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
54d0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
54e0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
54f0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5500: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70  AMIC);.      exp
5510: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
5520: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
5530: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
5540: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
5550: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
5560: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
5570: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
5580: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
5590: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
55a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
55b0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
55c0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
55d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
55e0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
55f0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
5600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5610: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
5620: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65  Attempt to conve
5630: 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  rt OR-connected 
5640: 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e  terms into an IN
5650: 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61   operator so tha
5660: 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20  t.  ** they can 
5670: 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69  make use of indi
5680: 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20  ces.  Example:. 
5690: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
56a0: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
56b0: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
56c0: 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  expr3.  **.  ** 
56d0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
56e0: 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  o.  **.  **     
56f0: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
5700: 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20  r2,expr3).  **. 
5710: 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
5720: 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d  ation must be om
5730: 69 74 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55  itted if OMIT_SU
5740: 42 51 55 45 52 59 20 69 73 20 64 65 66 69 6e 65  BQUERY is define
5750: 64 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74  d because.  ** t
5760: 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
5770: 74 68 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61  the the IN opera
5780: 74 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 73  tor is part of s
5790: 75 62 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ub-queries..  */
57a0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
57b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
57c0: 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20      int ok;.    
57d0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e  int i, j;.    in
57e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73  t iColumn, iCurs
57f0: 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61  or;.    WhereCla
5800: 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65  use sOr;.    Whe
5810: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
5820: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
5830: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
5840: 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29  RM_DYNAMIC)==0 )
5850: 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  ;.    whereClaus
5860: 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d  eInit(&sOr, pWC-
5870: 3e 70 50 61 72 73 65 29 3b 0a 20 20 20 20 77 68  >pParse);.    wh
5880: 65 72 65 53 70 6c 69 74 28 26 73 4f 72 2c 20 70  ereSplit(&sOr, p
5890: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
58a0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
58b0: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
58c0: 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65   &sOr);.    asse
58d0: 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 30 20  rt( sOr.nTerm>0 
58e0: 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  );.    j = 0;.  
58f0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 43 6f 6c    do{.      iCol
5900: 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c  umn = sOr.a[j].l
5910: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
5920: 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61   iCursor = sOr.a
5930: 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  [j].leftCursor;.
5940: 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75 72 73        ok = iCurs
5950: 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72  or>=0;.      for
5960: 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20  (i=sOr.nTerm-1, 
5970: 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69  pOrTerm=sOr.a; i
5980: 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20  >=0 && ok; i--, 
5990: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
59a0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
59b0: 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45  >eOperator!=WO_E
59c0: 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  Q ){.          g
59d0: 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69  oto or_not_possi
59e0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ble;.        }. 
59f0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
5a00: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
5a10: 69 43 75 72 73 6f 72 20 26 26 20 70 4f 72 54 65  iCursor && pOrTe
5a20: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  rm->leftColumn==
5a30: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
5a40: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
5a50: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
5a60: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
5a70: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66   if( (pOrTerm->f
5a80: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
5a90: 45 44 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ED)!=0 ||.      
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
5ab0: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5ac0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
5ad0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
5ae0: 20 20 20 20 20 20 20 20 20 20 28 73 4f 72 2e 61            (sOr.a
5af0: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
5b00: 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  t].flags & TERM_
5b10: 4f 52 5f 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20  OR_OK)!=0) ){.  
5b20: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
5b30: 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  >flags &= ~TERM_
5b40: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
5b50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5b60: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ok = 0;.        
5b70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
5b80: 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f  hile( !ok && (sO
5b90: 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26  r.a[j++].flags &
5ba0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30   TERM_COPIED)!=0
5bb0: 20 26 26 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20   && j<sOr.nTerm 
5bc0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20 29 7b  );.    if( ok ){
5bd0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
5be0: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pList = 0;.    
5bf0: 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70    Expr *pNew, *p
5c00: 44 75 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Dup;.      for(i
5c10: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
5c20: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
5c30: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
5c40: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
5c50: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
5c60: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
5c70: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
5c80: 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e;.        pDup 
5c90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5ca0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
5cb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
5cc0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5cd0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5ce0: 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b  pList, pDup, 0);
5cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5d00: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
5d10: 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  r(TK_COLUMN, 0, 
5d20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
5d30: 20 70 44 75 70 20 29 7b 0a 20 20 20 20 20 20 20   pDup ){.       
5d40: 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20   pDup->iTable = 
5d50: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
5d60: 20 70 44 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pDup->iColumn =
5d70: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20   iColumn;.      
5d80: 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  }.      pNew = s
5d90: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
5da0: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
5db0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
5dc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
5dd0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
5de0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
5df0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
5e00: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
5e10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  ist = pList;.   
5e20: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
5e30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5e40: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
5e50: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5e60: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65  AMIC);.        e
5e70: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
5e80: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
5e90: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  idxNew);.       
5ea0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
5eb0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
5ec0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
5ed0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
5ee0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
5ef0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
5f00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5f20: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
5f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5f40: 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65  .or_not_possible
5f50: 3a 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  :.    whereClaus
5f60: 65 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20  eClear(&sOr);.  
5f70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5f80: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
5f90: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
5fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5fb0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
5fc0: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
5fd0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
5fe0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
5ff0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
6000: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
6010: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  r..  */.  if( is
6020: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e  LikeOrGlob(pWC->
6030: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
6040: 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69  r, &nPattern, &i
6050: 73 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20  sComplete) ){.  
6060: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
6070: 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72  pRight;.    Expr
6080: 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b   *pStr1, *pStr2;
6090: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
60a0: 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32  xpr1, *pNewExpr2
60b0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
60c0: 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20  1, idxNew2;..   
60d0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
60e0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
60f0: 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  r;.    pRight = 
6100: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
6110: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  0].pExpr;.    pS
6120: 74 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr1 = sqlite3Exp
6130: 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20  r(TK_STRING, 0, 
6140: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6150: 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71  Str1 ){.      sq
6160: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
6170: 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pStr1->token, &p
6180: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
6190: 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65       pStr1->toke
61a0: 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a  n.n = nPattern;.
61b0: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20      }.    pStr2 
61c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
61d0: 28 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28  (pStr1);.    if(
61e0: 20 70 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20   pStr2 ){.      
61f0: 61 73 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74  assert( pStr2->t
6200: 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20  oken.dyn );.    
6210: 20 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32    ++*(u8*)&pStr2
6220: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65  ->token.z[nPatte
6230: 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rn-1];.    }.   
6240: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
6250: 69 74 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20  ite3Expr(TK_GE, 
6260: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6270: 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29  Left), pStr1, 0)
6280: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
6290: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
62a0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
62b0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
62c0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
62d0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
62e0: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
62f0: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
6300: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
6310: 69 74 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20  ite3Expr(TK_LT, 
6320: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6330: 4c 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29  Left), pStr2, 0)
6340: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
6350: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
6360: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
6370: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
6380: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
6390: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
63a0: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
63b0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
63c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
63d0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
63e0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
63f0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
6400: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
6410: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
6420: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
6430: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
6440: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
6450: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
6460: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
6470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
6480: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
6490: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
64a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
64b0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
64c0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
64d0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
64e0: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
64f0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
6510: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
6520: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
6530: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
6540: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
6550: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
6560: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
6570: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
6580: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
6590: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
65a0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
65b0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
65c0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
65d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
65e0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
65f0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
6600: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
6610: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
6620: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
6630: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
6640: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
6650: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
6660: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
6670: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
6680: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
6690: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
66a0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
66b0: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
66c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
66d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
66e0: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
66f0: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
6700: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6710: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
6720: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
6730: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
6740: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
6750: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
6760: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
6770: 33 45 78 70 72 28 54 4b 5f 4d 41 54 43 48 2c 20  3Expr(TK_MATCH, 
6780: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  0, sqlite3ExprDu
6790: 70 28 70 52 69 67 68 74 29 2c 20 30 29 3b 0a 20  p(pRight), 0);. 
67a0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
67b0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
67c0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
67d0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
67e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
67f0: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
6800: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
6810: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
6820: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
6830: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
6840: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
6850: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
6860: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
6870: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  m->leftColumn = 
6880: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
6890: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
68a0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
68b0: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
68c0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
68d0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
68e0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
68f0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 54  dxNew];.      pT
6900: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
6910: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  .      pTerm->fl
6920: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
6930: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
6940: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
6950: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
6960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6970: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6980: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
6990: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
69a0: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
69b0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
69c0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
69d0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
69e0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
69f0: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
6a00: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
6a10: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
6a20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6a30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6a40: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
6a50: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
6a60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
6a70: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
6a80: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
6a90: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
6aa0: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
6ab0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
6ac0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
6ad0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
6ae0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
6af0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
6b00: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
6b10: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
6b20: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
6b30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6b40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
6b50: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
6b60: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
6b70: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
6b80: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
6b90: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
6ba0: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
6bb0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
6bc0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
6bd0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
6be0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
6bf0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
6c00: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
6c10: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
6c20: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
6c30: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
6c40: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
6c50: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
6c60: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
6c70: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
6c80: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
6c90: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
6ca0: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
6cb0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
6cc0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
6cd0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6ce0: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
6cf0: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
6d00: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
6d10: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
6d20: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
6d30: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
6d40: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
6d50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6d60: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6d70: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
6d80: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
6d90: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
6da0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
6db0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
6dc0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
6dd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6de0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
6df0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
6e00: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
6e10: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
6e20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
6e30: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
6e40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6e50: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
6e60: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
6e70: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
6e80: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
6e90: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
6ea0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
6eb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
6ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6ee0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
6ef0: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f10: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
6f20: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
6f30: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
6f40: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
6f70: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
6f80: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6f90: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
6fa0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
6fb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6fd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6fe0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
6ff0: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
7000: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
7010: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
7020: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
7030: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
7040: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7050: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
7060: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
7070: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ndex..  */.  for
7080: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  (i=j=0, pTerm=pO
7090: 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65  rderBy->a; j<nTe
70a0: 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43  rm && i<pIdx->nC
70b0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
70c0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
70d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
70e0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44  ssion of the ORD
70f0: 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20  ER BY pTerm */. 
7100: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
7110: 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l;    /* The col
7120: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7130: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  of pExpr */.    
7140: 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  int termSortOrde
7150: 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72  r; /* Sort order
7160: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
7170: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
7180: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
7190: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
71a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
71b0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
71c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
71d0: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
71e0: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
71f0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
7200: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
7210: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
7220: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
7230: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
7240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7250: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
7260: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7270: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
7280: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
7290: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
72a0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69  pDfltColl;.    i
72b0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
72c0: 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n!=pIdx->aiColum
72d0: 6e 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20 20  n[i] || .       
72e0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
72f0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
7300: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29  dx->azColl[i]) )
7310: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
7320: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
7330: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
7340: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
7350: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
7360: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
7370: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
7380: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
7390: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
73a0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
73b0: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
73c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
73d0: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
73e0: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
73f0: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
7400: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
7410: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
7440: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
7450: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
7460: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
7470: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
7480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
7490: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
74a0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
74b0: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
74c0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
74d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
74e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
74f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
7500: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
7510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
7520: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
7530: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
7540: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
7550: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f  ssert( pIdx->aSo
7560: 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c 7c  rtOrder[i]==0 ||
7570: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
7580: 72 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20 74  r[i]==1 );.    t
7590: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  ermSortOrder = p
75a0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
75b0: 69 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  i] ^ pTerm->sort
75c0: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
75d0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
75e0: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
75f0: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
7600: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
7610: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
7620: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
7630: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
7640: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
7650: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
7660: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
7670: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
7680: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
7690: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
76a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
76b0: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
76c0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
76d0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
76e0: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  m++;.  }..  /* T
76f0: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
7700: 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
7710: 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   if all terms of
7720: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7730: 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ause.  ** are co
7740: 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  vered..  */.  if
7750: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
7760: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
7770: 72 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65 74  rder!=0;.    ret
7780: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7790: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
77a0: 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73  Check table to s
77b0: 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20  ee if the ORDER 
77c0: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72  BY clause in pOr
77d0: 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74  derBy can be sat
77e0: 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72  isfied.** by sor
77f0: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66  ting in order of
7800: 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20   ROWID.  Return 
7810: 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73  true if so and s
7820: 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a  et *pbRev to be.
7830: 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65  ** true for reve
7840: 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61  rse ROWID and fa
7850: 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20  lse for forward 
7860: 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a  ROWID order..*/.
7870: 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61  static int sorta
7880: 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e  bleByRowid(.  in
7890: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
78a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
78b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
78c0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
78d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
78e0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
78f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7900: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  e */.  int *pbRe
7910: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
7920: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
7930: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
7940: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  /.){.  Expr *p;.
7950: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
7960: 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
7970: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
7980: 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70  xpr>0 );.  p = p
7990: 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
79a0: 78 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  xpr;.  if( pOrde
79b0: 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  rBy->nExpr==1 &&
79c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
79d0: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
79e0: 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 26  base.          &
79f0: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31  & p->iColumn==-1
7a00: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
7a10: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
7a20: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72  sortOrder;.    r
7a30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
7a40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7a50: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
7a60: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
7a70: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
7a80: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
7a90: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
7aa0: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
7ab0: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
7ac0: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
7ad0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
7ae0: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
7af0: 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77  ing operatings w
7b00: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
7b10: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
7b20: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
7b30: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
7b40: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
7b50: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
7b60: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
7b70: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
7b80: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
7b90: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
7ba0: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
7bb0: 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
7bc0: 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
7bd0: 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
7be0: 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
7bf0: 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
7c00: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
7c10: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
7c20: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
7c30: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7c40: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
7c50: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
7c60: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
7c70: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
7c80: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
7c90: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
7ca0: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
7cb0: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
7cc0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
7cd0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
7ce0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
7cf0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
7d00: 5c 0a 20 20 20 20 20 20 20 20 28 64 65 66 69 6e  \.        (defin
7d10: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
7d20: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7d30: 45 5f 44 45 42 55 47 29 29 0a 73 74 61 74 69 63  E_DEBUG)).static
7d40: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
7d50: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
7d60: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
7d70: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
7d80: 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61  qlite3_where_tra
7d90: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
7da0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
7db0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
7dc0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
7dd0: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
7de0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
7df0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
7e00: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
7e10: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
7e20: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
7e30: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
7e40: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
7e50: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
7e60: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
7e70: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
7e80: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
7e90: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
7ea0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
7eb0: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
7ec0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
7ed0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
7ee0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
7ef0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
7f00: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
7f10: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
7f20: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
7f30: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
7f40: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
7f50: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
7f60: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
7f70: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
7f80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7f90: 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  !sqlite3_where_t
7fa0: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
7fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7fc0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
7fd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
7fe0: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
7ff0: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
8000: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
8010: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
8020: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
8030: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
8040: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
8050: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
8060: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
8070: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
8080: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
8090: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
80a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
80b0: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
80c0: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
80d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
80e0: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
80f0: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
8100: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
8110: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
8120: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
8130: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
8140: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
8150: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
8160: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
8170: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
8180: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
8190: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
81a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
81b0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
81c0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65  * Compute the be
81d0: 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76  st index for a v
81e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
81f0: 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64  .** The best ind
8200: 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62  ex is computed b
8210: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
8220: 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
8230: 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  irtual.** table 
8240: 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f  module.  This ro
8250: 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20  utine is really 
8260: 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74  just a wrapper t
8270: 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74  hat sets up.** t
8280: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
8290: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
82a0: 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
82b0: 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68  communicate with
82c0: 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a  .** xBestIndex..
82d0: 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c  **.** In a join,
82e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
82f0: 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75  ght be called mu
8300: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72  ltiple times for
8310: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72   the.** same vir
8320: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
8330: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8340: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
8350: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
8360: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74  initialized on t
8370: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
8380: 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ion and reused o
8390: 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  n all subsequent
83a0: 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  .** invocations.
83b0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
83c0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
83d0: 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  re is also used 
83e0: 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20  when.** code is 
83f0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63  generated to acc
8400: 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20  ess the virtual 
8410: 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72  table.  The wher
8420: 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a  eInfoDelete() .*
8430: 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20  * routine takes 
8440: 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20  care of freeing 
8450: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
8460: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
8470: 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62   after.** everyb
8480: 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64  ody has finished
8490: 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61   with it..*/.sta
84a0: 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 56  tic double bestV
84b0: 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50  irtualIndex(.  P
84c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
84e0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
84f0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
8500: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
8510: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8520: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
8530: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8540: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
8550: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
8560: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
8570: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
8580: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
8590: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
85a0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
85b0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
85c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
85d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
85e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
85f0: 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
8600: 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73 61 62   int orderByUsab
8610: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
8620: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 63 61  /* True if we ca
8630: 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74  n potential sort
8640: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
8650: 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78  dex_info **ppIdx
8660: 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e  Info /* Index in
8670: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
8680: 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a   to xBestIndex *
8690: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
86a0: 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
86b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
86c0: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
86d0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
86e0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
86f0: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
8700: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8710: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
8720: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
8730: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
8740: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
8750: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
8760: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
8770: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
8780: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  t nOrderBy;.  in
8790: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t rc;..  /* If t
87a0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
87b0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
87c0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
87d0: 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
87e0: 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
87f0: 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69 73 20  alized for this 
8800: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74  virtual table, t
8810: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  hen allocate.  *
8820: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
8830: 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70   it now.  */.  p
8840: 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78  IdxInfo = *ppIdx
8850: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
8860: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 57  Info==0 ){.    W
8870: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
8880: 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  .    int nTerm;.
8890: 20 20 20 20 54 52 41 43 45 28 28 22 52 65 63 6f      TRACE(("Reco
88a0: 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  mputing index in
88b0: 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c  fo for %s...\n",
88c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
88d0: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
88e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
88f0: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
8900: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
8910: 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74  ferring.    ** t
8920: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
8930: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  able */.    for(
8940: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
8950: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
8960: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
8970: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
8980: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
8990: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
89a0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
89b0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
89c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
89d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
89e0: 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     nTerm++;.    
89f0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
8a00: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8a10: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
8a20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
8a30: 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 76 69  rrent .    ** vi
8a40: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
8a50: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
8a60: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
8a70: 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20   part of.    ** 
8a80: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
8a90: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
8aa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4f 72  ..    */.    nOr
8ab0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 69  derBy = 0;.    i
8ac0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
8ad0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8ae0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
8b00: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
8b10: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8b20: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
8b30: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
8b40: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
8b50: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
8b60: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
8b70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8b80: 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ==pOrderBy->nExp
8b90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72  r ){.        nOr
8ba0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
8bb0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
8bd0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
8be0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8bf0: 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2f 0a  tructure.    */.
8c00: 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73      pIdxInfo = s
8c10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
8c20: 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
8c50: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
8c60: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
8c70: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
8ca0: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
8cb0: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 69 66  rderBy );.    if
8cc0: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
8cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ce0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8cf0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
8d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
8d10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  0;.    }.    *pp
8d20: 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e  IdxInfo = pIdxIn
8d30: 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  fo;..    /* Init
8d40: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
8d50: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
8d60: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
8d70: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
8d80: 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  .    ** many fie
8d90: 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
8da0: 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
8db0: 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
8dc0: 64 65 78 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  dex from.    ** 
8dd0: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
8de0: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
8df0: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
8e00: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 20   in order to.   
8e10: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
8e20: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 20  hose fields..   
8e30: 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   */.    pIdxCons
8e40: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
8e50: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
8e60: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
8e70: 5d 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  ];.    pIdxOrder
8e80: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
8e90: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
8ea0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
8eb0: 65 72 6d 5d 3b 0a 20 20 20 20 70 55 73 61 67 65  erm];.    pUsage
8ec0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
8ed0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
8ee0: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
8ef0: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
8f00: 5d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70  ];.    *(int*)&p
8f10: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
8f20: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
8f30: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
8f40: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
8f50: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73  OrderBy;.    *(s
8f60: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8f70: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
8f80: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
8f90: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
8fa0: 6e 73 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  ns;.    *(struct
8fb0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
8fc0: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
8fd0: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
8fe0: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  IdxOrderBy;.    
8ff0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
9000: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
9010: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
9020: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
9030: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
9080: 61 67 65 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  age;..    for(i=
9090: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
90a0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
90b0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
90c0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
90d0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
90e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
90f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
9100: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
9110: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e  tor==WO_IN ) con
9120: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 64  tinue;.      pId
9130: 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
9140: 20 3d 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f   = pTerm->leftCo
9150: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78  lumn;.      pIdx
9160: 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
9170: 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  set = i;.      p
9180: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
9190: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
91a0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ;.      /* The d
91b0: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
91c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
91d0: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
91e0: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
91f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20       ** the WO_ 
9200: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
9210: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
9220: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
9230: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
9240: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9250: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
9260: 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ct. */.      ass
9270: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
9280: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9290: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  INT_EQ );.      
92a0: 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
92b0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
92c0: 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
92d0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
92e0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
92f0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
9300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
9310: 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
9320: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
9330: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9340: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
9350: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9360: 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
9370: 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
9380: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9390: 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
93a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
93b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
93c0: 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  (WO_EQ|WO_LT|WO_
93d0: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
93e0: 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
93f0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    j++;.    }.   
9400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
9410: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
9420: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
9430: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
9440: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 49 64 78  Expr;.      pIdx
9450: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
9460: 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
9470: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 4f  umn;.      pIdxO
9480: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
9490: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
94a0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
94b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
94c0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
94d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
94e0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
94f0: 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
9500: 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
9510: 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
9520: 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
9530: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
9540: 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
9550: 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
9560: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
9570: 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
9580: 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
9590: 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
95a0: 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
95b0: 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
95c0: 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
95d0: 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
95e0: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
95f0: 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
9600: 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
9610: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
9620: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
9630: 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
9640: 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 69 66 28  eArg[0] );.  if(
9650: 20 70 54 61 62 2d 3e 70 56 74 61 62 3d 3d 30 20   pTab->pVtab==0 
9660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9670: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9680: 75 6e 64 65 66 69 6e 65 64 20 6d 6f 64 75 6c 65  undefined module
9690: 20 25 73 20 66 6f 72 20 74 61 62 6c 65 20 25 73   %s for table %s
96a0: 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
96b0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c  >azModuleArg[0],
96c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
96d0: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
96e0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
96f0: 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
9700: 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
9710: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
9720: 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  .  ** output var
9730: 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a  iables to zero..
9740: 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74    **.  ** aConst
9750: 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69  raint[].usable i
9760: 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74  s true for const
9770: 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65  raints where the
9780: 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a   right-hand.  **
9790: 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
97a0: 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
97b0: 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
97c0: 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
97d0: 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
97e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
97f0: 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
9800: 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
9810: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
9820: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20         column = 
9830: 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  expr.  **.  ** a
9840: 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  nd we are evalua
9850: 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65  ting a join, the
9860: 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
9870: 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20   on column is . 
9880: 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
9890: 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
98a0: 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
98b0: 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
98c0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  t.  ** of the ta
98d0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
98e0: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  olumn..  **.  **
98f0: 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
9900: 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  s[] array contai
9910: 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
9920: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ll constraints. 
9930: 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65   ** on the curre
9940: 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20  nt table.  That 
9950: 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65  way we only have
9960: 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f   to compute it o
9970: 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  nce.  ** even th
9980: 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72  ough we might tr
9990: 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65  y to pick the be
99a0: 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c  st index multipl
99b0: 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f  e times..  ** Fo
99c0: 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
99d0: 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
99e0: 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
99f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
9a00: 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62   ** join might b
9a10: 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77  e different so w
9a20: 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70  e have to recomp
9a30: 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66  ute the usable f
9a40: 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69  lag.  ** each ti
9a50: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  me..  */.  pIdxC
9a60: 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
9a70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
9a80: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
9a90: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
9aa0: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
9ab0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
9ac0: 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
9ad0: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
9ae0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
9af0: 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
9b00: 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
9b10: 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
9b20: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9b30: 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
9b40: 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70  ns->usable =  (p
9b50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9b60: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
9b70: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
9b80: 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
9b90: 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
9ba0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
9bb0: 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  t);.  if( pIdxIn
9bc0: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
9bd0: 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  xStr ){.    sqli
9be0: 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
9bf0: 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a  o->idxStr);.  }.
9c00: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
9c10: 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
9c20: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
9c30: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
9c40: 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
9c50: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
9c60: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
9c70: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
9c80: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
9c90: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
9ca0: 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  2.0;.  nOrderBy 
9cb0: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
9cc0: 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64 78  erBy;.  if( pIdx
9cd0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26  Info->nOrderBy &
9ce0: 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c 65  & !orderByUsable
9cf0: 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26   ){.    *(int*)&
9d00: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
9d10: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73  By = 0;.  }..  s
9d20: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
9d30: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 54  pParse->db);.  T
9d40: 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65  RACE(("xBestInde
9d50: 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61  x for %s\n", pTa
9d60: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52  b->zName));.  TR
9d70: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
9d80: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  IdxInfo);.  rc =
9d90: 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70 4d   pTab->pVtab->pM
9da0: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
9db0: 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 70  x(pTab->pVtab, p
9dc0: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43  IdxInfo);.  TRAC
9dd0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49  E_IDX_OUTPUTS(pI
9de0: 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
9df0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9e10: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
9e20: 20 20 73 71 6c 69 74 65 33 46 61 69 6c 65 64 4d    sqlite3FailedM
9e30: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
9e40: 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  se {.      sqlit
9e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9e60: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
9e70: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
9e80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61   }.    sqlite3Sa
9e90: 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64  fetyOn(pParse->d
9ea0: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
9eb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 61 66   rc = sqlite3Saf
9ec0: 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62  etyOn(pParse->db
9ed0: 29 3b 0a 20 20 7d 0a 20 20 2a 28 69 6e 74 2a 29  );.  }.  *(int*)
9ee0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
9ef0: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
9f00: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
9f10: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
9f20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9f30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9f40: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
9f50: 20 46 69 6e 64 20 74 68 65 20 62 65 73 74 20 69   Find the best i
9f60: 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73 73 69  ndex for accessi
9f70: 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
9f80: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 61  table.  Return a
9f90: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
9fa0: 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67 73 20  he index, flags 
9fb0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 68 6f  that describe ho
9fc0: 77 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  w the index shou
9fd0: 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68 65 0a  ld be used, the.
9fe0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75  ** number of equ
9ff0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
a000: 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f 73 74  s, and the "cost
a010: 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  " for this index
a020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65  ..**.** The lowe
a030: 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20 77 69  st cost index wi
a040: 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
a050: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
a060: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
a070: 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
a080: 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73  O need to proces
a090: 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75 73  s the request us
a0a0: 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65 64  ing the selected
a0b0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f   index..** Facto
a0c0: 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
a0d0: 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
a0e0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
a0f0: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
a100: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
a110: 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
a120: 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
a130: 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
a140: 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
a150: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
a160: 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
a170: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
a180: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a190: 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
a1a0: 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
a1b0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
a1c0: 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
a1d0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  n table..**.*/.s
a1e0: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73  tatic double bes
a1f0: 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
a200: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
a220: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a230: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a240: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
a250: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
a260: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
a270: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
a280: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
a290: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
a2a0: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
a2b0: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
a2c0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
a2d0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
a2e0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
a2f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a300: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
a310: 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
a320: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64   clause */.  Ind
a330: 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20  ex **ppIndex,   
a340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
a350: 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e 74 20   *ppIndex point 
a360: 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  to the best inde
a370: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61  x */.  int *pFla
a380: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
a390: 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67 73 20     /* Put flags 
a3a0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 69 73 20  describing this 
a3b0: 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61 67  choice in *pFlag
a3c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71  s */.  int *pnEq
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 75     /* Put the nu
a3f0: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
a400: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68 65 72   constraints her
a410: 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  e */.){.  WhereT
a420: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e  erm *pTerm;.  In
a430: 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d 20 30  dex *bestIdx = 0
a440: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
a450: 65 78 20 74 68 61 74 20 67 69 76 65 73 20 74 68  ex that gives th
a460: 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f  e lowest cost */
a470: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74  .  double lowest
a480: 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
a490: 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 75 73  * The cost of us
a4a0: 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f 0a 20  ing bestIdx */. 
a4b0: 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
a4c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
a4d0: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
a4e0: 20 77 69 74 68 20 62 65 73 74 49 64 78 20 2a 2f   with bestIdx */
a4f0: 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d  .  int bestNEq =
a500: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a510: 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66 6f 72  * Best value for
a520: 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43   nEq */.  int iC
a530: 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
a540: 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or;   /* The cur
a550: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
a560: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20   to be accessed 
a570: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
a580: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
a590: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
a5a0: 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
a5b0: 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20  /.  int rev;    
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
a5e0: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
a5f0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
a620: 69 61 74 65 64 20 77 69 74 68 20 70 50 72 6f 62  iated with pProb
a630: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20  e */.  int nEq; 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a660: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
a670: 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  ints */.  double
a680: 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
a690: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
a6a0: 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
a6b0: 0a 0a 20 20 54 52 41 43 45 28 28 22 62 65 73 74  ..  TRACE(("best
a6c0: 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f  Index: tbl=%s no
a6d0: 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53  tReady=%x\n", pS
a6e0: 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
a6f0: 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 6c   notReady));.  l
a700: 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49  owestCost = SQLI
a710: 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 70 50  TE_BIG_DBL;.  pP
a720: 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  robe = pSrc->pTa
a730: 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 2f 2a  b->pIndex;..  /*
a740: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
a750: 73 20 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e 64  s no indices and
a760: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65   there are no te
a770: 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72 65  rms in the where
a780: 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61  .  ** clause tha
a790: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 52  t refer to the R
a7a0: 4f 57 49 44 2c 20 74 68 65 6e 20 77 65 20 77 69  OWID, then we wi
a7b0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 62 6c 65  ll never be able
a7c0: 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74   to do.  ** anyt
a7d0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
a7e0: 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
a7f0: 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  n on this table.
a800: 20 20 57 65 20 6d 69 67 68 74 20 61 73 0a 20 20    We might as.  
a810: 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69 74 20 66  ** well put it f
a820: 69 72 73 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e  irst in the join
a830: 20 6f 72 64 65 72 2e 20 20 54 68 61 74 20 77 61   order.  That wa
a840: 79 2c 20 70 65 72 68 61 70 73 20 69 74 20 63 61  y, perhaps it ca
a850: 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66 65 72 65  n be.  ** refere
a860: 6e 63 65 64 20 62 79 20 6f 74 68 65 72 20 74 61  nced by other ta
a870: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
a880: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72  ..  */.  if( pPr
a890: 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20 20 66  obe==0 &&.     f
a8a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
a8b0: 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c  r, -1, 0, WO_EQ|
a8c0: 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_IN|WO_LT|WO_L
a8d0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29  E|WO_GT|WO_GE,0)
a8e0: 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70 4f 72  ==0 &&.     (pOr
a8f0: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72  derBy==0 || !sor
a900: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
a910: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65  r, pOrderBy, &re
a920: 76 29 29 20 29 7b 0a 20 20 20 20 2a 70 46 6c 61  v)) ){.    *pFla
a930: 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70 49  gs = 0;.    *ppI
a940: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 2a 70  ndex = 0;.    *p
a950: 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  nEq = 0;.    ret
a960: 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20  urn 0.0;.  }..  
a970: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 72  /* Check for a r
a980: 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77  owid=EXPR or row
a990: 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73  id IN (...) cons
a9a0: 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70  traints.  */.  p
a9b0: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
a9c0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
a9d0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
a9e0: 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_IN, 0);.  if( 
a9f0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45 78 70  pTerm ){.    Exp
aa00: 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a 70  r *pExpr;.    *p
aa10: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
aa20: 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48 45 52  bestFlags = WHER
aa30: 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20  E_ROWID_EQ;.    
aa40: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
aa50: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a  ator & WO_EQ ){.
aa60: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d        /* Rowid==
aa70: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 62   is always the b
aa80: 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20  est pick.  Look 
aa90: 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65 63  no further.  Bec
aaa0: 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20  ause only.      
aab0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ** a single row 
aac0: 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75  is generated, ou
aad0: 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20 69  tput is always i
aae0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
aaf0: 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73 20  /.      *pFlags 
ab00: 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  = WHERE_ROWID_EQ
ab10: 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b   | WHERE_UNIQUE;
ab20: 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20 31  .      *pnEq = 1
ab30: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
ab40: 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77 69  ... best is rowi
ab50: 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  d\n"));.      re
ab60: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65  turn 0.0;.    }e
ab70: 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20 3d  lse if( (pExpr =
ab80: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e   pTerm->pExpr)->
ab90: 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  pList!=0 ){.    
aba0: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c    /* Rowid IN (L
abb0: 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c  IST): cost is Nl
abc0: 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  ogN where N is t
abd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73  he number of lis
abe0: 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  t.      ** eleme
abf0: 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c  nts.  */.      l
ac00: 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78 70  owestCost = pExp
ac10: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
ac20: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
ac30: 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65  t *= estLog(lowe
ac40: 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c  stCost);.    }el
ac50: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77  se{.      /* Row
ac60: 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20  id IN (SELECT): 
ac70: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
ac80: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
ac90: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
aca0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
acb0: 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  lt of the inner 
acc0: 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76 65  select.  We have
acd0: 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69 6d   no way to estim
ace0: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ate.      ** tha
acf0: 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20  t value so make 
ad00: 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f  a wild guess. */
ad10: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
ad20: 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a 20  t = 200;.    }. 
ad30: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72     TRACE(("... r
ad40: 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e  owid IN cost: %.
ad50: 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73  9g\n", lowestCos
ad60: 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  t));.  }..  /* E
ad70: 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74  stimate the cost
ad80: 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e   of a table scan
ad90: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
ada0: 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20  know how many.  
adb0: 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69  ** entries are i
adc0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65  n the table, use
add0: 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20   1 million as a 
ade0: 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f  guess..  */.  co
adf0: 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50  st = pProbe ? pP
ae00: 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30  robe->aiRowEst[0
ae10: 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 54  ] : 1000000;.  T
ae20: 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
ae30: 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
ae40: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
ae50: 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52  ;.  flags = WHER
ae60: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a  E_ROWID_RANGE;..
ae70: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
ae80: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20  onstraints on a 
ae90: 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20  range of rowids 
aea0: 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  in a table scan.
aeb0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
aec0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
aed0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
aee0: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
aef0: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
af00: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
af10: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
af20: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
af30: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
af40: 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
af50: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
af60: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
af70: 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20   cost /= 3;  /* 
af80: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
af90: 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  <EXPR eliminates
afa0: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72   two-thirds or r
afb0: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
afc0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
afd0: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
afe0: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
aff0: 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  GE, 0) ){.      
b000: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
b010: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
b020: 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
b030: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e  uess that rowid>
b040: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
b050: 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
b060: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
b070: 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69  TRACE(("... rowi
b080: 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  d range reduces 
b090: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
b0a0: 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65   cost));.  }else
b0b0: 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b  {.    flags = 0;
b0c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b0d0: 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65  e table scan doe
b0e0: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  s not satisfy th
b0f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
b100: 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a  e, increase.  **
b110: 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f   the cost by Nlo
b120: 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  gN to cover the 
b130: 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69  expense of sorti
b140: 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ng. */.  if( pOr
b150: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
b160: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
b170: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
b180: 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
b190: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
b1a0: 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57  RDERBY|WHERE_ROW
b1b0: 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  ID_RANGE;.      
b1c0: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
b1d0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
b1e0: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
b1f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
b200: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
b210: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
b220: 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e       TRACE(("...
b230: 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
b240: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
b250: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
b260: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74  }.  }.  if( cost
b270: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
b280: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
b290: 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c  cost;.    bestFl
b2a0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
b2b0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65  ..  /* Look at e
b2c0: 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  ach index..  */.
b2d0: 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
b2e0: 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
b2f0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
b300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b310: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b320: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64  counter */.    d
b330: 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69  ouble inMultipli
b340: 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54 52 41  er = 1;..    TRA
b350: 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25  CE(("... index %
b360: 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a  s:\n", pProbe->z
b370: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
b380: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
b390: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
b3a0: 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
b3b0: 65 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20  e satisfied.    
b3c0: 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e  ** by x=EXPR con
b3d0: 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e  straints or x IN
b3e0: 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
b3f0: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ts..    */.    f
b400: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  lags = 0;.    fo
b410: 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d  r(i=0; i<pProbe-
b420: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
b430: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
b440: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  robe->aiColumn[i
b450: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
b460: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
b470: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
b480: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70  , WO_EQ|WO_IN, p
b490: 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
b4a0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
b4b0: 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  ak;.      flags 
b4c0: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
b4d0: 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  EQ;.      if( pT
b4e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
b4f0: 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
b500: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
b510: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
b520: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
b530: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
b540: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
b550: 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b  r->pSelect!=0 ){
b560: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
b570: 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a 20  tiplier *= 25;. 
b580: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b590: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30   pExpr->pList!=0
b5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
b5b0: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45  Multiplier *= pE
b5c0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
b5d0: 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
b5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b5f0: 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65     cost = pProbe
b600: 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20  ->aiRowEst[i] * 
b610: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65  inMultiplier * e
b620: 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69  stLog(inMultipli
b630: 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69  er);.    nEq = i
b640: 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
b650: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
b660: 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  ne && (flags & W
b670: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
b680: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  =0.         && n
b690: 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
b6a0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  umn ){.      fla
b6b0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51  gs |= WHERE_UNIQ
b6c0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  UE;.    }.    TR
b6d0: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71  ACE(("...... nEq
b6e0: 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20  =%d inMult=%.9g 
b6f0: 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45  cost=%.9g\n", nE
b700: 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c  q, inMultiplier,
b710: 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a   cost));..    /*
b720: 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20   Look for range 
b730: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
b740: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70  */.    if( nEq<p
b750: 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
b760: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
b770: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
b780: 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  [nEq];.      pTe
b790: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
b7a0: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
b7b0: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
b7c0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  E|WO_GT|WO_GE, p
b7d0: 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
b7e0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
b7f0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
b800: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
b810: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
b820: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
b830: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
b840: 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65  LT|WO_LE, pProbe
b850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
b860: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
b870: 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
b880: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
b890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b8a0: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
b8b0: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
b8c0: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
b8d0: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
b8e0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
b8f0: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
b900: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
b910: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
b920: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
b930: 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64  ...... range red
b940: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
b950: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
b960: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b970: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69   /* Add the addi
b980: 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73  tional cost of s
b990: 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69  orting if that i
b9a0: 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20  s a factor..    
b9b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  */.    if( pOrde
b9c0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rBy ){.      if(
b9d0: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
b9e0: 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26  COLUMN_IN)==0 &&
b9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f  .           isSo
ba00: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
ba10: 65 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f  e,pProbe,iCur,pO
ba20: 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29  rderBy,nEq,&rev)
ba30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ba40: 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20  flags==0 ){.    
ba50: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
ba60: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
ba70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ba80: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
ba90: 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
baa0: 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
bab0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
bac0: 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
bad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
baf0: 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
bb00: 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
bb10: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
bb20: 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
bb30: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
bb40: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
bb50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
bb60: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
bb70: 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77  if we can get aw
bb80: 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75  ay with using ju
bb90: 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  st the index wit
bba0: 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72  hout.    ** ever
bbb0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62   reading the tab
bbc0: 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  le.  If that is 
bbd0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68  the case, then h
bbe0: 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  alve the.    ** 
bbf0: 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64  cost of this ind
bc00: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
bc10: 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63  f( flags && pSrc
bc20: 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42  ->colUsed < (((B
bc30: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
bc40: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74  1)) ){.      Bit
bc50: 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
bc60: 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
bc70: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
bc80: 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; j<pProbe->nC
bc90: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
bca0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72       int x = pPr
bcb0: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  obe->aiColumn[j]
bcc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
bcd0: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
bce0: 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
bcf0: 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
bd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bd10: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
bd20: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
bd30: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
bd40: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  .        cost /=
bd50: 20 32 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   2;.        TRAC
bd60: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f  E(("...... idx-o
bd70: 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73 74  nly reduces cost
bd80: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
bd90: 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t));.      }.   
bda0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
bdb0: 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63 68  is index has ach
bdc0: 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73 74  ieved the lowest
bdd0: 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74 68   cost so far, th
bde0: 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a  en use it..    *
bdf0: 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74 20 3c  /.    if( cost <
be00: 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20   lowestCost ){. 
be10: 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20 70       bestIdx = p
be20: 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77  Probe;.      low
be30: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
be40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
be50: 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ags!=0 );.      
be60: 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
be70: 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45 71  s;.      bestNEq
be80: 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20 20   = nEq;.    }.  
be90: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  }..  /* Report t
bea0: 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a 20  he best result. 
beb0: 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20 3d   */.  *ppIndex =
bec0: 20 62 65 73 74 49 64 78 3b 0a 20 20 54 52 41 43   bestIdx;.  TRAC
bed0: 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69  E(("best index i
bee0: 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c  s %s, cost=%.9g,
bef0: 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25   flags=%x, nEq=%
bf00: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65  d\n",.        be
bf10: 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d  stIdx ? bestIdx-
bf20: 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29  >zName : "(none)
bf30: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62  ", lowestCost, b
bf40: 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45  estFlags, bestNE
bf50: 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d  q));.  *pFlags =
bf60: 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 2a 70   bestFlags;.  *p
bf70: 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20  nEq = bestNEq;. 
bf80: 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f   return lowestCo
bf90: 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69  st;.}.../*.** Di
bfa0: 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
bfb0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
bfc0: 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
bfd0: 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
bfe0: 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
bff0: 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
c000: 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
c010: 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
c020: 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
c030: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
c040: 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
c050: 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
c060: 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
c070: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
c080: 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
c090: 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
c0a0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
c0b0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
c0c0: 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
c0d0: 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
c0e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
c0f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
c100: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
c110: 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
c120: 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
c130: 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
c140: 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
c150: 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
c160: 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
c170: 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
c180: 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
c190: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
c1a0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
c1b0: 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
c1c0: 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
c1d0: 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
c1e0: 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
c1f0: 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
c200: 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
c210: 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
c220: 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
c230: 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
c240: 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
c250: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
c260: 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
c270: 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
c280: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
c290: 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
c2a0: 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
c2b0: 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
c2c0: 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
c2d0: 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
c2e0: 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
c2f0: 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
c300: 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
c310: 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
c320: 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
c330: 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
c340: 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
c350: 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
c360: 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
c370: 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
c380: 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
c390: 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
c3a0: 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
c3b0: 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
c3c0: 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
c3d0: 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
c3e0: 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
c3f0: 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
c400: 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
c410: 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
c420: 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
c430: 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
c440: 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
c450: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
c460: 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
c470: 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
c480: 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
c490: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c4a0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
c4b0: 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
c4c0: 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
c4d0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
c4e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
c4f0: 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20  Parent>=0 ){.   
c500: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
c510: 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70  ther = &pTerm->p
c520: 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61  WC->a[pTerm->iPa
c530: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  rent];.      if(
c540: 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69   (--pOther->nChi
c550: 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ld)==0 ){.      
c560: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
c570: 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20  evel, pOther);. 
c580: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c5a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 62 75 69  te code that bui
c5b0: 6c 64 73 20 61 20 70 72 6f 62 65 20 66 6f 72 20  lds a probe for 
c5c0: 61 6e 20 69 6e 64 65 78 2e 20 20 44 65 74 61 69  an index.  Detai
c5d0: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ls:.**.**    *  
c5e0: 43 68 65 63 6b 20 74 68 65 20 74 6f 70 20 6e 43  Check the top nC
c5f0: 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e  olumn entries on
c600: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20   the stack.  If 
c610: 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  any.**       of 
c620: 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20 61 72  those entries ar
c630: 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d  e NULL, jump imm
c640: 65 64 69 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c  ediately to brk,
c650: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68 20  .**       which 
c660: 69 73 20 74 68 65 20 6c 6f 6f 70 20 65 78 69 74  is the loop exit
c670: 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78  , since no index
c680: 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74 63   entry will matc
c690: 68 0a 2a 2a 20 20 20 20 20 20 20 69 66 20 61 6e  h.**       if an
c6a0: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  y part of the ke
c6b0: 79 20 69 73 20 4e 55 4c 4c 2e 20 50 6f 70 20 28  y is NULL. Pop (
c6c0: 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 29 20  nColumn+nExtra) 
c6d0: 0a 2a 2a 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  .**       elemen
c6e0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ts from the stac
c6f0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43  k..**.**    *  C
c700: 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f 62 65  onstruct a probe
c710: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
c720: 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72  top nColumn entr
c730: 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ies in.**       
c740: 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61  the stack with a
c750: 66 66 69 6e 69 74 69 65 73 20 61 70 70 72 6f 70  ffinities approp
c760: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 20  riate for index 
c770: 70 49 64 78 2e 20 0a 2a 2a 20 20 20 20 20 20 20  pIdx. .**       
c780: 4f 6e 6c 79 20 6e 43 6f 6c 75 6d 6e 20 65 6c 65  Only nColumn ele
c790: 6d 65 6e 74 73 20 61 72 65 20 70 6f 70 70 65 64  ments are popped
c7a0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
c7b0: 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  in this case.** 
c7c0: 20 20 20 20 20 20 28 62 79 20 4f 50 5f 4d 61 6b        (by OP_Mak
c7d0: 65 52 65 63 6f 72 64 29 2e 0a 2a 2a 0a 2a 2f 0a  eRecord)..**.*/.
c7e0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c  static void buil
c7f0: 64 49 6e 64 65 78 50 72 6f 62 65 28 0a 20 20 56  dIndexProbe(.  V
c800: 64 62 65 20 2a 76 2c 20 0a 20 20 69 6e 74 20 6e  dbe *v, .  int n
c810: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 69 6e 74 20 6e  Column, .  int n
c820: 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 72  Extra, .  int br
c830: 6b 2c 20 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  k, .  Index *pId
c840: 78 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  x.){.  sqlite3Vd
c850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
c860: 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c  tNull, -nColumn,
c870: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
c880: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
c890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c8a0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
c8b0: 6c 75 6d 6e 2b 6e 45 78 74 72 61 2c 20 30 29 3b  lumn+nExtra, 0);
c8c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c8d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
c8e0: 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74  0, brk);.  sqlit
c8f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c900: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
c910: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c  olumn, 0);.  sql
c920: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
c930: 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d  yStr(v, pIdx);.}
c940: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
c950: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
c960: 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
c970: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
c980: 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
c990: 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
c9a0: 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
c9b0: 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
c9c0: 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
c9d0: 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
c9e0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
c9f0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
ca00: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
ca10: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
ca20: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
ca30: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
ca40: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
ca50: 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
ca60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
ca70: 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a  aluated and its.
ca80: 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66  ** result is lef
ca90: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  t on the stack. 
caa0: 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   For constraints
cab0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
cac0: 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20  N (...).** this 
cad0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
cae0: 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
caf0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   iterate over al
cb00: 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a  l values of X..*
cb10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
cb20: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
cb30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cb40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
cb50: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cb60: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
cb70: 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
cb80: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
cb90: 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
cba0: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20  d */.  int brk, 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
cbc0: 6d 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e 64  mp here to aband
cbd0: 6f 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  on the loop */. 
cbe0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
cbf0: 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76  vel  /* When lev
cc00: 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
cc10: 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
cc20: 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  king on */.){.  
cc30: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
cc40: 2d 3e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ->pExpr;.  if( p
cc50: 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a  X->op!=TK_IN ){.
cc60: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
cc70: 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
cc80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
cc90: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
cca0: 67 68 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ght);.#ifndef SQ
ccb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ccc0: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
ccd0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 69 6e  int iTab;.    in
cce0: 74 20 2a 61 49 6e 3b 0a 20 20 20 20 56 64 62 65  t *aIn;.    Vdbe
ccf0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
cd00: 64 62 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  dbe;..    sqlite
cd10: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
cd20: 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20  Parse, pX);.    
cd30: 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
cd40: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
cd50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
cd60: 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
cd70: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
cd80: 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70 58  (v, "# %.*s", pX
cd90: 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70  ->span.n, pX->sp
cda0: 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76  an.z));.    pLev
cdb0: 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 73  el->nIn++;.    s
cdc0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72  qliteReallocOrFr
cdd0: 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 65 76  ee((void**)&pLev
cde0: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  el->aInLoop,.   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
ce10: 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49 6e  zeof(pLevel->aIn
ce20: 4c 6f 6f 70 5b 30 5d 29 2a 32 2a 70 4c 65 76 65  Loop[0])*2*pLeve
ce30: 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 61 49 6e  l->nIn);.    aIn
ce40: 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f   = pLevel->aInLo
ce50: 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 49 6e 20  op;.    if( aIn 
ce60: 29 7b 0a 20 20 20 20 20 20 61 49 6e 20 2b 3d 20  ){.      aIn += 
ce70: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a 32 20 2d 20  pLevel->nIn*2 - 
ce80: 32 3b 0a 20 20 20 20 20 20 61 49 6e 5b 30 5d 20  2;.      aIn[0] 
ce90: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49  = iTab;.      aI
cea0: 6e 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  n[1] = sqlite3Vd
ceb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
cec0: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a  lumn, iTab, 0);.
ced0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cee0: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30   pLevel->nIn = 0
cef0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
cf00: 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
cf10: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
cf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cf30: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cf40: 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
cf50: 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
cf60: 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
cf70: 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65  ndex.  The value
cf80: 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
cf90: 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f  aints are left o
cfa0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  n the stack..**.
cfb0: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
cfc0: 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
cfd0: 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
cfe0: 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
cff0: 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
d000: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
d010: 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
d020: 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
d030: 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
d040: 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
d050: 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
d060: 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
d070: 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
d080: 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
d090: 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
d0a0: 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
d0b0: 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
d0c0: 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
d0d0: 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
d0e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
d0f0: 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
d100: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
d110: 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
d120: 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
d130: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
d140: 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c   and b will be l
d150: 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  eft.** on the st
d160: 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64  ack - a is the d
d170: 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68 65  eepest and b the
d180: 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a   shallowest..**.
d190: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
d1a0: 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
d1b0: 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
d1c0: 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
d1d0: 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
d1e0: 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
d1f0: 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
d200: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
d210: 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
d220: 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
d230: 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
d240: 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
d250: 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a  em memory cell..
d260: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d270: 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
d280: 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
d290: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
d2a0: 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64   puts.** the add
d2b0: 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d  ress of that mem
d2c0: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76  ory cell in pLev
d2d0: 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63  el->iMem.  The c
d2e0: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
d2f0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
d300: 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e  ill use pLevel->
d310: 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68  iMem to store th
d320: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
d330: 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
d340: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
d350: 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
d360: 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
d370: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
d380: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
d390: 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
d3a0: 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
d3b0: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
d3c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d3d0: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
d3e0: 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
d3f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
d400: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d410: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
d420: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
d430: 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
d440: 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
d450: 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
d460: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
d470: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
d480: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
d490: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
d4a0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
d4b0: 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
d4c0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
d4d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20  ed */.  int brk 
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d4f0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e   Jump here to en
d500: 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  d the loop */.){
d510: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65  .  int nEq = pLe
d520: 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20  vel->nEq;       
d530: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
d540: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
d550: 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
d560: 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d  /.  int termsInM
d570: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  em = 0;         
d580: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74    /* If true, st
d590: 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d  ore value in mem
d5a0: 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64  [] cells */.  Vd
d5b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d5c0: 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
d5d0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d5e0: 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
d5f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
d600: 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
d610: 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20  >pIdx;   /* The 
d620: 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
d630: 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
d640: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
d650: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
d660: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
d670: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
d680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
d690: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
d6a0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
d6b0: 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
d6c0: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
d6f0: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
d700: 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
d710: 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
d720: 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
d730: 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57  ate them..  ** W
d740: 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74  e always need at
d750: 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20   least one used 
d760: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f  to store the loo
d770: 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a  p terminator.  *
d780: 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  * value.  If the
d790: 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74  re are IN operat
d7a0: 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f  ors we'll need o
d7b0: 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f  ne for each == o
d7c0: 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72  r.  ** IN constr
d7d0: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65  aint..  */.  pLe
d7e0: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
d7f0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66  se->nMem++;.  if
d800: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
d810: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
d820: 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  N ){.    pParse-
d830: 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d  >nMem += pLevel-
d840: 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49  >nEq;.    termsI
d850: 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  nMem = 1;.  }.. 
d860: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
d870: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
d880: 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  aints.  */.  for
d890: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
d8a0: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
d8b0: 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
d8c0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
d8d0: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
d8e0: 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
d8f0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
d900: 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_IN, pIdx);.   
d910: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
d920: 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
d930: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
d940: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
d950: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71 75  0 );.    codeEqu
d960: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
d970: 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
d980: 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 74  evel);.    if( t
d990: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
d9a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
d9c0: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
d9d0: 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  +j+1, 1);.    }.
d9e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
d9f0: 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =nEq );..  /* Ma
da00: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
da10: 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
da20: 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70  s are on the top
da30: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20   of the stack.  
da40: 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e  */.  if( termsIn
da50: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  Mem ){.    for(j
da60: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
da70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
da80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
da90: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
daa0: 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20  Mem+j+1, 0);.   
dab0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65   }.  }.}..#if de
dac0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
dad0: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  T)./*.** The fol
dae0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
daf0: 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73  holds a text des
db00: 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72  cription of quer
db10: 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64  y plan generated
db20: 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20  .** by the most 
db30: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
db40: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
db50: 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ().  Each call t
db60: 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20  o WhereBegin.** 
db70: 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
db80: 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69  revious.  This i
db90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
dba0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
dbb0: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f  nd.** analysis o
dbc0: 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  nly..*/.char sql
dbd0: 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
dbe0: 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54  BMS*2*40];  /* T
dbf0: 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ext of the join 
dc00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51  */.static int nQ
dc10: 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Plan = 0;       
dc20: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
dc30: 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65  ree slow in _que
dc40: 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65  ry_plan[] */..#e
dc50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
dc60: 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46  EST */.../*.** F
dc70: 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
dc80: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
dc90: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
dca0: 66 6f 46 72 65 65 28 57 68 65 72 65 49 6e 66 6f  foFree(WhereInfo
dcb0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
dcc0: 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69   pWInfo ){.    i
dcd0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
dce0: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
dcf0: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
dd00: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
dd10: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
dd20: 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
dd30: 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
dd40: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nfo ){.        i
dd50: 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  f( pInfo->needTo
dd60: 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
dd70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dd80: 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53  free(pInfo->idxS
dd90: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tr);.        }. 
dda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
ddb0: 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  e(pInfo);.      
ddc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
ddd0: 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a  teFree(pWInfo);.
dde0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
ddf0: 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
de00: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
de10: 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
de20: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
de30: 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
de40: 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
de50: 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
de60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
de70: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
de80: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
de90: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
dea0: 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
deb0: 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
dec0: 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
ded0: 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
dee0: 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
def0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
df00: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
df10: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
df20: 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
df30: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
df40: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
df50: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
df60: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
df70: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
df80: 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
df90: 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
dfa0: 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
dfb0: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
dfc0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
dfd0: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
dfe0: 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
dff0: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
e000: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
e010: 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
e020: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
e030: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
e040: 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
e050: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
e060: 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
e070: 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
e080: 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
e090: 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
e0a0: 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
e0b0: 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
e0c0: 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
e0d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
e0e0: 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
e0f0: 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
e100: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
e110: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
e120: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
e130: 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
e140: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
e150: 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
e160: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
e170: 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
e180: 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
e190: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
e1c0: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
e1d0: 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
e1f0: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
e200: 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
e210: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
e220: 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
e230: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
e240: 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
e250: 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
e260: 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
e270: 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
e280: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
e290: 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
e2a0: 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
e2b0: 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
e2c0: 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
e2d0: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
e2e0: 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
e2f0: 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
e300: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
e310: 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
e320: 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
e330: 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
e340: 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
e350: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
e360: 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
e370: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
e380: 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
e390: 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
e3a0: 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
e3b0: 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
e3c0: 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
e3d0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
e3e0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
e3f0: 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
e400: 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
e410: 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
e420: 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
e430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
e440: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
e450: 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
e460: 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
e470: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
e480: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
e490: 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
e4a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
e4b0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
e4c0: 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
e4d0: 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
e4e0: 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
e4f0: 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
e500: 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
e510: 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
e520: 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
e530: 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
e540: 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
e550: 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
e560: 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
e570: 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
e580: 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
e590: 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
e5a0: 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
e5b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e5c0: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
e5d0: 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
e5e0: 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
e5f0: 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
e600: 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
e610: 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
e620: 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
e630: 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
e640: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
e650: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
e660: 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
e670: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
e680: 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
e690: 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
e6a0: 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
e6b0: 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
e6c0: 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
e6d0: 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
e6e0: 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
e6f0: 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
e700: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
e710: 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
e720: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
e730: 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
e740: 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
e750: 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
e760: 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
e770: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
e780: 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
e790: 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
e7a0: 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
e7b0: 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
e7c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
e7d0: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
e7e0: 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
e7f0: 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
e800: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
e810: 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
e820: 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
e830: 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
e840: 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
e850: 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
e860: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
e870: 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
e880: 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
e890: 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
e8a0: 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
e8b0: 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
e8c0: 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
e8d0: 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
e8e0: 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
e8f0: 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
e900: 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
e910: 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
e920: 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
e930: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
e940: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
e950: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
e960: 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
e970: 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
e980: 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
e990: 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
e9a0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
e9b0: 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
e9c0: 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
e9d0: 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
e9e0: 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
e9f0: 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
ea00: 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
ea10: 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
ea20: 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
ea30: 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
ea40: 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
ea50: 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
ea60: 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
ea70: 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
ea80: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
ea90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
eaa0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
eab0: 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
eac0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
ead0: 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
eae0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
eaf0: 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
eb00: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
eb10: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
eb20: 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
eb30: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
eb40: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
eb50: 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
eb60: 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
eb70: 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
eb80: 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
eb90: 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
eba0: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
ebb0: 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
ebc0: 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
ebd0: 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
ebe0: 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
ebf0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
ec00: 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
ec10: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
ec20: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
ec30: 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
ec40: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
ec50: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
ec60: 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
ec70: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
ec80: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
ec90: 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
eca0: 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
ecb0: 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
ecc0: 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
ecd0: 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
ece0: 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
ecf0: 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
ed00: 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
ed10: 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
ed20: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
ed30: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
ed40: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
ed50: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
ed60: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
ed70: 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
ed80: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
ed90: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
eda0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
edb0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
edc0: 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20  **ppOrderBy  /* 
edd0: 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
ede0: 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  se, or NULL */.)
edf0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee10: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ee20: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
ee30: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
ee40: 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
ee50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
ee60: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
ee70: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
ee80: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
ee90: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
eea0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
eeb0: 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e  /.  int brk, con
eec0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
eed0: 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64  * Addresses used
eee0: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
eef0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  eration */.  Bit
ef00: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
ef10: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
ef20: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
ef30: 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
ef40: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
ef50: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
ef60: 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
ef70: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
ef80: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  use */.  ExprMas
ef90: 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20 20  kSet maskSet;   
efa0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
efb0: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
efc0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
efd0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  wc;            /
efe0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
eff0: 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  se is divided in
f000: 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20 2a  to these terms *
f010: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
f020: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
f030: 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20  m;  /* A single 
f040: 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c  entry from pTabL
f050: 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ist */.  WhereLe
f060: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
f070: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
f080: 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74 68  ngle level in th
f090: 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f  e pWInfo list */
f0a0: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20  .  int iFrom;   
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
f0d0: 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ed FROM clause e
f0e0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
f0f0: 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20 20  andFlags;       
f100: 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64         /* AND-ed
f110: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
f120: 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73  all wc.a[].flags
f130: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
f140: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
f150: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
f160: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
f170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
f180: 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
f190: 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28  mask .  */.  if(
f1a0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
f1b0: 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
f1c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f1d0: 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
f1e0: 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
f1f0: 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
f200: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
f210: 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
f220: 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
f230: 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
f240: 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
f250: 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
f260: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
f270: 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
f280: 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
f290: 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b  skSet(&maskSet);
f2a0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
f2b0: 69 74 28 26 77 63 2c 20 70 50 61 72 73 65 29 3b  it(&wc, pParse);
f2c0: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
f2d0: 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
f2e0: 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
f2f0: 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
f300: 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
f310: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
f320: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
f330: 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
f340: 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49  alue..  */.  pWI
f350: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
f360: 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65  oc( sizeof(Where
f370: 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74  Info) + pTabList
f380: 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68  ->nSrc*sizeof(Wh
f390: 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66  ereLevel));.  if
f3a0: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
f3b0: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
f3c0: 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
f3d0: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
f3e0: 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
f3f0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
f400: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
f410: 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
f420: 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
f430: 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
f440: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
f450: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f460: 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
f470: 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
f480: 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
f490: 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
f4a0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
f4b0: 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
f4c0: 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
f4d0: 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
f4e0: 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
f4f0: 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
f500: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
f510: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
f520: 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29  Constant(pWhere)
f530: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f540: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
f550: 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
f560: 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a  fo->iBreak, 1);.
f570: 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
f580: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
f590: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
f5a0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
f5b0: 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
f5c0: 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
f5d0: 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
f5e0: 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
f5f0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
f600: 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
f610: 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
f620: 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
f630: 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
f640: 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
f650: 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
f660: 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
f670: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
f680: 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
f690: 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
f6a0: 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  essed..  */.  fo
f6b0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
f6c0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
f6d0: 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d     createMask(&m
f6e0: 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
f6f0: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
f700: 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79  .  }.  exprAnaly
f710: 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
f720: 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a  &maskSet, &wc);.
f730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
f740: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
f750: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
f760: 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20  inNoMem;.  }..  
f770: 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
f780: 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
f790: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
f7a0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f7b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
f7c0: 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
f7d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
f7e0: 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
f7f0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
f800: 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
f810: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
f820: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
f830: 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
f840: 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20  o->a[].flags    
f850: 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
f860: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f870: 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
f880: 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
f890: 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
f8a0: 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
f8b0: 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
f8c0: 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
f8d0: 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66      When term of
f8e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f8f0: 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a   is being coded.
f900: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
f910: 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65  [].iTabCur   The
f920: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
f930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
f940: 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ble.  **   pWInf
f950: 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20  o->a[].iIdxCur  
f960: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
f970: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
f980: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
f990: 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
f9a0: 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
f9b0: 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
f9c0: 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
f9d0: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
f9e0: 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
f9f0: 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74  mask)0;.  pTabIt
fa00: 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
fa10: 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  ;.  pLevel = pWI
fa20: 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61  nfo->a;.  andFla
fa30: 67 73 20 3d 20 7e 30 3b 0a 20 20 54 52 41 43 45  gs = ~0;.  TRACE
fa40: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
fa50: 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
fa60: 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
fa70: 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
fa80: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
fa90: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
faa0: 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
fab0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
fac0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
fad0: 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
fae0: 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
faf0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65  Flags asssociate
fb20: 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
fb30: 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
fb60: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
fb70: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63   */.    double c
fb80: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
fb90: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
fba0: 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
fbb0: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fbd0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
fbe0: 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
fbf0: 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
fc00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
fc10: 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
fc20: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
fc30: 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67      int bestFlag
fc40: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
fc50: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
fc60: 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
fc70: 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45  /.    int bestNE
fc80: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
fc90: 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61    /* nEq associa
fca0: 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
fcb0: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77  /.    double low
fcc0: 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  estCost;        
fcd0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65    /* Cost of the
fce0: 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e   pBest */.    in
fcf0: 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20  t bestJ = 0;    
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fd10: 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20   value of j */. 
fd20: 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20     Bitmask m;   
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd40: 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20  * Bitmask value 
fd50: 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a  for j or bestJ *
fd60: 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  /.    int once =
fd70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
fd80: 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66    /* True when f
fd90: 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65  irst table is se
fda0: 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  en */.    sqlite
fdb0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
fdc0: 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74  ndex; /* Current
fdd0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a   virtual index *
fde0: 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  /..    lowestCos
fdf0: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
fe00: 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46  BL;.    for(j=iF
fe10: 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
fe20: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
fe30: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
fe40: 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
fe50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  ){.      int doN
fe60: 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54  otReorder;  /* T
fe70: 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
fe80: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
fe90: 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20  reordered */..  
fea0: 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
feb0: 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
fec0: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
fed0: 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
fee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fef0: 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28      || (j>0 && (
ff00: 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69  pTabItem[-1].joi
ff10: 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
ff20: 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 3b  |JT_CROSS))!=0);
ff30: 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
ff40: 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
ff50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
ff60: 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
ff70: 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
ff80: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
ff90: 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
ffa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ffb0: 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
ffc0: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
ffd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ffe0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
fff0: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
10000 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10010 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10020 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
10030 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
10040 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
10050 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
10060 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
10070 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
10080 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
10090 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
100a0 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
100b0 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
100c0 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
100f0 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
10100 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
10130 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
10140 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
10150 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
10160 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a        pIndex = *
10170 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  ppIdxInfo;.     
10180 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
10190 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79   pIndex->orderBy
101a0 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
101b0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
101c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
101d0 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   | WHERE_ORDERBY
101e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
101f0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
10200 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20        nEq = 0;. 
10210 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64       }else .#end
10220 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
10230 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e     cost = bestIn
10240 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c  dex(pParse, &wc,
10250 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
10260 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10280 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  ==0 && ppOrderBy
10290 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a  ) ? *ppOrderBy :
102a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 49               &pI
102c0 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71  dx, &flags, &nEq
102d0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  );.        pInde
102e0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
102f0 20 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f       if( cost<lo
10300 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20  westCost ){.    
10310 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20      once = 1;.  
10320 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
10330 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20   = cost;.       
10340 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
10350 20 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73         bestFlags
10360 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   = flags;.      
10370 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b    bestNEq = nEq;
10380 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d  .        bestJ =
10390 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76   j;.        pLev
103a0 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 3d 20 70  el->pBestIdx = p
103b0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  Index;.      }. 
103c0 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65       if( doNotRe
103d0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
103e0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
103f0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63  "*** Optimizer c
10400 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66  hoose table %d f
10410 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62  or loop %d\n", b
10420 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20  estJ,.          
10430 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
10440 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65  a));.    if( (be
10450 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  stFlags & WHERE_
10460 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20  ORDERBY)!=0 ){. 
10470 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
10480 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
10490 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46  ndFlags &= bestF
104a0 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
104b0 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  ->flags = bestFl
104c0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
104d0 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20  >pIdx = pBest;. 
104e0 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d     pLevel->nEq =
104f0 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c   bestNEq;.    pL
10500 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20  evel->aInLoop = 
10510 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  0;.    pLevel->n
10520 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  In = 0;.    if( 
10530 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70  pBest ){.      p
10540 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
10550 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10570 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
10580 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
10590 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
105a0 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
105b0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
105c0 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
105d0 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
105e0 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54  = bestJ;.  }.  T
105f0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
10600 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
10610 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  *\n"));..  /* If
10620 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
10630 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
10640 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
10650 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
10660 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
10670 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
10680 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
10690 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
106a0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
106b0 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
106c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
106d0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
106e0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
106f0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
10700 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
10710 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
10720 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
10730 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
10740 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
10750 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
10760 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
10770 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72  er Goto */.  for
10780 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
10790 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
107a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
107b0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
107c0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
107d0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
107e0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
107f0 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  x;      /* Index
10800 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
10810 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f  pTab (if any) */
10820 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
10830 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10840 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
10850 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
10860 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  x */.    int iId
10870 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
10880 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66  IdxCur;..#ifndef
10890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
108a0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
108b0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
108c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
108d0 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
108e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
108f0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
10900 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
10910 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
10920 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10930 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74  ("TABLE %s", pIt
10940 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
10950 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
10960 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ias ){.        z
10970 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
10980 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73 22 2c  intf("%z AS %s",
10990 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
109a0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
109b0 20 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20       if( (pIx = 
109c0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
109d0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
109e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
109f0 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58  f("%z WITH INDEX
10a00 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d   %s", zMsg, pIx-
10a10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
10a20 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
10a30 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
10a40 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
10a50 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
10a60 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
10a70 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
10a80 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
10a90 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
10aa0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10ab0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10ac0 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20  ABLE.      else 
10ad0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
10ae0 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  tIdx ){.        
10af0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10b00 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
10b10 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
10b20 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
10b30 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
10b40 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %z VIRTUAL TABLE
10b50 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
10b60 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
10b70 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
10b80 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65 73 74  x->idxNum, pBest
10b90 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
10ba0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10bb0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
10bc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
10bd0 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ERBY ){.        
10be0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
10bf0 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20  rintf("%z ORDER 
10c00 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  BY", zMsg);.    
10c10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10c20 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 45  3VdbeOp3(v, OP_E
10c30 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65  xplain, i, pLeve
10c40 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l->iFrom, zMsg, 
10c50 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
10c60 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
10c70 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
10c80 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d   */.    pTabItem
10c90 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
10ca0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
10cb0 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
10cc0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
10cd0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10ce0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
10cf0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
10d00 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ema);.    if( pT
10d10 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70  ab->isEphem || p
10d20 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
10d30 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
10d40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10d50 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
10d60 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  ( pLevel->pBestI
10d70 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
10d80 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
10d90 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
10da0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10db0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
10dc0 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  , 0, (const char
10dd0 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50  *)pTab->pVtab, P
10de0 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  3_VTAB);.    }el
10df0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
10e00 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
10e10 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
10e20 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
10e30 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
10e40 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
10e50 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
10e60 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
10e70 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  d);.      if( pT
10e80 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66  ab->nCol<(sizeof
10e90 28 42 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a  (Bitmask)*8) ){.
10ea0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
10eb0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
10ec0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
10ed0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
10ee0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
10ef0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
10f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10f10 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33  ngeP2(v, sqlite3
10f20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10f30 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20  v)-1, n);.      
10f40 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
10f50 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
10f60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10f70 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10f80 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
10f90 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
10fa0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10fb0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
10fc0 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
10fd0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
10fe0 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65    if( (pIx = pLe
10ff0 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b  vel->pIdx)!=0 ){
11000 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
11010 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
11020 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
11030 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61  e, pIx);.      a
11040 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
11050 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
11060 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
11070 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11080 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
11090 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
110a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73  omment((v, "# %s
110b0 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
110c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
110d0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
110e0 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
110f0 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  Ix->tnum,.      
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11110 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  char*)pKey, P3_K
11120 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
11130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
11140 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
11150 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
11160 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11170 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11180 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
11190 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
111a0 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20  nColumn+1);.    
111b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
111c0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
111d0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
111e0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
111f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11200 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
11210 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
11220 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
11230 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
11240 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
11250 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
11260 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
11270 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
11280 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
11290 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
112a0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
112b0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
112c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
112d0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
112e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
112f0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
11300 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
11310 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
11320 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20  m->iCursor;  /* 
11330 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
11340 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
11350 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
11360 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
11370 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
11380 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
11390 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
113a0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
113b0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
113c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74   */.    int omit
113d0 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72  Table;     /* Tr
113e0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
113f0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
11400 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20     int bRev;    
11410 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
11420 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
11430 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
11440 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  r */..    pTabIt
11450 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
11460 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
11470 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61  ;.    iCur = pTa
11480 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
11490 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
114a0 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  l->pIdx;.    iId
114b0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
114c0 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76  IdxCur;.    bRev
114d0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
114e0 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
114f0 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54  E)!=0;.    omitT
11500 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
11510 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
11520 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  X_ONLY)!=0;..   
11530 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
11540 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
11550 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
11560 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
11570 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
11580 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
11590 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b   to brk to break
115a0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
115b0 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63      ** Jump to c
115c0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
115d0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
115e0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
115f0 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a  he.    ** loop..
11600 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d      */.    brk =
11610 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73   pLevel->brk = s
11620 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11630 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74  bel(v);.    cont
11640 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20   = pLevel->cont 
11650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11660 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
11670 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
11680 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
11690 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
116a0 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
116b0 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  .    ** initiali
116c0 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
116d0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
116e0 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
116f0 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  hes any.    ** r
11700 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
11710 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
11720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11730 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
11740 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31   && (pTabItem[-1
11750 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
11760 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
11770 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
11780 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem ) pParse->nM
11790 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76  em++;.      pLev
117a0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
117b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
117d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
117e0 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  Int, 0, pLevel->
117f0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
11800 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11810 2c 20 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a  , "# init LEFT J
11820 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
11830 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  g"));.    }..#if
11840 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11860 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42    if( pLevel->pB
11870 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  estIdx ){.      
11880 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
11890 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
118a0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
118b0 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
118c0 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  Next.      **   
118d0 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
118e0 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20   the data..     
118f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
11900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
11910 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74  ndex_info *pBest
11920 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42  Idx = pLevel->pB
11930 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e  estIdx;.      in
11940 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
11950 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74  pBestIdx->nConst
11960 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72  raint;.      str
11970 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11980 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11990 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
119d0 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72  BestIdx->aConstr
119e0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20  aintUsage;.     
119f0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
11a00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
11a10 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
11a20 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
11a60 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
11a70 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
11a80 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  <=nConstraint; j
11a90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11aa0 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
11ab0 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69  k=0; k<nConstrai
11ac0 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; k++){.      
11ad0 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
11ae0 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
11af0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
11b00 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
11b10 72 61 69 6e 74 5b 6a 2d 31 5d 2e 69 54 65 72 6d  raint[j-1].iTerm
11b20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
11b30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11b40 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61  ode(pParse, wc.a
11b50 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70  [iTerm].pExpr->p
11b60 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
11b70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
11ba0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
11bb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11bd0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11be0 72 2c 20 6a 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r, j-1, 0);.    
11bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11c00 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
11c10 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 4e  , pBestIdx->idxN
11c20 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  um, 0);.      sq
11c30 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11c40 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
11c50 2c 20 62 72 6b 2c 20 70 42 65 73 74 49 64 78 2d  , brk, pBestIdx-
11c60 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  >idxStr,.       
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11c80 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46  BestIdx->needToF
11c90 72 65 65 49 64 78 53 74 72 20 3f 20 50 33 5f 4d  reeIdxStr ? P3_M
11ca0 50 52 49 4e 54 46 20 3a 20 50 33 5f 53 54 41 54  PRINTF : P3_STAT
11cb0 49 43 29 3b 0a 20 20 20 20 20 20 70 42 65 73 74  IC);.      pBest
11cc0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
11cd0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
11ce0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65 73   for(j=0; j<pBes
11cf0 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  tIdx->nConstrain
11d00 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
11d10 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
11d20 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
11d30 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
11d40 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
11d50 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
11d60 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
11d70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54 65  Level, &wc.a[iTe
11d80 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rm]);.        }.
11d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
11da0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
11db0 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
11dc0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
11dd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
11de0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11df0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
11e00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
11e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11e20 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 20  UALTABLE */..   
11e30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
11e40 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
11e50 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
11e60 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
11e70 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
11e80 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
11e90 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
11ea0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
11eb0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
11ec0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
11ed0 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
11ee0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
11ef0 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
11f00 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
11f10 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
11f20 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
11f30 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
11f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 54       */.      pT
11f50 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
11f60 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
11f70 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
11f80 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  _IN, 0);.      a
11f90 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
11fa0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11fb0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
11fc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11fd0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
11fe0 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
11ff0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
12000 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
12010 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
12020 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
12030 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20   brk, pLevel);. 
12040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12050 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
12060 42 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a  BeInt, 1, brk);.
12070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12080 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
12090 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 62 72  Exists, iCur, br
120a0 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  k);.      VdbeCo
120b0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
120c0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
120d0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
120e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
120f0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
12100 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
12110 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32  .      /* Case 2
12120 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
12130 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
12140 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
12150 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
12160 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
12170 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
12180 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  ;.      int star
12190 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  t;.      WhereTe
121a0 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
121b0 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  d;..      assert
121c0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
121d0 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  ;.      pStart =
121e0 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
121f0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
12200 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
12210 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  0);.      pEnd =
12220 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
12230 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
12240 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
12250 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52  0);.      if( bR
12260 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ev ){.        pT
12270 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
12280 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
12290 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e  End;.        pEn
122a0 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  d = pTerm;.     
122b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 74   }.      if( pSt
122c0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45  art ){.        E
122d0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
122e0 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
122f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
12300 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
12310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
12320 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
12330 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
12340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12350 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
12360 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73  ight);.        s
12370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12380 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20  v, OP_ForceInt, 
12390 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pX->op==TK_LE ||
123a0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20   pX->op==TK_GT, 
123b0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  brk);.        sq
123c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
123d0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65  , bRev ? OP_Move
123e0 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  Lt : OP_MoveGe, 
123f0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
12400 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
12410 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
12420 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
12430 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
12440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12460 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f  eAddOp(v, bRev ?
12470 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
12480 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29  wind, iCur, brk)
12490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
124a0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
124b0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
124c0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
124d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
124e0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
124f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12500 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
12510 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
12520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12530 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
12540 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
12550 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
12560 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
12570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12580 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12590 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
125a0 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
125b0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
125c0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
125d0 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
125e0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
125f0 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
12600 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12610 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
12620 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
12630 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20  : OP_Gt;.       
12640 20 7d 0a 20 20 20 20 20 20 20 20 64 69 73 61 62   }.        disab
12650 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
12660 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  End);.      }.  
12670 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
12680 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12690 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65  dr(v);.      pLe
126a0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
126b0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
126c0 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
126d0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
126e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
126f0 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28  start;.      if(
12700 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
12710 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12720 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12730 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
12740 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
12750 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12760 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
12770 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
12780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12790 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70  eAddOp(v, testOp
127a0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
127b0 45 52 49 43 2c 20 62 72 6b 29 3b 0a 20 20 20 20  ERIC, brk);.    
127c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
127d0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
127e0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
127f0 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
12800 20 43 61 73 65 20 33 3a 20 54 68 65 20 57 48 45   Case 3: The WHE
12810 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
12820 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 74 68  hat refers to th
12830 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20  e right-most.   
12840 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
12850 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
12860 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  x is an inequali
12870 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ty.  For example
12880 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20  , if.      **   
12890 20 20 20 20 20 20 74 68 65 20 69 6e 64 65 78 20        the index 
128a0 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e  is on (x,y,z) an
128b0 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  d the WHERE clau
128c0 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20  se is of the.   
128d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f     **         fo
128e0 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30  rm "x=5 AND y<10
128f0 22 20 74 68 65 6e 20 74 68 69 73 20 63 61 73 65  " then this case
12900 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20   is used.  Only 
12910 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
12920 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20       right-most 
12930 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
12940 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
12950 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
12960 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
12970 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
12980 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
12990 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
129a0 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
129b0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
129c0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
129d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
129e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
129f0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
12a00 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
12a10 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
12a20 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20  rder.      **   
12a30 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
12a40 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
12a50 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
12a60 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20   ORDER BY..     
12a70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
12a80 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
12a90 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
12aa0 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 45  ;.      int topE
12ab0 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  q=0;        /* T
12ac0 72 75 65 20 69 66 20 74 6f 70 20 6c 69 6d 69 74  rue if top limit
12ad0 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20   uses ==. False 
12ae0 69 73 20 73 74 72 69 63 74 6c 79 20 3c 20 2a 2f  is strictly < */
12af0 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 45 71  .      int btmEq
12b00 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  =0;        /* Tr
12b10 75 65 20 69 66 20 62 74 6d 20 6c 69 6d 69 74 20  ue if btm limit 
12b20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69  uses ==. False i
12b30 66 20 73 74 72 69 63 74 6c 79 20 3e 20 2a 2f 0a  f strictly > */.
12b40 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4f 70 2c        int topOp,
12b50 20 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f 70 65   btmOp;   /* Ope
12b60 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 74  rators for the t
12b70 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 73 65  op and bottom se
12b80 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20  arch bounds */. 
12b90 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 3b       int testOp;
12ba0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 4e  .      int nNotN
12bb0 75 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  ull;       /* Nu
12bc0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
12bd0 69 6e 64 65 78 20 74 68 61 74 20 6d 75 73 74 20  index that must 
12be0 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  be non-NULL */. 
12bf0 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69       int topLimi
12c00 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  t = (pLevel->fla
12c10 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
12c20 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20  IMIT)!=0;.      
12c30 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28  int btmLimit = (
12c40 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
12c50 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
12c60 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  !=0;..      /* G
12c70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12c80 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
12c90 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
12ca0 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
12cb0 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20     ** and level 
12cc0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
12cd0 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  ose terms on the
12ce0 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stack..      */
12cf0 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71  .      codeAllEq
12d00 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
12d10 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c  se, pLevel, &wc,
12d20 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b   notReady, brk);
12d30 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69  ..      /* Dupli
12d40 63 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  cate the equalit
12d50 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65  y term values be
12d60 63 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20  cause they will 
12d70 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  all be.      ** 
12d80 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65  used twice: once
12d90 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72   to make the ter
12da0 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64  mination key and
12db0 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68   once to make th
12dc0 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74  e.      ** start
12dd0 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
12de0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12df0 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nEq; j++){.     
12e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e10 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e  dOp(v, OP_Dup, n
12e20 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eq-1, 0);.      
12e30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  }..      /* Figu
12e40 72 65 20 6f 75 74 20 77 68 61 74 20 63 6f 6d 70  re out what comp
12e50 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73  arison operators
12e60 20 74 6f 20 75 73 65 20 66 6f 72 20 74 6f 70 20   to use for top 
12e70 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20  and bottom .    
12e80 20 20 2a 2a 20 73 65 61 72 63 68 20 62 6f 75 6e    ** search boun
12e90 64 73 2e 20 46 6f 72 20 61 6e 20 61 73 63 65 6e  ds. For an ascen
12ea0 64 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 20  ding index, the 
12eb0 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20  bottom bound is 
12ec0 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20  a > or >=.      
12ed0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e 64 20  ** operator and 
12ee0 74 68 65 20 74 6f 70 20 62 6f 75 6e 64 20 69 73  the top bound is
12ef0 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61   a < or <= opera
12f00 74 6f 72 2e 20 20 46 6f 72 20 61 20 64 65 73 63  tor.  For a desc
12f10 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ending.      ** 
12f20 69 6e 64 65 78 20 74 68 65 20 6f 70 65 72 61 74  index the operat
12f30 6f 72 73 20 61 72 65 20 72 65 76 65 72 73 65 64  ors are reversed
12f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12f50 20 6e 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 45 71 20   nNotNull = nEq 
12f60 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20  + topLimit;.    
12f70 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
12f80 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
12f90 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
12fa0 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f        topOp = WO
12fb0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _LT|WO_LE;.     
12fc0 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54     btmOp = WO_GT
12fd0 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65  |WO_GE;.      }e
12fe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  lse{.        top
12ff0 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  Op = WO_GT|WO_GE
13000 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
13010 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13020 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c         SWAP(int,
13030 20 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69   topLimit, btmLi
13040 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  mit);.      }.. 
13050 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
13060 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
13070 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20 74   key.  This is t
13080 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 61  he key value tha
13090 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
130a0 65 6e 64 20 74 68 65 20 73 65 61 72 63 68 2e 20  end the search. 
130b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65 72   There is no ter
130c0 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69 66 20  mination key if 
130d0 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  there.      ** a
130e0 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79 20 74  re no equality t
130f0 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e  erms and no "X<.
13100 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20 20 20  .." term..      
13110 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32  **.      ** 2002
13120 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65  -Dec-04: On a re
13130 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e  verse-order scan
13140 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20  , the so-called 
13150 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20  "termination".  
13160 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75      ** key compu
13170 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c 79 20  ted here really 
13180 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 68  ends up being th
13190 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  e start key..   
131a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
131b0 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  topLimit ){.    
131c0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
131d0 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
131e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
131f0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
13200 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
13210 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
13220 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29 3b 0a  , topOp, pIdx);.
13230 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13240 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
13250 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
13260 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
13270 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
13280 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
13290 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
132a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
132b0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
132c0 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 74 6f  ght);.        to
132d0 70 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  pEq = pTerm->eOp
132e0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
132f0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20  WO_GE);.        
13300 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
13310 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  el, pTerm);.    
13320 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f      testOp = OP_
13330 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c  IdxGE;.      }el
13340 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
13350 4f 70 20 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f  Op = nEq>0 ? OP_
13360 49 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b  IdxGE : OP_Noop;
13370 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d  .        topEq =
13380 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
13390 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
133a0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
133b0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20   int nCol = nEq 
133c0 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20  + topLimit;.    
133d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d      pLevel->iMem
133e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
133f0 2b 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64  +;.        build
13400 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43  IndexProbe(v, nC
13410 6f 6c 2c 20 6e 45 71 2c 20 62 72 6b 2c 20 70 49  ol, nEq, brk, pI
13420 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
13430 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
13440 20 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f 70 45     int op = topE
13450 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a 20  q ? OP_MoveLe : 
13460 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20  OP_MoveLt;.     
13470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13480 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64  AddOp(v, op, iId
13490 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
134a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
134b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
134c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
134d0 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
134e0 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
134f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
13500 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
13510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13520 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69  Op(v, OP_Last, i
13530 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
13540 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13550 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 74 61  Generate the sta
13560 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73  rt key.  This is
13570 20 74 68 65 20 6b 65 79 20 74 68 61 74 20 64 65   the key that de
13580 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72 0a  fines the lower.
13590 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20 6f        ** bound o
135a0 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54  n the search.  T
135b0 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72 74  here is no start
135c0 20 6b 65 79 20 69 66 20 74 68 65 72 65 20 61 72   key if there ar
135d0 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65 71  e no.      ** eq
135e0 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64  uality terms and
135f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
13600 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20 49  "X>..." term.  I
13610 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  n.      ** that 
13620 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20 61  case, generate a
13630 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72 75   "Rewind" instru
13640 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f  ction in place o
13650 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  f the.      ** s
13660 74 61 72 74 20 6b 65 79 20 73 65 61 72 63 68 2e  tart key search.
13670 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13680 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
13690 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  In the case of a
136a0 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73   reverse-order s
136b0 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63 61  earch, the so-ca
136c0 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22 73  lled.      ** "s
136d0 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c 79  tart" key really
136e0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 75   ends up being u
136f0 73 65 64 20 61 73 20 74 68 65 20 74 65 72 6d 69  sed as the termi
13700 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20 20  nation key..    
13710 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
13720 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
13730 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
13740 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64       int k = pId
13750 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
13760 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
13770 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
13780 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
13790 20 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b 0a 20   btmOp, pIdx);. 
137a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
137b0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20  Term!=0 );.     
137c0 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70     pX = pTerm->p
137d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73  Expr;.        as
137e0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
137f0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
13800 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
13810 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13820 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
13830 68 74 29 3b 0a 20 20 20 20 20 20 20 20 62 74 6d  ht);.        btm
13840 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Eq = pTerm->eOpe
13850 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
13860 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64  O_GE);.        d
13870 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
13880 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  l, pTerm);.     
13890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138a0 62 74 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  btmEq = 1;.     
138b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
138c0 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29  >0 || btmLimit )
138d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
138e0 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69  ol = nEq + btmLi
138f0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 62 75 69  mit;.        bui
13900 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
13910 6e 43 6f 6c 2c 20 30 2c 20 62 72 6b 2c 20 70 49  nCol, 0, brk, pI
13920 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
13930 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
13940 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
13950 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
13960 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13970 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13980 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
13990 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
139a0 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
139b0 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20  = OP_IdxLT;.    
139c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
139d0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74       int op = bt
139e0 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20  mEq ? OP_MoveGe 
139f0 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  : OP_MoveGt;.   
13a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a10 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
13a20 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
13a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
13a40 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
13a50 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
13a60 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
13a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13a90 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49  v, OP_Rewind, iI
13aa0 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
13ab0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
13ac0 65 6e 65 72 61 74 65 20 74 68 65 20 74 68 65 20  enerate the the 
13ad0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  top of the loop.
13ae0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20    If there is a 
13af0 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20  termination.    
13b00 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65    ** key we have
13b10 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61   to test for tha
13b20 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20  t key and abort 
13b30 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
13b40 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e  e.      ** loop.
13b50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13b60 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
13b70 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13b80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  );.      if( tes
13b90 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
13ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13bb0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13bc0 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
13bd0 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
13be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13bf0 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49  Op(v, testOp, iI
13c00 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
13c10 20 20 20 20 20 69 66 28 20 28 74 6f 70 45 71 20       if( (topEq 
13c20 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62  && !bRev) || (!b
13c30 74 6d 45 71 20 26 26 20 62 52 65 76 29 20 29 7b  tmEq && bRev) ){
13c40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13c50 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
13c60 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54  , -1, "+", P3_ST
13c70 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
13c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13ca0 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49  v, OP_RowKey, iI
13cb0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
13cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13cd0 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c  p(v, OP_IdxIsNul
13ce0 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c 20 63 6f 6e  l, nNotNull, con
13cf0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f  t);.      if( !o
13d00 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
13d10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d20 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
13d30 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29  wid, iIdxCur, 0)
13d40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13d50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13d60 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
13d70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13d80 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
13d90 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
13da0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
13db0 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  e loop..      */
13dc0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
13dd0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
13de0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
13df0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
13e00 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
13e10 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
13e20 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
13e30 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
13e40 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
13e50 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  Q ){.      /* Ca
13e60 73 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20  se 4:  There is 
13e70 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c  an index and all
13e80 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
13e90 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
13ea0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
13eb0 20 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69    refer to the i
13ec0 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22  ndex using the "
13ed0 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
13ee0 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ators..      */.
13ef0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
13f00 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
13f10 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20   pLevel->nEq;.. 
13f20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
13f30 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
13f40 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
13f50 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
13f60 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61  or IN.      ** a
13f70 6e 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c  nd leave the val
13f80 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
13f90 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ms on the stack.
13fa0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13fb0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
13fc0 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
13fd0 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
13fe0 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20  dy, brk);..     
13ff0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
14000 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77  ingle key that w
14010 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62  ill be used to b
14020 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65  oth start and te
14030 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a  rminate.      **
14040 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
14050 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64    */.      build
14060 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45  IndexProbe(v, nE
14070 71 2c 20 30 2c 20 62 72 6b 2c 20 70 49 64 78 29  q, 0, brk, pIdx)
14080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14090 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
140a0 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
140b0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20  >iMem, 0);..    
140c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
140d0 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74  de (1) to move t
140e0 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  o the first matc
140f0 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
14100 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
14110 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74   ** Then generat
14120 65 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20  e code (2) that 
14130 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22 20 61  jumps to "brk" a
14140 66 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  fter the cursor 
14150 69 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  is past.      **
14160 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69   the last matchi
14170 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
14180 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
14190 64 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74  de (1) is execut
141a0 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  ed.      ** once
141b0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
141c0 68 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63  he search, the c
141d0 6f 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75  ode (2) is execu
141e0 74 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a  ted before each.
141f0 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69        ** iterati
14200 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74  on of the scan t
14210 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61  o see if the sca
14220 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20  n has finished. 
14230 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  */.      if( bRe
14240 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  v ){.        /* 
14250 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
14260 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
14270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14280 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20  p(v, OP_MoveLe, 
14290 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
142a0 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
142b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
142c0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
142d0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
142e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
142f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14300 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20  IdxLT, iIdxCur, 
14310 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  brk);.        pL
14320 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
14330 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
14340 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
14350 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
14360 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  order */.       
14370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14380 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
14390 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
143a0 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
143b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
143c0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
143d0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
143e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
143f0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64  VdbeOp3(v, OP_Id
14400 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20 62 72  xGE, iIdxCur, br
14410 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  k, "+", P3_STATI
14420 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  C);.        pLev
14430 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
14440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14460 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69  (v, OP_RowKey, i
14470 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
14480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14490 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75  Op(v, OP_IdxIsNu
144a0 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a  ll, nEq, cont);.
144b0 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
144c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
144d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
144e0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
144f0 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
14500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14510 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
14520 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
14530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
14540 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
14550 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
14560 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
14570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14580 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
14590 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
145a0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
145b0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
145c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
145d0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
145e0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
145f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
14600 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
14610 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
14620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
14630 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
14640 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
14650 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
14660 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
14670 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
14680 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
14690 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
146a0 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
146b0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
146c0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
146d0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
146e0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
146f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
14700 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
14710 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
14720 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
14730 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
14740 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
14750 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
14760 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
14770 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
14780 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
14790 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
147a0 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
147b0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
147c0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
147d0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
147e0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
147f0 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
14800 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
14810 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
14820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14830 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
14840 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
14850 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
14860 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
14870 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
14880 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14890 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
148a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
148b0 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20  arse, pE, cont, 
148c0 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  1);.      pTerm-
148d0 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
148e0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ODED;.    }..   
148f0 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
14900 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
14910 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
14920 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
14930 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ct that.    ** a
14940 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
14950 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
14960 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
14970 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
14980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14990 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
149a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  n ){.      pLeve
149b0 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  l->top = sqlite3
149c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
149d0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
149e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
149f0 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76  _MemInt, 1, pLev
14a00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
14a10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14a20 74 28 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20  t((v, "# record 
14a30 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
14a40 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
14a50 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77  m=wc.a, j=0; j<w
14a60 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  c.nTerm; j++, pT
14a70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
14a80 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
14a90 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
14aa0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
14ab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14ac0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14ad0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
14ae0 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
14af0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14b00 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
14b10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14b20 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
14b30 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
14b40 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  r, cont, 1);.   
14b50 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
14b60 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
14b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b80 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
14b90 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
14ba0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
14bb0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
14bc0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
14bd0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
14be0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
14bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
14c00 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
14c10 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
14c20 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
14c30 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
14c40 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
14c50 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
14c60 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
14c70 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
14c80 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
14c90 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
14ca0 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
14cb0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
14cc0 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
14cd0 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
14ce0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14cf0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
14d00 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14d10 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
14d20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
14d30 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
14d40 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
14d50 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
14d60 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
14d70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
14d80 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
14d90 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
14da0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
14db0 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
14dc0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
14dd0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
14de0 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
14df0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
14e00 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
14e10 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
14e20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
14e30 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
14e40 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b  [nQPlan], "{}");
14e50 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
14e60 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
14e70 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  e{.        strcp
14e80 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
14e90 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
14ea0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
14eb0 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
14ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
14ed0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
14ee0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
14ef0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14f00 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
14f10 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
14f20 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
14f30 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
14f40 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
14f50 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20  QPlan], "* ");. 
14f60 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
14f70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14f80 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
14f90 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ){.      strcpy(
14fa0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
14fb0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
14fc0 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   ");.      nQPla
14fd0 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  n += 3;.    }els
14fe0 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  e{.      n = str
14ff0 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78  len(pLevel->pIdx
15000 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
15010 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
15020 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
15030 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
15040 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
15050 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
15060 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
15070 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
15080 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
15090 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71  += n;.        sq
150a0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
150b0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
150c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
150d0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50    }.  while( nQP
150e0 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33  lan>0 && sqlite3
150f0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
15100 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  an-1]==' ' ){.  
15110 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
15120 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d  plan[--nQPlan] =
15130 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
15140 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
15150 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c  lan] = 0;.  nQPl
15160 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f  an = 0;.#endif /
15170 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f  * SQLITE_TEST //
15180 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   Testing and deb
15190 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
151a0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
151b0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
151c0 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
151d0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
151e0 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  ure.  Then.  ** 
151f0 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  clean up and ret
15200 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  urn..  */.  pWIn
15210 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
15220 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61  cont;.  whereCla
15230 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20  useClear(&wc);. 
15240 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
15250 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
15260 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
15270 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  */.whereBeginNoM
15280 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73  em:.  whereClaus
15290 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 77  eClear(&wc);.  w
152a0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49  hereInfoFree(pWI
152b0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nfo);.  return 0
152c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
152d0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
152e0 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
152f0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
15300 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
15310 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
15320 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
15330 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
15340 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
15350 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
15360 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e    Vdbe *v = pWIn
15370 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62  fo->pParse->pVdb
15380 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
15390 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
153a0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
153b0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
153c0 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  pTabList;..  /* 
153d0 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
153e0 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
153f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61    */.  for(i=pTa
15400 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69  bList->nSrc-1; i
15410 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
15420 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
15430 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
15440 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15450 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f  el(v, pLevel->co
15460 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
15470 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
15480 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15490 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c  3VdbeAddOp(v, pL
154a0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
154b0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
154c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
154d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
154e0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
154f0 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  brk);.    if( pL
15500 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20  evel->nIn ){.   
15510 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20 20 20 20     int *a;.     
15520 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
15530 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c  r(j=pLevel->nIn,
15540 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c   a=&pLevel->aInL
15550 6f 6f 70 5b 6a 2a 32 2d 32 5d 3b 20 6a 3e 30 3b  oop[j*2-2]; j>0;
15560 20 6a 2d 2d 2c 20 61 2d 3d 32 29 7b 0a 20 20 20   j--, a-=2){.   
15570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15580 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
15590 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20  , a[0], a[1]);. 
155a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
155b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 5b  beJumpHere(v, a[
155c0 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1]-1);.      }. 
155d0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
155e0 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
155f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15600 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15610 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
15620 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
15630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15640 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
15650 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
15660 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  Join, 0);.      
15670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15680 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
15690 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
156a0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
156b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
156c0 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
156d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
156e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  ddOp(v, OP_NullR
156f0 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
15700 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
15710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15720 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
15730 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74  to, 0, pLevel->t
15740 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
15750 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15760 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
15770 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
15780 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
15790 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
157a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
157b0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
157c0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
157d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
157e0 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
157f0 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43  iBreak);..  /* C
15800 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
15810 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
15820 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
15830 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
15840 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
15850 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
15860 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
15870 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
15880 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
15890 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
158a0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
158b0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
158c0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
158d0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
158e0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
158f0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
15900 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68   if( pTab->isEph
15910 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  em || pTab->pSel
15920 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
15930 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
15940 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
15950 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
15960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15970 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
15980 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
15990 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rsor, 0);.    }.
159a0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
159b0 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
159c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159d0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  p(v, OP_Close, p
159e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
159f0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
15a00 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20 73 75  * Make cursor su
15a10 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f 72 20  bstitutions for 
15a20 63 61 73 65 73 20 77 68 65 72 65 20 77 65 20 77  cases where we w
15a30 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20 20 2a  ant to use.    *
15a40 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  * just the index
15a50 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66 65 72   and never refer
15a60 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  ence the table..
15a70 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
15a80 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
15a90 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
15aa0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
15ab0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
15ac0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
15ad0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
15ae0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
15af0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
15b00 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
15b10 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
15b20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
15b30 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
15b40 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
15b50 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
15b60 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
15b70 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
15b80 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
15b90 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
15ba0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
15bb0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
15bc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
15bd0 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 69  _ONLY ){.      i
15be0 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20  nt k, j, last;. 
15bf0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
15c00 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
15c10 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
15c20 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
15c30 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
15c40 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
15c50 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
15c60 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
15c70 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
15c80 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15c90 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
15ca0 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
15cb0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
15cc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15cd0 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
15ce0 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
15cf0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
15d00 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
15d10 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
15d20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
15d30 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
15d40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
15d50 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
15d60 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
15d70 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
15d80 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
15d90 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
15da0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
15db0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
15dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15de0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
15df0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
15e00 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
15e10 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
15e20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
15e30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
15e40 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
15e50 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
15e60 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
15e70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77  code==OP_NullRow
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
15e90 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
15ea0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
15eb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15ec0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
15ed0 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
15ee0 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
15ef0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.