/ Hex Artifact Content
Login

Artifact ac754c021f716e17337f45ffdc2436c6d5109fd3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 36 30   where.c,v 1.160
0340: 20 32 30 30 35 2f 30 38 2f 31 32 20 32 32 3a 35   2005/08/12 22:5
0350: 36 3a 30 39 20 64 72 68 20 45 78 70 20 24 0a 2a  6:09 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 75 31 36 20 69 64 78 3b 20  n */.  u16 idx; 
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c30: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
0c40: 74 65 72 6d 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  term in pWC->a[]
0c50: 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65 6e   */.  i16 iParen
0c60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
0c70: 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b   Disable pWC->a[
0c80: 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68  iParent] when th
0c90: 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64  is term disabled
0ca0: 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 75   */.  i16 leftCu
0cb0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rsor;         /*
0cc0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
0cd0: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
0ce0: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36 20  expr>" */.  i16 
0cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
0d00: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
0d10: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
0d20: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
0d30: 20 20 75 31 36 20 6f 70 65 72 61 74 6f 72 3b 20    u16 operator; 
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
0d50: 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72  O_xx value descr
0d60: 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20  ibing <op> */.  
0d70: 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  u8 flags;       
0d80: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20 66          /* Bit f
0d90: 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  lags.  See below
0da0: 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b   */.  u8 nChild;
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0dc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
0dd0: 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64 69  ren that must di
0de0: 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68  sable us */.  Wh
0df0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
0e00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 61        /* The cla
0e10: 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69 73  use this term is
0e20: 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69   part of */.  Bi
0e30: 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67 68  tmask prereqRigh
0e40: 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  t;    /* Bitmask
0e50: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
0e60: 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 42  by pRight */.  B
0e70: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
0e80: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
0e90: 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65  k of tables refe
0ea0: 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a 7d  renced by p */.}
0eb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
0ec0: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
0ed0: 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64  Term.flags.*/.#d
0ee0: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
0ef0: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
0f00: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
0f10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0f20: 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65  Expr) */.#define
0f30: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20   TERM_VIRTUAL   
0f40: 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64   0x02   /* Added
0f50: 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
0f60: 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20  r.  Do not code 
0f70: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0f80: 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34 20  CODED      0x04 
0f90: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69    /* This term i
0fa0: 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20  s already coded 
0fb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0fc0: 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38 20  COPIED     0x08 
0fd0: 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64    /* Has a child
0fe0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0ff0: 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31 30  _OR_OK      0x10
1000: 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e     /* Used durin
1010: 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63  g OR-clause proc
1020: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
1030: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1040: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1050: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c  ructure holds al
1060: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
1070: 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63  out a.** WHERE c
1080: 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74  lause.  Mostly t
1090: 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e  his is a contain
10a0: 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  er for one or mo
10b0: 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  re WhereTerms..*
10c0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c  /.struct WhereCl
10d0: 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a  ause {.  Parse *
10e0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
10f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1100: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1110: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1130: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
1140: 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
1150: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1160: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1170: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
1180: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  m *a;           
1190: 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73   /* Each a[] des
11a0: 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66  cribes a term of
11b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73   the WHERE cluas
11c0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
11d0: 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20 20   aStatic[10];   
11e0: 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69  /* Initial stati
11f0: 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20  c space for a[] 
1200: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1210: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1220: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1230: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
1240: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
1250: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
1260: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
1270: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
1280: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
1290: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
12a0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
12b0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
12c0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
12d0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
12e0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
12f0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
1300: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
1310: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
1320: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
1330: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
1340: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
1350: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
1360: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
1370: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
1380: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
1390: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
13a0: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
13b0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
13c0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
13d0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
13e0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
13f0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
1400: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
1410: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
1420: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
1430: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
1440: 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74  * If ExprMaskSet
1450: 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61  .ix[A]==B it mea
1460: 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68  ns that The A-th
1470: 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73   bit of a Bitmas
1480: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  k.** corresponds
1490: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
14a0: 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68  ber B.  The A-th
14b0: 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73   bit of a bitmas
14c0: 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a  k is 1<<A..**.**
14d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
14e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  e expression use
1500: 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20  d these VDBE.** 
1510: 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20  cursors:  4, 5, 
1520: 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20  8, 29, 57, 73.  
1530: 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61  Then the  ExprMa
1540: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a  skSet structure.
1550: 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f  ** would map tho
1560: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1570: 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68  s into bits 0 th
1580: 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e  rough 5..**.** N
1590: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70  ote that the map
15a0: 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ping is not nece
15b0: 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e  ssarily ordered.
15c0: 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65    In the example
15d0: 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d  .** above, the m
15e0: 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20  apping might go 
15f0: 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33  like this:  4->3
1600: 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39  , 5->1, 8->2, 29
1610: 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37  ->0,.** 57->5, 7
1620: 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66  3->4.  Or one of
1630: 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69   719 other combi
1640: 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65  nations might be
1650: 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65   used. It.** doe
1660: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74  s not really mat
1670: 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d  ter.  What is im
1680: 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20  portant is that 
1690: 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a  sparse cursor.**
16a0: 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74   numbers all get
16b0: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74   mapped into bit
16c0: 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65   numbers that be
16d0: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63  gin with 0 and c
16e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70  ontain.** no gap
16f0: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1700: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1710: 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73 74   ExprMaskSet;.st
1720: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1730: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1760: 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20  assigned cursor 
1770: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1780: 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  ix[sizeof(Bitmas
1790: 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75 72  k)*8];    /* Cur
17a0: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
17b0: 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a  each bit */.};..
17c0: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
17d0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
17e0: 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 61  s that indices a
17f0: 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f  re able to explo
1800: 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64  it.  An.** OR-ed
1810: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1820: 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  these values can
1830: 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73 65   be used when se
1840: 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74  arching for.** t
1850: 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72  erms in the wher
1860: 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65  e clause..*/.#de
1870: 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 31  fine WO_IN     1
1880: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
1890: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f     2.#define WO_
18a0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
18b0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
18c0: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
18d0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
18e0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
18f0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
1900: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
1910: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
1920: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
1930: 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a 20  -TK_EQ))../*.** 
1940: 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20  Value for flags 
1950: 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73 74  returned by best
1960: 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66 69  Index().*/.#defi
1970: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  ne WHERE_ROWID_E
1980: 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20 20  Q       0x0001  
1990: 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f   /* rowid=EXPR o
19a0: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
19b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
19c0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 20  E_ROWID_RANGE   
19d0: 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f 77   0x0002   /* row
19e0: 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72  id<EXPR and/or r
19f0: 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65  owid>EXPR */.#de
1a00: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1a10: 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31 30  N_EQ      0x0010
1a20: 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20     /* x=EXPR or 
1a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
1a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
1a50: 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30 32  MN_RANGE   0x002
1a60: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e  0   /* x<EXPR an
1a70: 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23  d/or x>EXPR */.#
1a80: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1a90: 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30 30  UMN_IN      0x00
1aa0: 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e  40   /* x IN (..
1ab0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1ac0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20  ERE_TOP_LIMIT   
1ad0: 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20 78     0x0100   /* x
1ae0: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
1af0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
1b00: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
1b10: 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30 32  _LIMIT      0x02
1b20: 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f  00   /* x>EXPR o
1b30: 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x>=EXPR constr
1b40: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
1b50: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
1b60: 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f 2a       0x0800   /*
1b70: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
1b80: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
1b90: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
1ba0: 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78 31  DERBY        0x1
1bb0: 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  000   /* Output 
1bc0: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
1bd0: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
1be0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
1bf0: 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78 32  VERSE        0x2
1c00: 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e  000   /* Scan in
1c10: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1c20: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1c30: 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20 30  UNIQUE         0
1c40: 78 34 30 30 30 20 20 20 2f 2a 20 53 65 6c 65 63  x4000   /* Selec
1c50: 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  ts no more than 
1c60: 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a 2a  one row */../*.*
1c70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70  * Initialize a p
1c80: 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  reallocated Wher
1c90: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1ca0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1cb0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  d whereClauseIni
1cc0: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
1cd0: 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72 73  WC, Parse *pPars
1ce0: 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73  e){.  pWC->pPars
1cf0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
1d00: 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  C->nTerm = 0;.  
1d10: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52 52  pWC->nSlot = ARR
1d20: 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74 61  AYSIZE(pWC->aSta
1d30: 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d  tic);.  pWC->a =
1d40: 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d   pWC->aStatic;.}
1d50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
1d60: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
1d70: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
1d80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1d90: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
1da0: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
1db0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1dc0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
1dd0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
1de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1df0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
1e00: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
1e10: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
1e20: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
1e30: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
1e40: 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e  -1, a=pWC->a; i>
1e50: 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20  =0; i--, a++){. 
1e60: 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20     if( a->flags 
1e70: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
1e80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1e90: 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78  xprDelete(a->pEx
1ea0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
1eb0: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
1ec0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
1ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 43 2d   sqliteFree(pWC-
1ee0: 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >a);.  }.}../*.*
1ef0: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72  * Add a new entr
1f00: 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72 65  ies to the Where
1f10: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1f20: 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  .  Increase the 
1f30: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61  allocated.** spa
1f40: 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ce as necessary.
1f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
1f60: 54 65 72 6d 20 2a 77 68 65 72 65 43 6c 61 75 73  Term *whereClaus
1f70: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
1f80: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
1f90: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
1fa0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1fb0: 6d 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  m;.  if( pWC->nT
1fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
1fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
1fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
1ff0: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
2000: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2010: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
2020: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
2030: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
2040: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2050: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
2060: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
2070: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
2080: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
2090: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
20a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
20b0: 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  ee(pOld);.    }.
20c0: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 2a      pWC->nSlot *
20d0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 2;.  }.  pTerm
20e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
20f0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 54 65 72 6d 2d  nTerm];.  pTerm-
2100: 3e 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  >idx = pWC->nTer
2110: 6d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  m;.  pWC->nTerm+
2120: 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  +;.  pTerm->pExp
2130: 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e  r = p;.  pTerm->
2140: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
2150: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
2160: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
2170: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
2180: 72 6e 20 70 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn pTerm;.}../*.
2190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21a0: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
21b0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
21c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
21d0: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
21e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
21f0: 61 72 61 74 65 20 62 79 20 74 68 65 20 41 4e 44  arate by the AND
2200: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
2210: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
2220: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
2230: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
2240: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
2250: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2260: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
2270: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
2280: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
2290: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
22a0: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
22b0: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
22c0: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
22d0: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
22e0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
22f0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
2300: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
2310: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
2320: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
2330: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
2340: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
2360: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
2370: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
2380: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
2390: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
23a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
23b0: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
23c0: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
23d0: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
23e0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
23f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
2400: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
2410: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
2420: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
2430: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
2440: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
2450: 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72 61  rray.  This arra
2460: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
2470: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
2480: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
24a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24b0: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
24c0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
24d0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
24e0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2500: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
2510: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2520: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
2530: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2540: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2550: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
2560: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
2570: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2580: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
2590: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
25a0: 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73  ialize an expres
25b0: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f  sion mask set.*/
25c0: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
25d0: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
25e0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
25f0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
2600: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2610: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
2620: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
2630: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
2640: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
2650: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
2660: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78  tmask getMask(Ex
2670: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
2680: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2690: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
26a0: 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65  r(i=0; i<pMaskSe
26b0: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
26c0: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  if( pMaskSet->ix
26d0: 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  [i]==iCursor ){.
26e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42        return ((B
26f0: 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  itmask)1)<<i;.  
2700: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2710: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2720: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
2730: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
2740: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
2750: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
2760: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
2770: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
2780: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
2790: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27a0: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
27b0: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
27c0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
27d0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
27e0: 72 6f 75 74 69 65 6e 2e 20 20 53 6f 20 77 65 20  routien.  So we 
27f0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
2800: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
2810: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
2820: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
2830: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
2840: 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74  Mask(ExprMaskSet
2850: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2860: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
2870: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
2880: 3c 20 41 52 52 41 59 53 49 5a 45 28 70 4d 61 73  < ARRAYSIZE(pMas
2890: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
28a0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
28b0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
28c0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
28d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
28e0: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
28f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2900: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
2910: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
2920: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
2930: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
2940: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
2950: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
2960: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
2970: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
2980: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
2990: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
29a0: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
29b0: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
29c0: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
29d0: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
29e0: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
29f0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2a00: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
2a10: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2a20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
2a30: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52  The sqlite3ExprR
2a40: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f  esolveNames() ro
2a50: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
2a60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
2a70: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
2a80: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
2a90: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
2aa0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
2ab0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
2ac0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
2ad0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
2ae0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
2af0: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
2b00: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
2b10: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
2b20: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
2b30: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
2b40: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
2b50: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2b60: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2b70: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
2b80: 20 2a 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b   *, ExprList *);
2b90: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2ba0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 45  exprTableUsage(E
2bb0: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2bc0: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
2bd0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
2be0: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
2bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2c00: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
2c10: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
2c20: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2c30: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
2c40: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
2c50: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
2c60: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2c70: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
2c80: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
2c90: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2ca0: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
2cb0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2cc0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2cd0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b  kSet, p->pList);
2ce0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63  .  if( p->pSelec
2cf0: 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
2d00: 2a 70 53 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74  *pS = p->pSelect
2d10: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
2d20: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2d30: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2d40: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
2d50: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2d60: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2d70: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
2d80: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2d90: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
2da0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
2db0: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
2dc0: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
2dd0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2de0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
2df0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2e00: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2e10: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d  S->pHaving);.  }
2e20: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2e30: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2e40: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2e50: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2e60: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
2e70: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
2e80: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
2e90: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
2ea0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2eb0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
2ec0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2ed0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2ee0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2ef0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
2f00: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2f10: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2f30: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
2f40: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
2f50: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
2f60: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
2f70: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
2f80: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
2f90: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
2fa0: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
2fb0: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
2fc0: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
2fd0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
2fe0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
2ff0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
3000: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
3010: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
3020: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3030: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
3040: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
3050: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
3060: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
3070: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3080: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
3090: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
30a0: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
30b0: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
30c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
30d0: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
30e0: 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ype T..*/.#defin
30f0: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
3100: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
3110: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
3120: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
3130: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45  ion operator.  E
3140: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
3150: 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a  e form "X op Y".
3160: 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ** are converted
3170: 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a   into "Y op X"..
3180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
3190: 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20  xprCommute(Expr 
31a0: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
31b0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
31c0: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
31d0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
31e0: 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70   SWAP(CollSeq*,p
31f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
3200: 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  oll,pExpr->pLeft
3210: 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50  ->pColl);.  SWAP
3220: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3230: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3240: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3250: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3260: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3270: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3280: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3290: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
32a0: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
32b0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
32c0: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
32e0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
32f0: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
3300: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
3310: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
3320: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3330: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3340: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3350: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3360: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3370: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72  .static int oper
3380: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3390: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73  {.  int c;.  ass
33a0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
33b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
33c0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
33d0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b   WO_IN;.  }else{
33e0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c  .    c = WO_EQ<<
33f0: 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a  (op-TK_EQ);.  }.
3400: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3410: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
3420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3430: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
3440: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
3450: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
3460: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
3470: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
3480: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
3490: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
34a0: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
34b0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34c0: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
34d0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
34e0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
34f0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
3500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
3510: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
3520: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3530: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
3540: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
3550: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
3560: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
3570: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
3580: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
3590: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
35a0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
35b0: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
35c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35d0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
35e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
35f0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
3600: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
3610: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3620: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
3630: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
3640: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
3650: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
3660: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3670: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3680: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
3690: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
36a0: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
36b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
36c0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
36d0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
36e0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
36f0: 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20   */.  u16 op,   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3710: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
3720: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
3730: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
3740: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
3750: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
3760: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
3770: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
3780: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
3790: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
37a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70    int k;.  for(p
37b0: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
37c0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
37d0: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
37e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
37f0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
3800: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
3810: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3820: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
3830: 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43   && pTerm->leftC
3840: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
3850: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
3860: 3e 6f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  >operator & op)!
3870: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
3880: 69 66 28 20 69 43 75 72 3e 3d 30 20 26 26 20 70  if( iCur>=0 && p
3890: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 45  Idx ){.        E
38a0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
38b0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
38c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
38d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
38e0: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
38f0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   k;.        Pars
3900: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3910: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
3920: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
3930: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
3940: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
3950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
3960: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
3970: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
3980: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3990: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
39a0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
39b0: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
39c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
39d0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
39e0: 20 20 20 20 69 66 28 20 70 58 2d 3e 70 52 69 67      if( pX->pRig
39f0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ht ){.          
3a00: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3a10: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
3a20: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
3a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3a40: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
3a50: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3a60: 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
3a70: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
3a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3aa0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
3ab0: 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d  nColumn && pIdx-
3ac0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 69 43  >aiColumn[k]!=iC
3ad0: 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  olumn; k++){}.  
3ae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
3af0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
3b10: 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66  ll!=pIdx->keyInf
3b20: 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 63 6f 6e  o.aColl[k] ) con
3b30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3b40: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
3b50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
3b60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
3b70: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3b80: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3b90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
3ba0: 69 73 74 2a 2c 20 45 78 70 72 4d 61 73 6b 53 65  ist*, ExprMaskSe
3bb0: 74 2a 2c 20 57 68 65 72 65 54 65 72 6d 2a 29 3b  t*, WhereTerm*);
3bc0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
3bd0: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
3be0: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
3bf0: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
3c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3c10: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
3c20: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3c30: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
3c40: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3c50: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
3c60: 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 74  pMaskSet,   /* t
3c70: 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  able masks */.  
3c80: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
3ca0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
3cb0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
3cc0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3cd0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Term;.  int i;. 
3ce0: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
3cf0: 6d 2d 31 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m-1, pTerm=pWC->
3d00: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 54  a; i>=0; i--, pT
3d10: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 65 78 70 72  erm++){.    expr
3d20: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
3d30: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 54 65 72  , pMaskSet, pTer
3d40: 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  m);.  }.}..#ifnd
3d50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
3d60: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
3d70: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
3d80: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
3d90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
3da0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
3db0: 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63  erator that.** c
3dc0: 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  an be optimized 
3dd0: 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79  using inequality
3de0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52   constraints.  R
3df0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
3e00: 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61   is.** so and fa
3e10: 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
3e20: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
3e30: 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  he operator to b
3e40: 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74  e optimizible, t
3e50: 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61  he RHS must be a
3e60: 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72   string.** liter
3e70: 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  al that does not
3e80: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69   begin with a wi
3e90: 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61  ldcard.  .*/.sta
3ea0: 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72  tic int isLikeOr
3eb0: 47 6c 6f 62 28 0a 20 20 45 78 70 72 20 2a 70 45  Glob(.  Expr *pE
3ec0: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
3ed0: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
3ee0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61  n */.  int *pnPa
3ef0: 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62  ttern,   /* Numb
3f00: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
3f10: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
3f20: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ters */.  int *p
3f30: 69 73 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54  isComplete  /* T
3f40: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
3f50: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
3f60: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
3f70: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ter */.){.  cons
3f80: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70  t char *z;.  Exp
3f90: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
3fa0: 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b  t;.  int c, cnt;
3fb0: 0a 20 20 63 68 61 72 20 77 63 31 2c 20 77 63 32  .  char wc1, wc2
3fc0: 2c 20 77 63 33 3b 0a 20 20 69 66 28 20 70 45 78  , wc3;.  if( pEx
3fd0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
3fe0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
3ff0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
4000: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
4010: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
4020: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
4030: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
4040: 3d 34 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =4 ){.    return
4050: 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 70 45   0;.  }.  z = pE
4060: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
4070: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
4080: 43 6d 70 28 7a 2c 20 22 67 6c 6f 62 22 2c 20 34  Cmp(z, "glob", 4
4090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 63 31 20  )==0 ){.    wc1 
40a0: 3d 20 27 2a 27 3b 0a 20 20 20 20 77 63 32 20 3d  = '*';.    wc2 =
40b0: 20 27 3f 27 3b 0a 20 20 20 20 77 63 33 20 3d 20   '?';.    wc3 = 
40c0: 27 5b 27 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  '[';.  }.#ifdef 
40d0: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
40e0: 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 65 6c 73  ITIVE_LIKE.  els
40f0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
4100: 4e 49 43 6d 70 28 7a 2c 20 22 6c 69 6b 65 22 2c  NICmp(z, "like",
4110: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 63   4)==0 ){.    wc
4120: 31 20 3d 20 27 25 27 3b 0a 20 20 20 20 77 63 32  1 = '%';.    wc2
4130: 20 3d 20 27 5f 27 3b 0a 20 20 20 20 77 63 33 20   = '_';.    wc3 
4140: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 23 65 6e 64 69  = '_';.  }.#endi
4150: 66 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65  f.  else{.    re
4160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 52  turn 0;.  }.  pR
4170: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
4180: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
4190: 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f  .  if( pRight->o
41a0: 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
41b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
41c0: 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  }.  pLeft = pExp
41d0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
41e0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
41f0: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
4200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4210: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4220: 65 71 75 6f 74 65 45 78 70 72 28 70 52 69 67 68  equoteExpr(pRigh
4230: 74 29 3b 0a 20 20 7a 20 3d 20 70 52 69 67 68 74  t);.  z = pRight
4240: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f 72  ->token.z;.  for
4250: 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e 74  (cnt=0; (c=z[cnt
4260: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 31 20  ])!=0 && c!=wc1 
4270: 26 26 20 63 21 3d 77 63 32 20 26 26 20 63 21 3d  && c!=wc2 && c!=
4280: 77 63 33 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20  wc3; cnt++){}.  
4290: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
42a0: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b  5==(u8)z[cnt] ){
42b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42c0: 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74   }.  *pisComplet
42d0: 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 31 20  e = z[cnt]==wc1 
42e0: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
42f0: 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63    *pnPattern = c
4300: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  nt;.  return 1;.
4310: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4320: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
4330: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
4340: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
4350: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4360: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
4370: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
4380: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
4390: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
43a0: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
43b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
43c0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
43d0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
43e0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
43f0: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
4400: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
4410: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
4420: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
4430: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
4440: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
4450: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
4460: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
4470: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
4480: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
4490: 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  ".  If the expre
44a0: 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74  ssion is of.** t
44b0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
44c0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
44d0: 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e  and Y are column
44e0: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
44f0: 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69  inal.** expressi
4500: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
4510: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
4520: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  l expression of 
4530: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4540: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
4550: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
4560: 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  use.  .*/.static
4570: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
4580: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
4590: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
45a0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
45b0: 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  e */.  ExprMaskS
45c0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20  et *pMaskSet,   
45d0: 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20   /* table masks 
45e0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
45f0: 70 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 2f  pTerm          /
4600: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4610: 73 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  se term to be an
4620: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 45  alyzed */.){.  E
4630: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
4640: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42 69 74  rm->pExpr;.  Bit
4650: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
4660: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
4670: 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 69 64 78 52  qAll;.  int idxR
4680: 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 50 61 74  ight;.  int nPat
4690: 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f  tern;.  int isCo
46a0: 6d 70 6c 65 74 65 3b 0a 0a 20 20 70 72 65 72 65  mplete;..  prere
46b0: 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c  qLeft = exprTabl
46c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
46d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
46e0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
46f0: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
4700: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4710: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
4720: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
4730: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 20 3d  ll = prereqAll =
4740: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4750: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
4760: 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  ;.  pTerm->leftC
4770: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54  ursor = -1;.  pT
4780: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
4790: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 6f 70 65 72  1;.  pTerm->oper
47a0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 64 78 52  ator = 0;.  idxR
47b0: 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ight = -1;.  if(
47c0: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
47d0: 2d 3e 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  ->op) && (pTerm-
47e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
47f0: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
4800: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
4810: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
4820: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
4830: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
4840: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
4850: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4860: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
4870: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
4880: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
4890: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c    pTerm->leftCol
48a0: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
48b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72  lumn;.      pTer
48c0: 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20 6f 70  m->operator = op
48d0: 65 72 61 74 6f 72 4d 61 73 6b 28 70 45 78 70 72  eratorMask(pExpr
48e0: 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->op);.    }.   
48f0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
4900: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
4910: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
4920: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
4930: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
4940: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
4950: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
4960: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  ){.        pDup 
4970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4980: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
4990: 20 70 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61   pNew = whereCla
49a0: 75 73 65 49 6e 73 65 72 74 28 70 54 65 72 6d 2d  useInsert(pTerm-
49b0: 3e 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d  >pWC, pDup, TERM
49c0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
49d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
49e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
49f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e  turn;.        pN
4a00: 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 70 54  ew->iParent = pT
4a10: 65 72 6d 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20  erm->idx;.      
4a20: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
4a30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
4a40: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
4a50: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
4a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4a70: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
4a80: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
4a90: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
4aa0: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75   exprCommute(pDu
4ab0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
4ac0: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
4ad0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
4ae0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
4af0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
4b00: 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  w->leftColumn = 
4b10: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
4b20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
4b30: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
4b40: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
4b50: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
4b60: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
4b70: 4e 65 77 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20  New->operator = 
4b80: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
4b90: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
4ba0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4bb0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
4bc0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
4bd0: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
4be0: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
4bf0: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
4c00: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
4c10: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
4c20: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
4c30: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
4c40: 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  lements..  */.  
4c50: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
4c60: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
4c70: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
4c80: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
4c90: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
4ca0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
4cb0: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
4cc0: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
4cd0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
4ce0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4cf0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
4d00: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
4d10: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
4d20: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
4d30: 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
4d40: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
4d50: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
4d60: 6c 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69 5d  lite3Expr(ops[i]
4d70: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
4d80: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a  (pExpr->pLeft),.
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4db0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 69 73  ite3ExprDup(pLis
4dc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20  t->a[i].pExpr), 
4dd0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  0);.      pNewTe
4de0: 72 6d 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  rm = whereClause
4df0: 49 6e 73 65 72 74 28 70 54 65 72 6d 2d 3e 70 57  Insert(pTerm->pW
4e00: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
4e40: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
4e50: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
4e60: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 4e  rc, pMaskSet, pN
4e70: 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70  ewTerm);.      p
4e80: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
4e90: 20 3d 20 70 54 65 72 6d 2d 3e 69 64 78 3b 0a 20   = pTerm->idx;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
4eb0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
4ec0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4ed0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
4ee0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
4ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4f00: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
4f10: 4f 4e 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ON.  /* Attempt 
4f20: 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f  to convert OR-co
4f30: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e  nnected terms in
4f40: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
4f50: 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74  r so that.  ** t
4f60: 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65  hey can make use
4f70: 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a   of indices..  *
4f80: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
4f90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
4fa0: 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20  .    int ok;.   
4fb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69   int i, j;.    i
4fc0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72  nt iColumn, iCur
4fd0: 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c  sor;.    WhereCl
4fe0: 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68  ause sOr;.    Wh
4ff0: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
5000: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
5010: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
5020: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20  ERM_DYNAMIC)==0 
5030: 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  );.    whereClau
5040: 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 54 65  seInit(&sOr, pTe
5050: 72 6d 2d 3e 70 57 43 2d 3e 70 50 61 72 73 65 29  rm->pWC->pParse)
5060: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
5070: 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b  (&sOr, pExpr, TK
5080: 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  _OR);.    exprAn
5090: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
50a0: 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a  MaskSet, &sOr);.
50b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e      assert( sOr.
50c0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a  nTerm>0 );.    j
50d0: 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 0;.    do{.  
50e0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f      iColumn = sO
50f0: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d  r.a[j].leftColum
5100: 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72  n;.      iCursor
5110: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
5120: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b  Cursor;.      ok
5130: 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20   = iCursor>=0;. 
5140: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
5150: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
5160: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
5170: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
5180: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5190: 70 4f 72 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f  pOrTerm->operato
51a0: 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20  r!=WO_EQ ){.    
51b0: 20 20 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f        goto or_no
51c0: 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20  t_possible;.    
51d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
51e0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
51f0: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 26  ursor==iCursor &
5200: 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  & pOrTerm->leftC
5210: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
5220: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
5230: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
5240: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
5250: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 72    }else if( (pOr
5260: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
5270: 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c 7c  RM_COPIED)!=0 ||
5280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5290: 20 20 20 20 20 28 28 70 4f 72 54 65 72 6d 2d 3e       ((pOrTerm->
52a0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  flags & TERM_VIR
52b0: 54 55 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  TUAL)!=0 &&.    
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d 2d   (sOr.a[pOrTerm-
52e0: 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20  >iParent].flags 
52f0: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30  & TERM_OR_OK)!=0
5300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
5310: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d  OrTerm->flags &=
5320: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
5330: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5340: 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20         ok = 0;. 
5350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5360: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b  .    }while( !ok
5370: 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e   && (sOr.a[j++].
5380: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  flags & TERM_COP
5390: 49 45 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f 72  IED)!=0 && j<sOr
53a0: 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66  .nTerm );.    if
53b0: 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78  ( ok ){.      Ex
53c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
53d0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
53e0: 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  New, *pDup;.    
53f0: 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72    for(i=sOr.nTer
5400: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72  m-1, pOrTerm=sOr
5410: 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20  .a; i>=0 && ok; 
5420: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
5430: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
5440: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5450: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
5460: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5470: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
5480: 45 78 70 72 44 75 70 28 70 4f 72 54 65 72 6d 2d  ExprDup(pOrTerm-
5490: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
54a0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
54b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
54c0: 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 70 44  Append(pList, pD
54d0: 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  up, 0);.      }.
54e0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
54f0: 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55  ite3Expr(TK_COLU
5500: 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  MN, 0, 0, 0);.  
5510: 20 20 20 20 69 66 28 20 70 44 75 70 20 29 7b 0a      if( pDup ){.
5520: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69 54          pDup->iT
5530: 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
5540: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69 43          pDup->iC
5550: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b  olumn = iColumn;
5560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5570: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
5580: 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  r(TK_IN, pDup, 0
5590: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
55a0: 70 4e 65 77 20 29 20 70 4e 65 77 2d 3e 70 4c 69  pNew ) pNew->pLi
55b0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
55c0: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
55d0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 54 65   pNew;.      pTe
55e0: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
55f0: 4d 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20  M_DYNAMIC;.     
5600: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5610: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 54 65  c, pMaskSet, pTe
5620: 72 6d 29 3b 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f  rm);.    }.or_no
5630: 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20  t_possible:.    
5640: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
5650: 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  (&sOr);.  }.#end
5660: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5670: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
5680: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
5690: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
56a0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
56b0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
56c0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
56d0: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
56e0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
56f0: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
5700: 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72  /.  if( isLikeOr
5710: 47 6c 6f 62 28 70 45 78 70 72 2c 20 26 6e 50 61  Glob(pExpr, &nPa
5720: 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65  ttern, &isComple
5730: 74 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  te) ){.    Expr 
5740: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
5750: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31  .    Expr *pStr1
5760: 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78  , *pStr2;.    Ex
5770: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a  pr *pNewExpr1, *
5780: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 57  pNewExpr2;.    W
5790: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
57a0: 72 6d 31 2c 20 2a 70 4e 65 77 54 65 72 6d 32 3b  rm1, *pNewTerm2;
57b0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
57c0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
57d0: 70 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68  pExpr;.    pRigh
57e0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
57f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
5800: 20 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65    pStr1 = sqlite
5810: 33 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c  3Expr(TK_STRING,
5820: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
5830: 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20  f( pStr1 ){.    
5840: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
5850: 70 79 28 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e  py(&pStr1->token
5860: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
5870: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e  );.      pStr1->
5880: 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65  token.n = nPatte
5890: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rn;.    }.    pS
58a0: 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
58b0: 72 44 75 70 28 70 53 74 72 31 29 3b 0a 20 20 20  rDup(pStr1);.   
58c0: 20 69 66 28 20 70 53 74 72 32 20 29 7b 0a 20 20   if( pStr2 ){.  
58d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
58e0: 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a  2->token.dyn );.
58f0: 20 20 20 20 20 20 2b 2b 2a 28 75 38 2a 29 26 70        ++*(u8*)&p
5900: 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50  Str2->token.z[nP
5910: 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d  attern-1];.    }
5920: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
5930: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
5940: 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  GE, sqlite3ExprD
5950: 75 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72 31  up(pLeft), pStr1
5960: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 54 65  , 0);.    pNewTe
5970: 72 6d 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  rm1 = whereClaus
5980: 65 49 6e 73 65 72 74 28 70 54 65 72 6d 2d 3e 70  eInsert(pTerm->p
5990: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 0a 20  WC, pNewExpr1,. 
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
59d0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
59e0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
59f0: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 4e 65  c, pMaskSet, pNe
5a00: 77 54 65 72 6d 31 29 3b 0a 20 20 20 20 70 4e 65  wTerm1);.    pNe
5a10: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
5a20: 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c 69  Expr(TK_LT, sqli
5a30: 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66 74  te3ExprDup(pLeft
5a40: 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20  ), pStr2, 0);.  
5a50: 20 20 70 4e 65 77 54 65 72 6d 32 20 3d 20 77 68    pNewTerm2 = wh
5a60: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5a70: 70 54 65 72 6d 2d 3e 70 57 43 2c 20 70 4e 65 77  pTerm->pWC, pNew
5a80: 45 78 70 72 32 2c 0a 20 20 20 20 20 20 20 20 20  Expr2,.         
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
5ab0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
5ac0: 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  C);.    exprAnal
5ad0: 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53  yze(pSrc, pMaskS
5ae0: 65 74 2c 20 70 4e 65 77 54 65 72 6d 32 29 3b 0a  et, pNewTerm2);.
5af0: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
5b00: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  te ){.      pNew
5b10: 54 65 72 6d 32 2d 3e 69 50 61 72 65 6e 74 20 3d  Term2->iParent =
5b20: 20 70 54 65 72 6d 2d 3e 69 64 78 3b 0a 20 20 20   pTerm->idx;.   
5b30: 20 20 20 70 4e 65 77 54 65 72 6d 31 2d 3e 69 50     pNewTerm1->iP
5b40: 61 72 65 6e 74 20 3d 20 70 54 65 72 6d 2d 3e 69  arent = pTerm->i
5b50: 64 78 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  dx;.      pTerm-
5b60: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
5b70: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
5b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5b90: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
5ba0: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
5bb0: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
5bc0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
5bd0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
5be0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
5bf0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
5c00: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
5c10: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
5c20: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
5c30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
5c40: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
5c50: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
5c60: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
5c70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
5c80: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
5c90: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
5ca0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
5cb0: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
5cc0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
5cd0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
5ce0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
5cf0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
5d00: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
5d10: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
5d20: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
5d30: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
5d40: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5d50: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
5d60: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
5d70: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
5d80: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
5d90: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
5da0: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
5db0: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
5dc0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
5dd0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
5de0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
5df0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
5e00: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 2c  index is UNIQUE,
5e10: 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
5e20: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
5e30: 6f 77 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20  owed to have.** 
5e40: 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 73  additional terms
5e50: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
5e60: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
5e70: 68 65 20 6d 61 74 63 68 20 77 69 6c 6c 20 73 74  he match will st
5e80: 69 6c 6c 0a 2a 2a 20 62 65 20 61 20 73 75 63 63  ill.** be a succ
5e90: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
5ea0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
5eb0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
5ec0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
5ed0: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
5ee0: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
5ef0: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
5f00: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
5f10: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
5f20: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
5f30: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
5f40: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
5f50: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
5f60: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
5f70: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
5f80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
5f90: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
5fa0: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
5fb0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
5fc0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
5fd0: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
5fe0: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
5ff0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
6000: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6010: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6020: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
6030: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
6040: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
6050: 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
6060: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
6070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6080: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
6090: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ed */.  int base
60a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
60b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
60c0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 45   for pTab */.  E
60d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
60e0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
60f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
6100: 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20  .  int nEqCol,  
6110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6120: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f  mber of index co
6130: 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f  lumns with == co
6140: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
6150: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
6160: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
6170: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
6180: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69  s DESC */.){.  i
6190: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
61b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
61c0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 3b    int sortOrder;
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61e0: 2a 20 57 68 69 63 68 20 64 69 72 65 63 74 69 6f  * Which directio
61f0: 6e 20 77 65 20 61 72 65 20 73 6f 72 74 69 6e 67  n we are sorting
6200: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6230: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
6240: 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
6250: 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b  ist_item *pTerm;
6260: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
6270: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6280: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
6290: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
62a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
62b0: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
62c0: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
62d0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
62e0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
62f0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
6300: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6310: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
6320: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
6330: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
6340: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
6350: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
6360: 65 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  erm && i<pIdx->n
6370: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6380: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
6390: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
63a0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
63b0: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
63c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
63d0: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
63e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
63f0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 0a 20 20   of pExpr */..  
6400: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
6410: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
6420: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
6430: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
6440: 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
6450: 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20       /* Can not 
6460: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72  use an index sor
6470: 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  t on anything th
6480: 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  at is not a colu
6490: 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  mn in the.      
64a0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
64b0: 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  le of the FROM c
64c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 72  lause */.      r
64d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
64e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
64f0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6500: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6510: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
6520: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
6530: 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  Coll;.    if( pE
6540: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49  xpr->iColumn!=pI
6550: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  dx->aiColumn[i] 
6560: 7c 7c 20 70 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e  || pColl!=pIdx->
6570: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
6580: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72   ){.      /* Ter
6590: 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52  m j of the ORDER
65a0: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
65b0: 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e  not match column
65c0: 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20   i of the index 
65d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  */.      if( i<n
65e0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  EqCol ){.       
65f0: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
6600: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63  column that is c
6610: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
6620: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
6630: 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  an.        ** OR
6640: 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61  DER BY term, tha
6650: 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69  t is OK.  Just i
6660: 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  gnore that colum
6670: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  n of the index. 
6680: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6690: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
66a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
66b0: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
66c0: 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
66d0: 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
66e0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
66f0: 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
6700: 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
6710: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
6720: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
6730: 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
6740: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
6750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6760: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
6770: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
6780: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 21 3d  erm->sortOrder!=
6790: 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
67a0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20       /* Indices 
67b0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
67c0: 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   if all ORDER BY
67d0: 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a   terms past the.
67e0: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c          ** equal
67f0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
6800: 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44  are all either D
6810: 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20  ESC or ASC. */. 
6820: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
6830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6840: 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72  se{.      sortOr
6850: 64 65 72 20 3d 20 70 54 65 72 6d 2d 3e 73 6f 72  der = pTerm->sor
6860: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
6870: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
6880: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ++;.  }..  /* Th
6890: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
68a0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  sed for sorting 
68b0: 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  if all terms of 
68c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
68d0: 75 73 65 0a 20 20 2a 2a 20 6f 72 20 63 6f 76 65  use.  ** or cove
68e0: 72 65 64 20 6f 72 20 69 66 20 77 65 20 72 61 6e  red or if we ran
68f0: 20 6f 75 74 20 6f 66 20 69 6e 64 65 78 20 63 6f   out of index co
6900: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 69 74  lumns and the it
6910: 20 69 73 20 61 20 55 4e 49 51 55 45 0a 20 20 2a   is a UNIQUE.  *
6920: 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  * index..  */.  
6930: 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 7c 7c 20  if( j>=nTerm || 
6940: 28 69 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (i>=pIdx->nColum
6950: 6e 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  n && pIdx->onErr
6960: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 20 29 7b 0a  or!=OE_None) ){.
6970: 20 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72      *pbRev = sor
6980: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
6990: 4f 5f 44 45 53 43 3b 0a 20 20 20 20 72 65 74 75  O_DESC;.    retu
69a0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
69b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
69c0: 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65  heck table to se
69d0: 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  e if the ORDER B
69e0: 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64  Y clause in pOrd
69f0: 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69  erBy can be sati
6a00: 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74  sfied.** by sort
6a10: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ing in order of 
6a20: 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74  ROWID.  Return t
6a30: 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65  rue if so and se
6a40: 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a  t *pbRev to be.*
6a50: 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72  * true for rever
6a60: 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c  se ROWID and fal
6a70: 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52  se for forward R
6a80: 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  OWID order..*/.s
6a90: 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62  tatic int sortab
6aa0: 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74  leByRowid(.  int
6ab0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
6ac0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
6ad0: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
6ae0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
6af0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
6b00: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
6b10: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b40: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
6b50: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
6b60: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a  .){.  Expr *p;..
6b70: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
6b80: 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
6b90: 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
6ba0: 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f  pr>0 );.  p = pO
6bb0: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
6bc0: 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  pr;.  if( p->op=
6bd0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
6be0: 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 20 26 26  >iTable==base &&
6bf0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20   p->iColumn==-1 
6c00: 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20  ){.    *pbRev = 
6c10: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
6c20: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65  ortOrder;.    re
6c30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
6c40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6c50: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
6c60: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
6c70: 20 6c 6f 67 6f 72 69 74 68 6d 20 6f 66 20 74 68   logorithm of th
6c80: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
6c90: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
6ca0: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
6cb0: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
6cc0: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
6cd0: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
6ce0: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
6cf0: 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69  ng operatings wi
6d00: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
6d10: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
6d20: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
6d30: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
6d40: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
6d50: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
6d60: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
6d70: 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61  off..**.** We ca
6d80: 6e 20 61 73 73 75 6d 65 20 4e 3e 3d 31 2e 30 3b  n assume N>=1.0;
6d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
6da0: 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20  e estLog(double 
6db0: 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67  N){.  double log
6dc0: 4e 20 3d 20 31 2e 30 3b 0a 20 20 64 6f 75 62 6c  N = 1.0;.  doubl
6dd0: 65 20 78 20 3d 20 31 30 2e 30 3b 0a 20 20 77 68  e x = 10.0;.  wh
6de0: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
6df0: 6c 6f 67 4e 20 3d 20 6c 6f 67 4e 2b 31 2e 30 3b  logN = logN+1.0;
6e00: 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20  .    x *= 10;.  
6e10: 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b  }.  return logN;
6e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
6e30: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
6e40: 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
6e50: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
6e60: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6e70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65  r.** to the inde
6e80: 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65  x, flags that de
6e90: 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69  scribe how the i
6ea0: 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75  ndex should be u
6eb0: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  sed, the.** numb
6ec0: 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
6ed0: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20  onstraints, and 
6ee0: 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74  the "cost" for t
6ef0: 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  his index..**.**
6f00: 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
6f10: 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68   index wins.  Th
6f20: 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
6f30: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
6f40: 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
6f50: 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20  d disk I/O need 
6f60: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
6f70: 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65  equest using the
6f80: 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e   selected index.
6f90: 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74  .** Factors that
6fa0: 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20   influence cost 
6fb0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
6fc0: 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74    *  The estimat
6fd0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
6fe0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6ff0: 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a  etrieved.  (The.
7000: 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74  **       fewer t
7010: 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a  he better.).**.*
7020: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
7030: 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d  or not sorting m
7040: 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  ust occur..**.**
7050: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
7060: 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74  r not there must
7070: 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f   be separate loo
7080: 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  kups in the.**  
7090: 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69       index and i
70a0: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
70b0: 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64  ..**.*/.static d
70c0: 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28  ouble bestIndex(
70d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
70e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
70f0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
7100: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
7110: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
7120: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
7130: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
7140: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7150: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
7160: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
7170: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
7180: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
7190: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
71a0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
71b0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
71c0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
71d0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
71e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
71f0: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
7200: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70   */.  Index **pp
7210: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
7220: 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64    /* Make *ppInd
7230: 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ex point to the 
7240: 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  best index */.  
7250: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
7260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7270: 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62  ut flags describ
7280: 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20  ing this choice 
7290: 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20  in *pFlags */.  
72a0: 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20  int *pnEq       
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
72c0: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
72d0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
72e0: 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  aints here */.){
72f0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
7300: 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65  erm;.  Index *be
7310: 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  stIdx = 0;      
7320: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
7330: 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73   gives the lowes
7340: 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62  t cost */.  doub
7350: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  le lowestCost = 
7360: 31 2e 30 65 39 39 3b 20 2f 2a 20 54 68 65 20 63  1.0e99; /* The c
7370: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73  ost of using bes
7380: 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65  tIdx */.  int be
7390: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
73a0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
73b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62  ssociated with b
73c0: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
73d0: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
73f0: 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f  value for nEq */
7400: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
7410: 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
7420: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
7430: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
7440: 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
7450: 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
7460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
7470: 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
7480: 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  luating */.  int
7490: 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
74a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
74b0: 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
74c0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  rse order */.  i
74d0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
74e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
74f0: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
7500: 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ith pProbe */.  
7510: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
7520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7530: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
7540: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
7550: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7570: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
7580: 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54 52 41  pProbe */..  TRA
7590: 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20  CE(("bestIndex: 
75a0: 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d  tbl=%s notReady=
75b0: 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  %x\n", pSrc->pTa
75c0: 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61  b->zName, notRea
75d0: 64 79 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  dy));..  /* Chec
75e0: 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58  k for a rowid=EX
75f0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
7600: 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
7610: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
7620: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
7630: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
7640: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
7650: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
7660: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
7670: 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20  r;.    *ppIndex 
7680: 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  = 0;.    bestFla
7690: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
76a0: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65  _EQ;.    if( pTe
76b0: 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57  rm->operator & W
76c0: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  O_EQ ){.      /*
76d0: 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61   Rowid== is alwa
76e0: 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63 6b  ys the best pick
76f0: 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68  .  Look no furth
7700: 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c  er.  Because onl
7710: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  y.      ** a sin
7720: 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72  gle row is gener
7730: 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20  ated, output is 
7740: 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64  always in sorted
7750: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
7760: 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  *pFlags = WHERE_
7770: 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45  ROWID_EQ | WHERE
7780: 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 2a  _UNIQUE;.      *
7790: 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  pnEq = 1;.      
77a0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74  TRACE(("... best
77b0: 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a   is rowid\n"));.
77c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30        return 0.0
77d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
77e0: 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  (pExpr = pTerm->
77f0: 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30  pExpr)->pList!=0
7800: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
7810: 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f  id IN (LIST): co
7820: 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72  st is NlogN wher
7830: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
7840: 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20  r of list.      
7850: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f  ** elements.  */
7860: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
7870: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
7880: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 6c  ->nExpr;.      l
7890: 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73 74  owestCost *= est
78a0: 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b  Log(lowestCost);
78b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
78c0: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53    /* Rowid IN (S
78d0: 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20  ELECT): cost is 
78e0: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
78f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7900: 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ows.      ** in 
7910: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
7920: 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20  e inner select. 
7930: 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20   We have no way 
7940: 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20  to estimate.    
7950: 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20    ** that value 
7960: 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67  so make a wild g
7970: 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c  uess. */.      l
7980: 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30 2e  owestCost = 200.
7990: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
79a0: 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49  CE(("... rowid I
79b0: 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c  N cost: %.9g\n",
79c0: 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20   lowestCost));. 
79d0: 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74   }..  /* Estimat
79e0: 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
79f0: 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20  table scan.  If 
7a00: 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68  we do not know h
7a10: 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74  ow many.  ** ent
7a20: 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ries are in the 
7a30: 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c  table, use 1 mil
7a40: 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e  lion as a guess.
7a50: 0a 20 20 2a 2f 0a 20 20 70 50 72 6f 62 65 20 3d  .  */.  pProbe =
7a60: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
7a70: 64 65 78 3b 0a 20 20 63 6f 73 74 20 3d 20 70 50  dex;.  cost = pP
7a80: 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61  robe ? pProbe->a
7a90: 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30  iRowEst[0] : 100
7aa0: 30 30 30 30 2e 30 3b 0a 20 20 54 52 41 43 45 28  0000.0;.  TRACE(
7ab0: 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e  ("... table scan
7ac0: 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67   base cost: %.9g
7ad0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66  \n", cost));.  f
7ae0: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
7af0: 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20  ID_RANGE;..  /* 
7b00: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72  Check for constr
7b10: 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65  aints on a range
7b20: 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20   of rowids in a 
7b30: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f  table scan..  */
7b40: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
7b50: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
7b60: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
7b70: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
7b80: 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_GE, 0);.  if( 
7b90: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
7ba0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
7bb0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
7bc0: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
7bd0: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
7be0: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
7bf0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
7c00: 20 2a 3d 20 30 2e 33 33 33 3b 20 20 2f 2a 20 47   *= 0.333;  /* G
7c10: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c  uess that rowid<
7c20: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
7c30: 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72 6f  two-thirds or ro
7c40: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
7c50: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
7c60: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
7c70: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
7c80: 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66  E, 0) ){.      f
7c90: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
7ca0: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63  M_LIMIT;.      c
7cb0: 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 20 20 2f  ost *= 0.333;  /
7cc0: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
7cd0: 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id>EXPR eliminat
7ce0: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
7cf0: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
7d00: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72     TRACE(("... r
7d10: 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64 75 63  owid range reduc
7d20: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
7d30: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65  n", cost));.  }e
7d40: 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d  lse{.    flags =
7d50: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
7d60: 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
7d70: 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
7d80: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7d90: 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20  ause, increase. 
7da0: 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20   ** the cost by 
7db0: 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74  NlogN to cover t
7dc0: 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f  he expense of so
7dd0: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  rting. */.  if( 
7de0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
7df0: 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  if( sortableByRo
7e00: 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72  wid(iCur, pOrder
7e10: 42 79 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20  By, &rev) ){.   
7e20: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
7e30: 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f  E_ORDERBY|WHERE_
7e40: 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20  ROWID_RANGE;.   
7e50: 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
7e60: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
7e70: 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
7e80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7e90: 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63  .      cost += c
7ea0: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
7eb0: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
7ec0: 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72  ... sorting incr
7ed0: 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  eases cost to %.
7ee0: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
7ef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
7f00: 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
7f10: 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  {.    lowestCost
7f20: 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65 73   = cost;.    bes
7f30: 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
7f40: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
7f50: 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
7f60: 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
7f70: 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
7f80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
7f90: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7fb0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
7fc0: 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69    double inMulti
7fd0: 70 6c 69 65 72 20 3d 20 31 2e 30 3b 0a 0a 20 20  plier = 1.0;..  
7fe0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e    TRACE(("... in
7ff0: 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f  dex %s:\n", pPro
8000: 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  be->zName));..  
8010: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
8020: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8030: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68   in the index th
8040: 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65 64  at are satisfied
8050: 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50  .    ** by x=EXP
8060: 52 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  R constraints or
8070: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73   x IN (...) cons
8080: 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  traints..    */.
8090: 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20      flags = 0;. 
80a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
80b0: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  robe->nColumn; i
80c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
80d0: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
80e0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  umn[i];.      pT
80f0: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
8100: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
8110: 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
8120: 49 4e 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  IN, pProbe);.   
8130: 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
8140: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
8150: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
8160: 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
8170: 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74  f( pTerm->operat
8180: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
8190: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
81a0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
81b0: 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
81c0: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
81d0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  IN;.        if( 
81e0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d  pExpr->pSelect!=
81f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
8200: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 31  nMultiplier *= 1
8210: 30 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  00.0;.        }e
8220: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
8230: 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  List!=0 ){.     
8240: 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65       inMultiplie
8250: 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  r *= pExpr->pLis
8260: 74 2d 3e 6e 45 78 70 72 20 2b 20 31 2e 30 3b 0a  t->nExpr + 1.0;.
8270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8280: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74  }.    }.    cost
8290: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
82a0: 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69  Est[i] * inMulti
82b0: 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69  plier * estLog(i
82c0: 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20  nMultiplier);.  
82d0: 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69    nEq = i;.    i
82e0: 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
82f0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28  or!=OE_None && (
8300: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
8310: 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20  LUMN_IN)==0.    
8320: 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72       && nEq==pPr
8330: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
8340: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
8350: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
8360: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
8370: 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d  ..... nEq=%d inM
8380: 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e  ult=%.9g cost=%.
8390: 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75  9g\n", nEq, inMu
83a0: 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29 29  ltiplier, cost))
83b0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ;..    /* Look f
83c0: 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  or range constra
83d0: 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ints.    */.    
83e0: 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
83f0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
8400: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
8410: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
8420: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
8430: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8440: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
8450: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8460: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b  |WO_GE, pProbe);
8470: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
8480: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
8490: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
84a0: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
84b0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
84c0: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
84d0: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
84e0: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
84f0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8500: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
8510: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
8520: 20 2a 3d 20 30 2e 33 33 33 3b 0a 20 20 20 20 20   *= 0.333;.     
8530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8540: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
8550: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
8560: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  , WO_GT|WO_GE, p
8570: 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
8580: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8590: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
85a0: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20          cost *= 
85b0: 30 2e 33 33 33 3b 0a 20 20 20 20 20 20 20 20 7d  0.333;.        }
85c0: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
85d0: 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65  "...... range re
85e0: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
85f0: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
8600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8610: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64    /* Add the add
8620: 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20  itional cost of 
8630: 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20  sorting if that 
8640: 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20  is a factor..   
8650: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
8660: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
8670: 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
8680: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26  _COLUMN_IN)==0 &
8690: 26 0a 20 20 20 20 20 20 20 20 69 73 53 6f 72 74  &.        isSort
86a0: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
86b0: 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 70   pProbe, pSrc->p
86c0: 54 61 62 2c 20 69 43 75 72 2c 20 70 4f 72 64 65  Tab, iCur, pOrde
86d0: 72 42 79 2c 20 6e 45 71 2c 20 26 72 65 76 29 20  rBy, nEq, &rev) 
86e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
86f0: 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
8700: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45       flags = WHE
8710: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
8720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8730: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8740: 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
8750: 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
8760: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8770: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
8780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
87a0: 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
87b0: 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
87c0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
87d0: 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61 73   orderby increas
87e0: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
87f0: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
8800: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8810: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
8820: 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77 61  f we can get awa
8830: 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75 73  y with using jus
8840: 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  t the index with
8850: 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72 20  out.    ** ever 
8860: 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c  reading the tabl
8870: 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  e.  If that is t
8880: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68 61  he case, then ha
8890: 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  lve the.    ** c
88a0: 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ost of this inde
88b0: 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
88c0: 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63 2d  ( flags && pSrc-
88d0: 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69  >colUsed < (((Bi
88e0: 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
88f0: 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  )) ){.      Bitm
8900: 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
8910: 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74  lUsed;.      int
8920: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
8930: 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  0; j<pProbe->nCo
8940: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
8950: 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f      int x = pPro
8960: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  be->aiColumn[j];
8970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
8980: 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
8990: 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
89a0: 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
89b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
89c0: 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
89d0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
89e0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
89f0: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2a 3d 20          cost *= 
8a00: 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 54 52 41  0.5;.        TRA
8a10: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
8a20: 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
8a30: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
8a40: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
8a50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
8a60: 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
8a70: 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
8a80: 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
8a90: 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
8aa0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74 20  */.    if( cost 
8ab0: 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  < lowestCost ){.
8ac0: 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20        bestIdx = 
8ad0: 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f  pProbe;.      lo
8ae0: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
8af0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
8b00: 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20  lags!=0 );.     
8b10: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
8b20: 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45  gs;.      bestNE
8b30: 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20  q = nEq;.    }. 
8b40: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8b50: 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a  the best result.
8b60: 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20    */.  *ppIndex 
8b70: 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54 52 41  = bestIdx;.  TRA
8b80: 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20  CE(("best index 
8b90: 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67  is %s, cost=%.9g
8ba0: 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d  , flags=%x, nEq=
8bb0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62  %d\n",.        b
8bc0: 65 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78  estIdx ? bestIdx
8bd0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65  ->zName : "(none
8be0: 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20  )", lowestCost, 
8bf0: 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e  bestFlags, bestN
8c00: 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20  Eq));.  *pFlags 
8c10: 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 2a  = bestFlags;.  *
8c20: 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a  pnEq = bestNEq;.
8c30: 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74 43    return lowestC
8c40: 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  ost;.}.../*.** D
8c50: 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
8c60: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8c70: 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
8c80: 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
8c90: 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
8ca0: 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
8cb0: 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
8cc0: 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
8cd0: 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
8ce0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
8cf0: 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
8d00: 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
8d10: 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
8d20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
8d30: 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
8d40: 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
8d50: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
8d60: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
8d70: 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
8d80: 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
8d90: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
8da0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
8db0: 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
8dc0: 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
8dd0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
8de0: 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
8df0: 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
8e00: 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
8e10: 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
8e20: 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
8e30: 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
8e40: 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
8e50: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
8e60: 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
8e70: 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
8e80: 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
8e90: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
8ea0: 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
8eb0: 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
8ec0: 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
8ed0: 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
8ee0: 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
8ef0: 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
8f00: 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
8f10: 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
8f20: 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
8f30: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
8f40: 6e 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  n.  We would get
8f50: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
8f60: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
8f70: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
8f80: 61 62 6c 65 64 2c 20 62 75 74 20 6a 6f 69 6e 73  abled, but joins
8f90: 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
8fa0: 74 6c 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e 20 20  tle.** slower.  
8fb0: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
8fc0: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 20  disable as much 
8fd0: 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
8fe0: 74 20 64 69 73 61 62 6c 69 6e 67 0a 2a 2a 20 74  t disabling.** t
8ff0: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
9000: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
9010: 20 77 65 27 64 20 67 65 74 20 74 68 65 20 77 72   we'd get the wr
9020: 6f 6e 67 20 61 6e 73 77 65 72 2e 0a 2a 2a 20 53  ong answer..** S
9030: 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
9040: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
9050: 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
9060: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
9070: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
9080: 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
9090: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 66      && (pTerm->f
90a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
90b0: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
90c0: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
90d0: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
90e0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
90f0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9100: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  n)).  ){.    pTe
9110: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
9120: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
9130: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
9140: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
9150: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
9160: 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
9170: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
9180: 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
9190: 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
91a0: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
91b0: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
91c0: 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
91d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
91e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
91f0: 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20 70   that builds a p
9200: 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64 65  robe for an inde
9210: 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a  x.  Details:.**.
9220: 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20 74  **    *  Check t
9230: 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65  he top nColumn e
9240: 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73 74  ntries on the st
9250: 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a 20  ack.  If any.** 
9260: 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 65        of those e
9270: 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c 2c  ntries are NULL,
9280: 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
9290: 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20 20  y to brk,.**    
92a0: 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65 20     which is the 
92b0: 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63 65  loop exit, since
92c0: 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79 20   no index entry 
92d0: 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20 20  will match.**   
92e0: 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74 20      if any part 
92f0: 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e 55  of the key is NU
9300: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  LL..**.**    *  
9310: 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f 62  Construct a prob
9320: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
9330: 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74   top nColumn ent
9340: 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20  ries in.**      
9350: 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20   the stack with 
9360: 61 66 66 69 6e 69 74 69 65 73 20 61 70 70 72 6f  affinities appro
9370: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
9380: 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   pIdx..*/.static
9390: 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78   void buildIndex
93a0: 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c 20 69  Probe(Vdbe *v, i
93b0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e 74 20  nt nColumn, int 
93c0: 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  brk, Index *pIdx
93d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
93e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
93f0: 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20 73  ull, -nColumn, s
9400: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9410: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
9420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9430: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75  v, OP_Pop, nColu
9440: 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mn, 0);.  sqlite
9450: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9460: 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a  _Goto, 0, brk);.
9470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9480: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
9490: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
94a0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78  ;.  sqlite3Index
94b0: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
94c0: 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Idx);.}.../*.** 
94d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
94e0: 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c  r a single equal
94f0: 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ity term of the 
9500: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41  WHERE clause.  A
9510: 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65  n equality.** te
9520: 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  rm can be either
9530: 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20   X=expr or X IN 
9540: 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69  (...).   pTerm i
9550: 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  s the term to be
9560: 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a   .** coded..**.*
9570: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61  * The current va
9580: 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73  lue for the cons
9590: 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f  traint is left o
95a0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
95b0: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f   stack..**.** Fo
95c0: 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
95d0: 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
95e0: 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
95f0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
9600: 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
9610: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
9620: 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
9630: 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
9640: 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
9650: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
9660: 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
9670: 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
9680: 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
9690: 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
96a0: 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74  void codeEqualit
96b0: 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  yTerm(.  Parse *
96c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
96d0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
96e0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
96f0: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20  rm *pTerm,   /* 
9700: 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  The term of the 
9710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
9720: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
9730: 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20 20 20  t brk,          
9740: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
9750: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f  o abandon the lo
9760: 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  op */.  WhereLev
9770: 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57  el *pLevel  /* W
9780: 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
9790: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
97a0: 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
97b0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
97c0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
97d0: 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b    if( pX->op!=TK
97e0: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
97f0: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  t( pX->op==TK_EQ
9800: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
9810: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
9820: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66  pX->pRight);.#if
9830: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9840: 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
9850: 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e{.    int iTab;
9860: 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20  .    int *aIn;. 
9870: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
9880: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20  rse->pVdbe;..   
9890: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
98a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
98b0: 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58  );.    iTab = pX
98c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
98d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
98e0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
98f0: 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64 62  b, brk);.    Vdb
9900: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
9910: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
9920: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
9930: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
9940: 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
9950: 61 49 6e 4c 6f 6f 70 20 3d 20 61 49 6e 20 3d 20  aInLoop = aIn = 
9960: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
9970: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20  evel->aInLoop,. 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61  sizeof(pLevel->a
99b0: 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a 70 4c 65  InLoop[0])*3*pLe
99c0: 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 69  vel->nIn);.    i
99d0: 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( aIn ){.      
99e0: 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  aIn += pLevel->n
99f0: 49 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20 20  In*3 - 3;.      
9a00: 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78 74  aIn[0] = OP_Next
9a10: 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d  ;.      aIn[1] =
9a20: 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49 6e   iTab;.      aIn
9a30: 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [2] = sqlite3Vdb
9a40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
9a50: 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  umn, iTab, 0);. 
9a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a70: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
9a80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9a90: 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
9aa0: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
9ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
9ac0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
9ad0: 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
9ae0: 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
9af0: 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
9b00: 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73  dex.  The values
9b10: 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
9b20: 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e  ints are left on
9b30: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
9b40: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
9b50: 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
9b60: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
9b70: 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
9b80: 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
9b90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9ba0: 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
9bb0: 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
9bc0: 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
9bd0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
9be0: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
9bf0: 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
9c00: 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
9c10: 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
9c20: 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
9c30: 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
9c40: 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
9c50: 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
9c60: 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
9c70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9c80: 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
9c90: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
9ca0: 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
9cb0: 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
9cc0: 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
9cd0: 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65  and b will be le
9ce0: 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ft.** on the sta
9cf0: 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64 65  ck - a is the de
9d00: 65 70 65 73 74 20 61 6e 64 20 62 20 74 68 65 20  epest and b the 
9d10: 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a  shallowest..**.*
9d20: 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
9d30: 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20   above nEq==2.  
9d40: 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74  But this subrout
9d50: 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
9d60: 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45  y value.** of nE
9d70: 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20  q including 0.  
9d80: 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20  If nEq==0, this 
9d90: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c  routine is nearl
9da0: 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  y a no-op..** Th
9db0: 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20  e only thing it 
9dc0: 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65  does is allocate
9dd0: 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   the pLevel->iMe
9de0: 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a  m memory cell..*
9df0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9e00: 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  e always allocat
9e10: 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  es at least one 
9e20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
9e30: 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72  puts.** the addr
9e40: 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  ess of that memo
9e50: 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65  ry cell in pLeve
9e60: 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f  l->iMem.  The co
9e70: 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
9e80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
9e90: 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69  ll use pLevel->i
9ea0: 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65  Mem to store the
9eb0: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
9ec0: 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
9ed0: 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
9ee0: 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
9ef0: 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
9f00: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
9f10: 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
9f20: 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
9f30: 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
9f40: 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
9f50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
9f60: 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
9f70: 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
9f80: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
9f90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9fa0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
9fb0: 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
9fc0: 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
9fd0: 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
9fe0: 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
9ff0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
a000: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
a010: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
a020: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
a030: 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
a040: 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
a050: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
a060: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20  d */.  int brk  
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a080: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64  Jump here to end
a090: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a   the loop */.){.
a0a0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
a0b0: 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20  el->nEq;        
a0c0: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
a0d0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
a0e0: 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
a0f0: 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65  .  int termsInMe
a100: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
a110: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f   /* If true, sto
a120: 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b  re value in mem[
a130: 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62  ] cells */.  Vdb
a140: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a150: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
a160: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
a170: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
a180: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
a190: 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
a1a0: 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
a1b0: 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
a1c0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
a1d0: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
a1e0: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
a1f0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
a200: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
a210: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a220: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
a230: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
a240: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
a250: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a270: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
a280: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
a290: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
a2a0: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
a2b0: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
a2c0: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65  te them..  ** We
a2d0: 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20   always need at 
a2e0: 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74  least one used t
a2f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70  o store the loop
a300: 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a   terminator.  **
a310: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72   value.  If ther
a320: 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f  e are IN operato
a330: 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e  rs we'll need on
a340: 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72  e for each == or
a350: 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61  .  ** IN constra
a360: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76  int..  */.  pLev
a370: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
a380: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28  e->nMem++;.  if(
a390: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
a3a0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
a3b0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
a3c0: 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e  nMem += pLevel->
a3d0: 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e  nEq;.    termsIn
a3e0: 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  Mem = 1;.  }..  
a3f0: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
a400: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
a410: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ints.  */.  for(
a420: 6a 3d 30 3b 20 31 3b 20 6a 2b 2b 29 7b 0a 20 20  j=0; 1; j++){.  
a430: 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
a440: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
a450: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
a460: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
a470: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
a480: 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20  WO_IN, pIdx);.  
a490: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
a4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
a4b0: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
a4c0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
a4d0: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71  =0 );.    codeEq
a4e0: 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
a4f0: 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70  e, pTerm, brk, p
a500: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Level);.    if( 
a510: 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20  termsInMem ){.  
a520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a530: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
a540: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
a550: 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d  m+j+1, 1);.    }
a560: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
a570: 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==nEq );..  /* M
a580: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
a590: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
a5a0: 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f  es are on the to
a5b0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20  p of the stack. 
a5c0: 20 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49   */.  if( termsI
a5d0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  nMem ){.    for(
a5e0: 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
a5f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a600: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a610: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
a620: 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20  iMem+j+1, 0);.  
a630: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65    }.  }.}..#ifde
a640: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
a650: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a660: 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
a670: 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
a680: 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
a690: 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
a6a0: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
a6b0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
a6c0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
a6d0: 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
a6e0: 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
a6f0: 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
a700: 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
a710: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
a720: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
a730: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
a740: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
a750: 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
a760: 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
a770: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
a780: 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
a790: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a7a0: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
a7b0: 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
a7c0: 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
a7d0: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
a7e0: 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /..../*.** Gener
a7f0: 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
a800: 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
a810: 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
a820: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
a830: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
a840: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
a850: 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
a860: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
a870: 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
a880: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
a890: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
a8a0: 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
a8b0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
a8c0: 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
a8d0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
a8e0: 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
a8f0: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
a900: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
a910: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
a920: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a930: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
a940: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a950: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
a960: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
a970: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
a980: 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
a990: 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
a9a0: 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
a9b0: 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
a9c0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
a9d0: 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
a9e0: 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
a9f0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
aa00: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
aa10: 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
aa20: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
aa30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
aa40: 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
aa50: 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
aa60: 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
aa70: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
aa80: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
aa90: 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
aaa0: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
aab0: 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
aac0: 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
aad0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
aae0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
aaf0: 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
ab00: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
ab10: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
ab20: 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
ab30: 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
ab40: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
ab50: 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
ab60: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
ab70: 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
ab80: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
ab90: 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
abc0: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
abd0: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
abe0: 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
abf0: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
ac00: 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
ac30: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
ac40: 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
ac50: 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
ac60: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
ac70: 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
ac80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ac90: 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
aca0: 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
acb0: 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
acc0: 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
acd0: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
ace0: 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
acf0: 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
ad00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
ad10: 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
ad20: 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
ad30: 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
ad40: 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
ad50: 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
ad60: 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
ad70: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
ad80: 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
ad90: 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
ada0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
adb0: 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
adc0: 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
add0: 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
ade0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
adf0: 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
ae00: 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
ae10: 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
ae20: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
ae30: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
ae40: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
ae50: 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
ae60: 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
ae70: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
ae80: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
ae90: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
aea0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
aeb0: 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
aec0: 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
aed0: 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
aee0: 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
aef0: 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
af00: 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
af10: 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
af20: 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
af30: 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
af40: 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
af50: 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
af60: 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
af70: 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
af80: 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
af90: 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
afa0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
afb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
afc0: 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
afd0: 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
afe0: 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
aff0: 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
b000: 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
b010: 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
b020: 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
b030: 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
b040: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
b050: 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
b060: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
b070: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
b080: 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
b090: 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
b0a0: 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
b0b0: 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
b0c0: 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
b0d0: 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
b0e0: 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
b0f0: 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
b100: 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
b110: 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
b120: 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
b130: 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
b140: 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
b150: 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
b160: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
b170: 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
b180: 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
b190: 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
b1a0: 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
b1b0: 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
b1c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
b1d0: 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
b1e0: 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
b1f0: 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
b200: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
b210: 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
b220: 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
b230: 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
b240: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
b250: 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
b260: 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
b270: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
b280: 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
b290: 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
b2a0: 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
b2b0: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
b2c0: 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
b2d0: 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
b2e0: 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
b2f0: 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
b300: 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
b310: 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
b320: 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
b330: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
b340: 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
b350: 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
b360: 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
b370: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
b380: 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
b390: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
b3a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
b3b0: 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
b3c0: 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
b3d0: 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
b3e0: 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
b3f0: 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
b400: 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
b410: 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
b420: 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
b430: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
b440: 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
b450: 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
b460: 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
b470: 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
b480: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
b490: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
b4a0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
b4b0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
b4c0: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
b4d0: 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
b4e0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
b4f0: 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
b500: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
b510: 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
b520: 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
b530: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
b540: 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
b550: 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
b560: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
b570: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
b580: 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
b590: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b5a0: 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
b5b0: 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
b5c0: 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
b5d0: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
b5e0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
b5f0: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
b600: 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
b610: 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
b620: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b630: 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
b640: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
b650: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
b660: 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
b670: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b680: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
b690: 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
b6a0: 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
b6b0: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
b6c0: 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
b6d0: 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
b6e0: 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
b6f0: 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
b700: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
b710: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b720: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
b730: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
b740: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
b750: 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
b760: 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
b770: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
b780: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
b790: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
b7a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
b7b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
b7c0: 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20  pOrderBy  /* An 
b7d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
b7e0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
b7f0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b810: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b820: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
b830: 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
b840: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
b850: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
b860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
b870: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b880: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
b890: 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
b8a0: 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
b8b0: 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d   int brk, cont =
b8c0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
b8d0: 64 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75  ddresses used du
b8e0: 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
b8f0: 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
b900: 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
b910: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
b920: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
b930: 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
b940: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
b950: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  m;          /* A
b960: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   single term in 
b970: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
b980: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
b990: 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  t maskSet;      
b9a0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b9b0: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
b9c0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b9e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b9f0: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
ba00: 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  these terms */. 
ba10: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ba20: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
ba30: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
ba40: 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
ba50: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
ba60: 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
ba70: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
ba80: 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
ba90: 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
baa0: 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
bad0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
bae0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
baf0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
bb00: 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
bb10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
bb20: 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f   wc.a[].flags */
bb30: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
bb40: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
bb50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
bb60: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
bb70: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
bb80: 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
bb90: 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
bba0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
bbb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bbc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bbd0: 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
bbe0: 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
bbf0: 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
bc00: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c  0;.  }..  /* Spl
bc10: 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
bc20: 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
bc30: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
bc40: 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
bc50: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
bc60: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
bc70: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
bc80: 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
bc90: 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20  et(&maskSet);.  
bca0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
bcb0: 26 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  &wc, pParse);.  
bcc0: 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20  whereSplit(&wc, 
bcd0: 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
bce0: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .    .  /* Alloc
bcf0: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
bd00: 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
bd10: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bd20: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
bd30: 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
bd40: 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  e..  */.  pWInfo
bd50: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
bd60: 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66   sizeof(WhereInf
bd70: 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e  o) + pTabList->n
bd80: 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  Src*sizeof(Where
bd90: 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73  Level));.  if( s
bda0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
bdb0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
bdc0: 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d   whereBeginNoMem
bdd0: 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
bde0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
bdf0: 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
be00: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
be10: 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
be20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
be30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
be40: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
be50: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
be60: 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
be70: 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
be80: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
be90: 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
bea0: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
beb0: 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
bec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
bed0: 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74  ere && (pTabList
bee0: 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->nSrc==0 || sql
bef0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
bf00: 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  nt(pWhere)) ){. 
bf10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
bf20: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
bf30: 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
bf40: 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57  reak, 1);.    pW
bf50: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
bf60: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
bf70: 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
bf80: 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
bf90: 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
bfa0: 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
bfb0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
bfc0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
bfd0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
bfe0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
bff0: 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
c000: 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
c010: 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
c020: 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
c030: 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
c040: 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
c050: 68 61 74 20 74 68 65 79 20 61 64 64 65 64 20 76  hat they added v
c060: 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
c070: 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
c080: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
c090: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
c0a0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72  rc; i++){.    cr
c0b0: 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65  eateMask(&maskSe
c0c0: 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
c0d0: 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
c0e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
c0f0: 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b  (pTabList, &mask
c100: 53 65 74 2c 20 26 77 63 29 3b 0a 0a 20 20 2f 2a  Set, &wc);..  /*
c110: 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
c120: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
c130: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
c140: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
c150: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
c160: 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
c170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
c180: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
c190: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
c1a0: 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
c1b0: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
c1c0: 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
c1d0: 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
c1e0: 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57  >a[].flags     W
c1f0: 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
c200: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
c210: 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
c220: 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
c230: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
c240: 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
c250: 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
c260: 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
c270: 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74    When term of t
c280: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
c290: 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
c2a0: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c2b0: 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
c2c0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
c2d0: 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
c2e0: 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
c2f0: 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
c300: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
c310: 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
c320: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
c330: 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
c340: 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
c350: 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
c360: 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
c370: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
c380: 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
c390: 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
c3a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
c3b0: 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
c3c0: 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
c3d0: 20 3d 20 7e 30 3b 0a 20 20 66 6f 72 28 69 3d 69   = ~0;.  for(i=i
c3e0: 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  From=0, pLevel=p
c3f0: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
c400: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
c410: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
c420: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
c430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c440: 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
c450: 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
c460: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
c470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c480: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73     /* Flags asss
c490: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
c4a0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71  x */.    int nEq
c4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c4d0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
c4e0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f  raints */.    do
c4f0: 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
c500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c510: 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a   cost for pIdx *
c520: 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
c550: 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
c560: 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
c570: 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
c580: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
c590: 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66   index seen so f
c5a0: 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  ar */.    int be
c5b0: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
c5c0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
c5d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
c5e0: 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
c5f0: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
c600: 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61          /* nEq a
c610: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
c620: 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62  Best */.    doub
c630: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  le lowestCost = 
c640: 31 2e 30 65 39 39 3b 20 2f 2a 20 43 6f 73 74 20  1.0e99; /* Cost 
c650: 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a  of the pBest */.
c660: 20 20 20 20 69 6e 74 20 62 65 73 74 4a 3b 20 20      int bestJ;  
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
c690: 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
c6a0: 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
c6b0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
c6c0: 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
c6d0: 65 73 74 4a 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  estJ */..    for
c6e0: 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
c6f0: 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
c700: 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j]; j<pTabList->
c710: 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49  nSrc; j++, pTabI
c720: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 20  tem++){.      m 
c730: 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53  = getMask(&maskS
c740: 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
c750: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
c760: 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29  ( (m & notReady)
c770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
c780: 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
c790: 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  rom++;.        c
c7a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
c7b0: 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65  .      cost = be
c7c0: 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
c7d0: 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  &wc, pTabItem, n
c7e0: 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 28 6a 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72  (j==0 && ppOrder
c810: 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79  By) ? *ppOrderBy
c820: 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 49               &pI
c840: 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71  dx, &flags, &nEq
c850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73  );.      if( cos
c860: 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  t<lowestCost ){.
c870: 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f          lowestCo
c880: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20  st = cost;.     
c890: 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
c8a0: 0a 20 20 20 20 20 20 20 20 62 65 73 74 46 6c 61  .        bestFla
c8b0: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs = flags;.    
c8c0: 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45      bestNEq = nE
c8d0: 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a  q;.        bestJ
c8e0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
c8f0: 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65      if( (pTabIte
c900: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
c910: 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 20  _LEFT)!=0.      
c920: 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28 70     || (j>0 && (p
c930: 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e  TabItem[-1].join
c940: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
c950: 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0).      ){.   
c960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
c980: 28 20 28 62 65 73 74 46 6c 61 67 73 20 26 20 57  ( (bestFlags & W
c990: 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30  HERE_ORDERBY)!=0
c9a0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64   ){.      *ppOrd
c9b0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  erBy = 0;.    }.
c9c0: 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20      andFlags &= 
c9d0: 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20 20 70  bestFlags;.    p
c9e0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62  Level->flags = b
c9f0: 65 73 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c  estFlags;.    pL
ca00: 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65  evel->pIdx = pBe
ca10: 73 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  st;.    pLevel->
ca20: 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20  nEq = bestNEq;. 
ca30: 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f     pLevel->aInLo
ca40: 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76  op = 0;.    pLev
ca50: 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
ca60: 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
ca70: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
ca80: 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
ca90: 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ab++;.    }else{
caa0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
cab0: 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  IdxCur = -1;.   
cac0: 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20   }.    notReady 
cad0: 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73  &= ~getMask(&mas
cae0: 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
caf0: 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
cb00: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  );.    pLevel->i
cb10: 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20  From = bestJ;.  
cb20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
cb30: 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
cb40: 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
cb50: 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
cb60: 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
cb70: 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
cb80: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
cb90: 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
cba0: 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
cbb0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
cbc0: 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
cbd0: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
cbe0: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
cbf0: 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
cc00: 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
cc10: 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
cc20: 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
cc30: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
cc40: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
cc50: 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
cc60: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
cc70: 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
cc80: 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20  o */.  pLevel = 
cc90: 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72  pWInfo->a;.  for
cca0: 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
ccb0: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
ccc0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
ccd0: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
cce0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49  ble *pTab;.    I
ccf0: 6e 64 65 78 20 2a 70 49 78 3b 0a 20 20 20 20 69  ndex *pIx;.    i
cd00: 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
cd10: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20  vel->iIdxCur;.. 
cd20: 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
cd30: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
cd40: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
cd50: 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
cd60: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
cd70: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
cd80: 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
cd90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
cda0: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
cdb0: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
cdc0: 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
cdd0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
cde0: 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20  leForReading(v, 
cdf0: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
ce00: 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  r, pTab);.    }.
ce10: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
ce20: 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
ce30: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28  iCursor;.    if(
ce40: 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
ce50: 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
ce60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
ce80: 2c 20 70 49 78 2d 3e 69 44 62 2c 20 30 29 3b 0a  , pIx->iDb, 0);.
ce90: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
cea0: 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49  t((v, "# %s", pI
ceb0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
cec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ced0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
cee0: 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74   iIdxCur, pIx->t
cef0: 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
cf00: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
cf10: 29 26 70 49 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  )&pIx->keyInfo, 
cf20: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
cf30: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76   }.    if( (pLev
cf40: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
cf50: 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29  E_IDX_ONLY)!=0 )
cf60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cf70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
cf80: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49  etNumColumns, iI
cf90: 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c  dxCur, pIx->nCol
cfa0: 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  umn+1);.    }.  
cfb0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
cfc0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
cfd0: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
cfe0: 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
cff0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d000: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
d010: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
d020: 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
d030: 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
d040: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
d050: 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
d060: 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
d070: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
d080: 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
d090: 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
d0a0: 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
d0b0: 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
d0c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
d0d0: 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
d0e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
d0f0: 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
d100: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
d110: 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
d120: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f  tem->iCursor;  /
d130: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
d140: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
d150: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
d160: 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  dx;       /* The
d170: 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
d180: 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
d190: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
d1a0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
d1b0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
d1c0: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d  ex */.    int om
d1d0: 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20  itTable;     /* 
d1e0: 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
d1f0: 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
d200: 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20  .    int bRev;  
d210: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d220: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
d230: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
d240: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62  der */..    pTab
d250: 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
d260: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
d270: 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70  m];.    iCur = p
d280: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
d290: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ;.    pIdx = pLe
d2a0: 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69  vel->pIdx;.    i
d2b0: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
d2c0: 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52  >iIdxCur;.    bR
d2d0: 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  ev = (pLevel->fl
d2e0: 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
d2f0: 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69  RSE)!=0;.    omi
d300: 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c  tTable = (pLevel
d310: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
d320: 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20  IDX_ONLY)!=0;.. 
d330: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
d340: 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
d350: 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
d360: 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
d370: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
d380: 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
d390: 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65  mp to brk to bre
d3a0: 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
d3b0: 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  ..    ** Jump to
d3c0: 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
d3d0: 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
d3e0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
d3f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70   the.    ** loop
d400: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b  ..    */.    brk
d410: 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d   = pLevel->brk =
d420: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d430: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f  Label(v);.    co
d440: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
d450: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
d460: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
d470: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d480: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
d490: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
d4a0: 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
d4b0: 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  nd.    ** initia
d4c0: 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
d4d0: 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
d4e0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
d4f0: 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a  tches any.    **
d500: 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
d510: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
d520: 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
d530: 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
d540: 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
d550: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
d560: 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
d570: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
d580: 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e  >nMem ) pParse->
d590: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  nMem++;.      pL
d5a0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
d5b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
d5c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d5d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d5e0: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
d5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d600: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
d610: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  e, pLevel->iLeft
d620: 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  Join, 1);.      
d630: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d640: 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  "# init LEFT JOI
d650: 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
d660: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
d670: 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
d680: 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
d690: 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  Q ){.      /* Ca
d6a0: 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
d6b0: 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
d6c0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
d6d0: 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  ing an.      ** 
d6e0: 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
d6f0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
d700: 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
d710: 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20  ield.  Or.      
d720: 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
d730: 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
d740: 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
d750: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
d760: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
d770: 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
d780: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 72     */.      pTer
d790: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
d7a0: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
d7b0: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
d7c0: 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  N, 0);.      ass
d7d0: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
d7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d7f0: 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
d800: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d810: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d820: 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
d830: 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
d840: 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  le==0 );.      c
d850: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
d860: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62  pParse, pTerm, b
d870: 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  rk, pLevel);.   
d880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d890: 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  dOp(v, OP_MustBe
d8a0: 49 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20  Int, 1, brk);.  
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  ddOp(v, OP_NotEx
d8d0: 69 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b 29  ists, iCur, brk)
d8e0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d8f0: 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
d900: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
d910: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
d920: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
d930: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
d940: 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20  ROWID_RANGE ){. 
d950: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
d960: 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
d970: 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
d980: 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
d990: 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  WID field..     
d9a0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65   */.      int te
d9b0: 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
d9c0: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
d9d0: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
d9e0: 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
d9f0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
da00: 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
da10: 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 66        pStart = f
da20: 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
da30: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
da40: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
da50: 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66  ;.      pEnd = f
da60: 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
da70: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
da80: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
da90: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76  ;.      if( bRev
daa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72   ){.        pTer
dab0: 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
dac0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
dad0: 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20  d;.        pEnd 
dae0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
daf0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72  .      if( pStar
db00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
db10: 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70  r *pX;.        p
db20: 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
db30: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
db40: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
db50: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
db60: 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
db70: 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iCur );.        
db80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
db90: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
dba0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ht);.        sql
dbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dbc0: 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58   OP_ForceInt, pX
dbd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70  ->op==TK_LE || p
dbe0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72  X->op==TK_GT, br
dbf0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
dc00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dc10: 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74  bRev ? OP_MoveLt
dc20: 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43   : OP_MoveGe, iC
dc30: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
dc40: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dc50: 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
dc60: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
dc70: 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
dc80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dca0: 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f  ddOp(v, bRev ? O
dcb0: 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
dcc0: 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  nd, iCur, brk);.
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dce0: 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
dcf0: 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
dd00: 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
dd10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73  Expr;.        as
dd20: 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
dd30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dd40: 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
dd50: 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  =iCur );.       
dd60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
dd70: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
dd80: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ght);.        pL
dd90: 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
dda0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
ddb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ddc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
ddd0: 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
dde0: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
ddf0: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
de00: 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
de10: 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GT ){.          
de20: 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
de30: 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
de40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
de50: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
de60: 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
de70: 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Gt;.        }
de80: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
de90: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
dea0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
deb0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
dec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ded0: 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  (v);.      pLeve
dee0: 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
def0: 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
df00: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
df10: 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
df20: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
df30: 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74  art;.      if( t
df40: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
df50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
df60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
df70: 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29  _Rowid, iCur, 0)
df80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
df90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dfa0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
dfb0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
dfc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dfd0: 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20  ddOp(v, testOp, 
dfe0: 27 6e 27 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  'n', brk);.     
dff0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
e000: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
e010: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
e020: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
e030: 43 61 73 65 20 33 3a 20 54 68 65 20 57 48 45 52  Case 3: The WHER
e040: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
e050: 61 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65  at refers to the
e060: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20   right-most.    
e070: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
e080: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
e090: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
e0a0: 79 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  y.  For example,
e0b0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   if.      **    
e0c0: 20 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 69       the index i
e0d0: 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64  s on (x,y,z) and
e0e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
e0f0: 65 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20 20  e is of the.    
e100: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72    **         for
e110: 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30 22  m "x=5 AND y<10"
e120: 20 74 68 65 6e 20 74 68 69 73 20 63 61 73 65 20   then this case 
e130: 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74  is used.  Only t
e140: 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  he.      **     
e150: 20 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63      right-most c
e160: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
e170: 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
e180: 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20   rest must.     
e190: 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
e1a0: 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
e1b0: 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20  " operators..   
e1c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
e1d0: 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
e1e0: 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
e1f0: 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
e200: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
e210: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
e220: 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
e230: 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
e240: 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
e250: 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  der.      **    
e260: 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
e270: 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
e280: 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
e290: 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20  ORDER BY..      
e2a0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
e2b0: 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
e2c0: 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
e2d0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 46 6c 61  .      int leFla
e2e0: 67 3d 30 2c 20 67 65 46 6c 61 67 3d 30 3b 0a 20  g=0, geFlag=0;. 
e2f0: 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 3b       int testOp;
e300: 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69  .      int topLi
e310: 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
e320: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
e330: 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20  _LIMIT)!=0;.    
e340: 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d    int btmLimit =
e350: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
e360: 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
e370: 54 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  T)!=0;..      /*
e380: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e390: 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
e3a0: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
e3b0: 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
e3c0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65       ** and leve
e3d0: 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  l the values of 
e3e0: 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74  those terms on t
e3f0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20  he stack..      
e400: 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c  */.      codeAll
e410: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
e420: 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77  arse, pLevel, &w
e430: 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b  c, notReady, brk
e440: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70  );..      /* Dup
e450: 6c 69 63 61 74 65 20 74 68 65 20 65 71 75 61 6c  licate the equal
e460: 69 74 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20  ity term values 
e470: 62 65 63 61 75 73 65 20 74 68 65 79 20 77 69 6c  because they wil
e480: 6c 20 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a  l all be.      *
e490: 2a 20 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e  * used twice: on
e4a0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ce to make the t
e4b0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61  ermination key a
e4c0: 6e 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  nd once to make 
e4d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  the.      ** sta
e4e0: 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  rt key..      */
e4f0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e500: 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
e510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e520: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
e530: 20 6e 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20   nEq-1, 0);.    
e540: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
e550: 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d 69  nerate the termi
e560: 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69  nation key.  Thi
e570: 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61 6c  s is the key val
e580: 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ue that.      **
e590: 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73 65   will end the se
e5a0: 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
e5b0: 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  no termination k
e5c0: 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  ey if there.    
e5d0: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75 61    ** are no equa
e5e0: 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20 6e  lity terms and n
e5f0: 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a  o "X<..." term..
e600: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
e610: 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f  * 2002-Dec-04: O
e620: 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  n a reverse-orde
e630: 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63  r scan, the so-c
e640: 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74 69  alled "terminati
e650: 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  on".      ** key
e660: 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20 72   computed here r
e670: 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65  eally ends up be
e680: 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b 65  ing the start ke
e690: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
e6a0: 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29    if( topLimit )
e6b0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
e6c0: 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
e6d0: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
e6e0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
e6f0: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
e700: 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
e710: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
e720: 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _LE, pIdx);.    
e730: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e740: 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  m!=0 );.        
e750: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
e760: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
e770: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
e780: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
e790: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
e7a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e7b0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
e7c0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 46 6c 61 67  ;.        leFlag
e7d0: 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45   = pX->op==TK_LE
e7e0: 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
e7f0: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
e800: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  erm);.        te
e810: 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b  stOp = OP_IdxGE;
e820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e830: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e        testOp = n
e840: 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20  Eq>0 ? OP_IdxGE 
e850: 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  : OP_Noop;.     
e860: 20 20 20 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20     leFlag = 1;. 
e870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e880: 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
e890: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e8a0: 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70  nCol = nEq + top
e8b0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
e8c0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
e8d0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
e8e0: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
e8f0: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62  Probe(v, nCol, b
e900: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
e910: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
e920: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
e930: 3d 20 6c 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f  = leFlag ? OP_Mo
e940: 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74  veLe : OP_MoveLt
e950: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e960: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e970: 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  op, iIdxCur, brk
e980: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e990: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e9b0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
e9c0: 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
e9d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e9e0: 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
e9f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ea00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ea10: 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62  Last, iIdxCur, b
ea20: 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
ea30: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
ea40: 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20  the start key.  
ea50: 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20  This is the key 
ea60: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
ea70: 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20   lower.      ** 
ea80: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61  bound on the sea
ea90: 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e  rch.  There is n
eaa0: 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20 74  o start key if t
eab0: 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20  here are no.    
eac0: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65    ** equality te
ead0: 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72 65  rms and if there
eae0: 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74   is no "X>..." t
eaf0: 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a  erm.  In.      *
eb00: 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e  * that case, gen
eb10: 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64 22  erate a "Rewind"
eb20: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
eb30: 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20  place of the.   
eb40: 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20     ** start key 
eb50: 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a  search..      **
eb60: 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44  .      ** 2002-D
eb70: 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61  ec-04: In the ca
eb80: 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d  se of a reverse-
eb90: 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74 68  order search, th
eba0: 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20  e so-called.    
ebb0: 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79    ** "start" key
ebc0: 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
ebd0: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68  being used as th
ebe0: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
ebf0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
ec00: 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29    if( btmLimit )
ec10: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
ec20: 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
ec30: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
ec40: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
ec50: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
ec60: 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
ec70: 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
ec80: 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _GE, pIdx);.    
ec90: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
eca0: 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  m!=0 );.        
ecb0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
ecc0: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
ecd0: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
ece0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
ecf0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
ed00: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ed10: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
ed20: 3b 0a 20 20 20 20 20 20 20 20 67 65 46 6c 61 67  ;.        geFlag
ed30: 20 3d 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45   = pX->op==TK_GE
ed40: 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
ed50: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
ed60: 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
ed70: 65 7b 0a 20 20 20 20 20 20 20 20 67 65 46 6c 61  e{.        geFla
ed80: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
ed90: 20 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c       if( nEq>0 |
eda0: 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  | btmLimit ){.  
edb0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
edc0: 20 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b   nEq + btmLimit;
edd0: 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e  .        buildIn
ede0: 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c  dexProbe(v, nCol
edf0: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
ee00: 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
ee10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76  {.          pLev
ee20: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
ee30: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
ee40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
ee60: 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
ee70: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
ee80: 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64    testOp = OP_Id
ee90: 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xLT;.        }el
eea0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
eeb0: 74 20 6f 70 20 3d 20 67 65 46 6c 61 67 20 3f 20  t op = geFlag ? 
eec0: 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d  OP_MoveGe : OP_M
eed0: 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20  oveGt;.         
eee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eef0: 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  p(v, op, iIdxCur
ef00: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
ef10: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
ef20: 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
ef30: 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f    testOp = OP_No
ef40: 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  op;.      }else{
ef50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ef60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ef70: 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c  Rewind, iIdxCur,
ef80: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a   brk);.      }..
ef90: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
efa0: 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66  e the the top of
efb0: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74   the loop.  If t
efc0: 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e  here is a termin
efd0: 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b  ation.      ** k
efe0: 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74 65  ey we have to te
eff0: 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20  st for that key 
f000: 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68 65  and abort at the
f010: 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20   top of the.    
f020: 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20    ** loop..     
f030: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20   */.      start 
f040: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
f050: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
f060: 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
f070: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
f080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f090: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
f0a0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
f0b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
f0c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f0d0: 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c  testOp, iIdxCur,
f0e0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69   brk);.        i
f0f0: 66 28 20 28 6c 65 46 6c 61 67 20 26 26 20 21 62  f( (leFlag && !b
f100: 52 65 76 29 20 7c 7c 20 28 21 67 65 46 6c 61 67  Rev) || (!geFlag
f110: 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20 20 20   && bRev) ){.   
f120: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f130: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
f140: 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43  , "+", P3_STATIC
f150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f160: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f180: 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75  P_RowKey, iIdxCu
f190: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f1b0: 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e   OP_IdxIsNull, n
f1c0: 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 2c 20 63  Eq + topLimit, c
f1d0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ont);.      if( 
f1e0: 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
f1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f200: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
f210: 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
f220: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
f230: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f240: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
f250: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
f260: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
f270: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
f280: 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
f290: 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20  the loop..      
f2a0: 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
f2b0: 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
f2c0: 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
f2d0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
f2e0: 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
f2f0: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
f300: 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tart;.    }else 
f310: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
f320: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
f330: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
f340: 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20 69  Case 4:  There i
f350: 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61  s an index and a
f360: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
f370: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
f380: 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  t.      **      
f390: 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68 65      refer to the
f3a0: 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
f3b0: 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70   "==" or "IN" op
f3c0: 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
f3d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  /.      int star
f3e0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  t;.      int nEq
f3f0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a   = pLevel->nEq;.
f400: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
f410: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
f420: 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
f430: 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
f440: 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a  = or IN.      **
f450: 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76   and level the v
f460: 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
f470: 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63  erms on the stac
f480: 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
f490: 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74    codeAllEqualit
f4a0: 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
f4b0: 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52  Level, &wc, notR
f4c0: 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20  eady, brk);..   
f4d0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
f4e0: 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74   single key that
f4f0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
f500: 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20   both start and 
f510: 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20  terminate.      
f520: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a 20 20  ** the search.  
f530: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69      */.      bui
f540: 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
f550: 6e 45 71 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b  nEq, brk, pIdx);
f560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f570: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
f580: 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
f590: 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20  iMem, 0);..     
f5a0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f5b0: 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f  e (1) to move to
f5c0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
f5d0: 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
f5e0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
f5f0: 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65  ** Then generate
f600: 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a   code (2) that j
f610: 75 6d 70 73 20 74 6f 20 22 62 72 6b 22 20 61 66  umps to "brk" af
f620: 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 69  ter the cursor i
f630: 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  s past.      ** 
f640: 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e  the last matchin
f650: 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
f660: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64   table.  The cod
f670: 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74 65  e (1) is execute
f680: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20  d.      ** once 
f690: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
f6a0: 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f  e search, the co
f6b0: 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75 74  de (2) is execut
f6c0: 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20  ed before each. 
f6d0: 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f       ** iteratio
f6e0: 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f  n of the scan to
f6f0: 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61 6e   see if the scan
f700: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a   has finished. *
f710: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76  /.      if( bRev
f720: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
f730: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
f740: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
f750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f760: 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69  (v, OP_MoveLe, i
f770: 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
f780: 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
f790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f7a0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
f7b0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
f7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f7d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f7e0: 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20 62  dxLT, iIdxCur, b
f7f0: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  rk);.        pLe
f800: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
f810: 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
f820: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
f830: 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f  in the forward o
f840: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
f850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f860: 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
f870: 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
f880: 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
f890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f8a0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
f8b0: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
f8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f8d0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  dbeOp3(v, OP_Idx
f8e0: 47 45 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  GE, iIdxCur, brk
f8f0: 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43  , "+", P3_STATIC
f900: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
f910: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
f920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f940: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49  v, OP_RowKey, iI
f950: 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
f960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f970: 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c  p(v, OP_IdxIsNul
f980: 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20  l, nEq, cont);. 
f990: 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61       if( !omitTa
f9a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
f9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f9c0: 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
f9d0: 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
f9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
fa00: 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  Ge, iCur, 0);.  
fa10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
fa20: 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
fa30: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
fa40: 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
fa50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
fa60: 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69  Case 5:  There i
fa70: 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
fa80: 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
fa90: 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20   complete.      
faa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
fab0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
fac0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
fad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
fae0: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
faf0: 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
fb00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  =0 );.      pLev
fb10: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
fb20: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
fb30: 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
fb40: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
fb50: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
fb60: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
fb70: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
fb80: 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20   }.    notReady 
fb90: 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73  &= ~getMask(&mas
fba0: 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20  kSet, iCur);..  
fbb0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
fbc0: 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73   to test every s
fbd0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
fbe0: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74  t can be complet
fbf0: 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75  ely.    ** compu
fc00: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
fc10: 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
fc20: 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
fc30: 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
fc40: 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  j=wc.nTerm; j>0;
fc50: 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
fc60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
fc70: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
fc80: 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  >flags & (TERM_V
fc90: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
fca0: 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
fcb0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
fcc0: 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
fcd0: 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
fce0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
fcf0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
fd00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
fd10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
fd20: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
fd30: 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
fd40: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
fd50: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
fd60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
fd70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fd80: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fd90: 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31  rse, pE, cont, 1
fda0: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
fdb0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
fdc0: 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  DED;.    }..    
fdd0: 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
fde0: 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
fdf0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
fe00: 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
fe10: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 74  t that.    ** at
fe20: 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
fe30: 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
fe40: 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
fe50: 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
fe60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fe70: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
fe80: 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
fe90: 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  ->top = sqlite3V
fea0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
feb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fed0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
fee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ff00: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
ff10: 4c 65 66 74 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20  LeftJoin, 1);.  
ff20: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ff30: 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20 4c 45  (v, "# record LE
ff40: 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
ff50: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
ff60: 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e  wc.a, j=0; j<wc.
ff70: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
ff80: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
ff90: 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
ffa0: 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
ffb0: 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
ffc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
ffd0: 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
ffe0: 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
fff0: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
10000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10010 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
10020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10030 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10040 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
10050 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20   cont, 1);.     
10060 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
10070 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
10080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10090 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
100a0 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73  TEST  /* For tes
100b0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
100c0 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20  ng use only */. 
100d0 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68   /* Record in th
100e0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66  e query plan inf
100f0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
10100 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
10110 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  .  ** and the in
10120 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
10130 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20  ss it (if any). 
10140 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   If the table it
10150 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  self.  ** is not
10160 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20   used, its name 
10170 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49  is just '{}'.  I
10180 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73  f no index is us
10190 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  ed.  ** the inde
101a0 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22  x is listed as "
101b0 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69  {}".  If the pri
101c0 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
101d0 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
101e0 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a  name is '*'..  *
101f0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
10200 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
10210 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
10220 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
10230 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
10240 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
10250 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
10260 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
10270 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
10280 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
10290 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
102a0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
102b0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
102c0 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
102d0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
102e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
102f0 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
10300 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
10310 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
10320 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
10330 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
10340 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
10350 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20  QPlan], "{}");. 
10360 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
10370 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
10380 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
10390 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
103a0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b  lan[nQPlan], z);
103b0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
103c0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
103d0 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
103e0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
103f0 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
10400 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
10410 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
10420 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
10430 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
10440 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
10450 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
10460 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20  lan], "* ");.   
10470 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
10480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
10490 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b  evel->pIdx==0 ){
104a0 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73  .      strcpy(&s
104b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
104c0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
104d0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
104e0 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
104f0 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  .      n = strle
10500 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e  n(pLevel->pIdx->
10510 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
10520 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
10530 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
10540 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
10550 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
10560 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
10570 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
10580 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pIdx->zName);. 
10590 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
105a0 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
105b0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
105c0 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
105d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
105e0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61  }.  while( nQPla
105f0 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71  n>0 && sqlite3_q
10600 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
10610 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]==' ' ){.    
10620 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
10630 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30  an[--nQPlan] = 0
10640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10650 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
10660 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e  n] = 0;.  nQPlan
10670 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   = 0;.#endif /* 
10680 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54  SQLITE_TEST // T
10690 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
106a0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
106b0 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
106c0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61  e continuation a
106d0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68  ddress in the Wh
106e0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
106f0 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c  e.  Then.  ** cl
10700 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
10710 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  n..  */.  pWInfo
10720 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f  ->iContinue = co
10730 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  nt;.  whereClaus
10740 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72  eClear(&wc);.  r
10750 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
10760 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
10770 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
10780 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d  .whereBeginNoMem
10790 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  :.  whereClauseC
107a0 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 73 71 6c  lear(&wc);.  sql
107b0 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  iteFree(pWInfo);
107c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
107d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
107e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
107f0 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
10800 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
10810 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10820 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
10830 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
10840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
10850 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
10860 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62   *pWInfo){.  Vdb
10870 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
10880 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10890 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
108a0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
108b0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
108c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
108d0 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ist;..  /* Gener
108e0 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
108f0 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
10900 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74    for(i=pTabList
10910 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20  ->nSrc-1; i>=0; 
10920 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
10930 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
10940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10950 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10960 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a   pLevel->cont);.
10970 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
10980 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
10990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109a0 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d  AddOp(v, pLevel-
109b0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
109c0 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
109d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
109e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
109f0 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b  v, pLevel->brk);
10a00 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
10a10 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  >nIn ){.      in
10a20 74 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  t *a;.      int 
10a30 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  j;.      for(j=p
10a40 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70  Level->nIn, a=&p
10a50 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a  Level->aInLoop[j
10a60 2a 33 2d 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  *3-3]; j>0; j--,
10a70 20 61 2d 3d 33 29 7b 0a 20 20 20 20 20 20 20 20   a-=3){.        
10a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a90 28 76 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  (v, a[0], a[1], 
10aa0 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  a[2]);.      }. 
10ab0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
10ac0 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10ae0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10af0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
10b00 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
10b10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10b20 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
10b30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
10b40 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  oin, 0);.      s
10b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b60 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31  v, OP_NotNull, 1
10b70 2c 20 61 64 64 72 2b 34 20 2b 20 28 70 4c 65 76  , addr+4 + (pLev
10b80 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 29 29  el->iIdxCur>=0))
10b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10ba0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
10bb0 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
10bc0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20  ->a[i].iCursor, 
10bd0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  0);.      if( pL
10be0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
10bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10c00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10c10 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
10c20 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b  el->iIdxCur, 0);
10c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10c50 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
10c60 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20  Level->top);.   
10c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
10c80 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
10c90 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
10ca0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10cb0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
10cc0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
10cd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10ce0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
10cf0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
10d00 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
10d10 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
10d20 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
10d30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10d40 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
10d50 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
10d60 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
10d70 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
10d80 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63  el++){.    struc
10d90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
10da0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
10db0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
10dc0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
10dd0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
10de0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
10df0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
10e00 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
10e10 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54  sTransient || pT
10e20 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
10e30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
10e40 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
10e50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
10e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10e80 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
10e90 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29  tem->iCursor, 0)
10ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10eb0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20  pLevel->pIdx!=0 
10ec0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10ed0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10ee0 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
10ef0 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
10f00 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  }..    /* Make c
10f10 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74 69  ursor substituti
10f20 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77 68  ons for cases wh
10f30 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75  ere we want to u
10f40 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74  se.    ** just t
10f50 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76  he index and nev
10f60 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  er reference the
10f70 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a   table..    ** .
10f80 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
10f90 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
10fa0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
10fb0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
10fc0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
10fd0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
10fe0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
10ff0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
11000 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
11010 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
11020 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
11030 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
11040 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
11050 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
11060 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
11070 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
11080 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
11090 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
110a0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
110b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
110c0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
110d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
110e0 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c  .      int i, j,
110f0 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
11100 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
11110 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
11120 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20  evel->pIdx;..   
11130 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
11140 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
11150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
11160 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
11170 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
11180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
11190 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
111a0 20 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d     for(i=pWInfo-
111b0 3e 69 54 6f 70 3b 20 69 3c 6c 61 73 74 3b 20 69  >iTop; i<last; i
111c0 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
111d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
111e0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
111f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11200 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
11210 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
11220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
11230 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
11240 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
11250 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
11260 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
11270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
11280 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
11290 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
112b0 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
112c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
112d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
112e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
112f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
11300 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
11310 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
11320 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
11330 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
11340 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
11350 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
11360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11370 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
11380 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  _NullRow ){.    
11390 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
113a0 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
113b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
113c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
113d0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
113e0 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  /.  sqliteFree(p
113f0 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
11400 3b 0a 7d 0a                                      ;.}.