/ Hex Artifact Content
Login

Artifact 363b4fb0aee9fe69367ceaab0974dafa4e4ab900:


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 37 38   where.c,v 1.178
0340: 20 32 30 30 35 2f 30 39 2f 32 30 20 30 38 3a 34   2005/09/20 08:4
0350: 37 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  7:20 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
03f0: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
0400: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0410: 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  array..*/.#defin
0420: 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20 20  e ARRAYSIZE(X)  
0430: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
0440: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
0450: 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63  Trace output mac
0460: 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ros.*/.#if defin
0470: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
0480: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0490: 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71 6c  E_DEBUG).int sql
04a0: 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65  ite3_where_trace
04b0: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 54   = 0;.# define T
04c0: 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c 69  RACE(X)  if(sqli
04d0: 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29  te3_where_trace)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  ntf X.#else.# de
0500: 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65  fine TRACE(X).#e
0510: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
0520: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
0530: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0540: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
0550: 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ause;../*.** The
0560: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
0570: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
0580: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
0590: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
05a0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
05b0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
05c0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
05d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
05e0: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
05f0: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0600: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0610: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0620: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
0630: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
0640: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
0650: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
0660: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
0670: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
0680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
0690: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
06a0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
06b0: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
06c0: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
06d0: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
06e0: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
06f0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
0710: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
0720: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
0730: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
0740: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
0750: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
0760: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
0770: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
0780: 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c  hereTerm.leftCol
0790: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07a0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07b0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07c0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07d0: 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63  erm.operator rec
07e0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
07f0: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
0800: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
0810: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
0820: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
0830: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
0840: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
0850: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
0860: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
0870: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
0880: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
0890: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
08a0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
08b0: 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20  .** prereqRight 
08c0: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
08d0: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
08e0: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
08f0: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0900: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0910: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0920: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0930: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0940: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0950: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0960: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0970: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0980: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0990: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
09a0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
09b0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
09c0: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
09d0: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
09e0: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
09f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0a00: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0a10: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0a20: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0a30: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0a40: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0a50: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0a60: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0a70: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0a80: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
0a90: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
0aa0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
0ab0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0ac0: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0ad0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0ae0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0af0: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0b00: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0b10: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0b20: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0b30: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0b40: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0b50: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
0b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
0b70: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
0b80: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
0b90: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f   0 through 7..*/
0ba0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bb0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0bc0: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0bd0: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0be0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0bf0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0c00: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0c10: 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65  n */.  i16 iPare
0c20: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
0c30: 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61  * Disable pWC->a
0c40: 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74  [iParent] when t
0c50: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0c60: 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43  d */.  i16 leftC
0c70: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0c80: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0c90: 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20  of X in "X <op> 
0ca0: 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36  <expr>" */.  i16
0cb0: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
0cc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0cd0: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0ce0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0cf0: 0a 20 20 75 31 36 20 6f 70 65 72 61 74 6f 72 3b  .  u16 operator;
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
0d20: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
0d30: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20           /* Bit 
0d50: 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f  flags.  See belo
0d60: 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64  w */.  u8 nChild
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0d80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  * Number of chil
0d90: 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64  dren that must d
0da0: 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57  isable us */.  W
0db0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c         /* The cl
0dd0: 61 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69  ause this term i
0de0: 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42  s part of */.  B
0df0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67  itmask prereqRig
0e00: 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ht;    /* Bitmas
0e10: 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  k of tables used
0e20: 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20   by pRight */.  
0e30: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
0e40: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
0e50: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
0e60: 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a  erenced by p */.
0e70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
0e80: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
0e90: 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23  eTerm.flags.*/.#
0ea0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
0eb0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
0ec0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
0ed0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ee0: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
0ef0: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
0f00: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
0f10: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
0f20: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
0f30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f40: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
0f50: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
0f60: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
0f70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f80: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
0f90: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
0fa0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
0fb0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31  M_OR_OK      0x1
0fc0: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
0fd0: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
0fe0: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
0ff0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1010: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1020: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1030: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1040: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1050: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1060: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1070: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1080: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1090: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
10a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
10b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
10c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
10d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
10e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10f0: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
1100: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
1110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1120: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1130: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
1140: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
1150: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
1160: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
1170: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
1180: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1190: 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20  m aStatic[10];  
11a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
11b0: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
11c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
11e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
11f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1200: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1210: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1220: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1230: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1240: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1250: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1260: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1270: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1280: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1290: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
12a0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
12b0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
12c0: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
12d0: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
12e0: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
12f0: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1310: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1320: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1330: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1340: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1350: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1360: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1370: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1380: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1390: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
13a0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
13b0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
13c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
13d0: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
13e0: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
13f0: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1400: 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65  ** If ExprMaskSe
1410: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
1420: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
1430: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
1440: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
1450: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
1460: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
1470: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
1480: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
1490: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
14a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
14c0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
14d0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
14e0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
14f0: 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d   Then the  ExprM
1500: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
1510: 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68  .** would map th
1520: 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ose cursor numbe
1530: 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74  rs into bits 0 t
1540: 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20  hrough 5..**.** 
1550: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  Note that the ma
1560: 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  pping is not nec
1570: 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64  essarily ordered
1580: 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  .  In the exampl
1590: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20  e.** above, the 
15a0: 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f  mapping might go
15b0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e   like this:  4->
15c0: 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32  3, 5->1, 8->2, 2
15d0: 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20  9->0,.** 57->5, 
15e0: 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f  73->4.  Or one o
15f0: 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62  f 719 other comb
1600: 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62  inations might b
1610: 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f  e used. It.** do
1620: 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61  es not really ma
1630: 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69  tter.  What is i
1640: 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74  mportant is that
1650: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a   sparse cursor.*
1660: 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65  * numbers all ge
1670: 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69  t mapped into bi
1680: 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62  t numbers that b
1690: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
16a0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61  contain.** no ga
16b0: 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ps..*/.typedef s
16c0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16d0: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73  t ExprMaskSet;.s
16e0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16f0: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1720: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1730: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1740: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
1750: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
1760: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1770: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
1780: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
1790: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
17a0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
17b0: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
17c0: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
17d0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
17e0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
17f0: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1800: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1810: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1820: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1830: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1840: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
1850: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
1860: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
1870: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
1880: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
1890: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
18a0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
18b0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
18c0: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
18d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
18e0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18f0: 45 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a  E-TK_EQ))../*.**
1900: 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73   Value for flags
1910: 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73   returned by bes
1920: 74 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66  tIndex().*/.#def
1930: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1940: 45 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20  EQ       0x0001 
1950: 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20    /* rowid=EXPR 
1960: 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  or rowid IN (...
1970: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
1980: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20  RE_ROWID_RANGE  
1990: 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f    0x0002   /* ro
19a0: 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  wid<EXPR and/or 
19b0: 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64  rowid>EXPR */.#d
19c0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
19d0: 4d 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31  MN_EQ      0x001
19e0: 30 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72  0   /* x=EXPR or
19f0: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
1a00: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1a10: 55 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30  UMN_RANGE   0x00
1a20: 32 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  20   /* x<EXPR a
1a30: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
1a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
1a50: 4c 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30  LUMN_IN      0x0
1a60: 30 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e  040   /* x IN (.
1a70: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
1a80: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20  HERE_TOP_LIMIT  
1a90: 20 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20      0x0100   /* 
1aa0: 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50  x<EXPR or x<=EXP
1ab0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1ac0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54  #define WHERE_BT
1ad0: 4d 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30  M_LIMIT      0x0
1ae0: 32 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20  200   /* x>EXPR 
1af0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
1b00: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
1b10: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1b20: 20 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f        0x0800   /
1b30: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
1b40: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
1b50: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f  .#define WHERE_O
1b60: 52 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78  RDERBY        0x
1b70: 31 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74  1000   /* Output
1b80: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
1b90: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
1ba0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1bb0: 45 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78  EVERSE        0x
1bc0: 32 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69  2000   /* Scan i
1bd0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1bf0: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20  _UNIQUE         
1c00: 30 78 34 30 30 30 20 20 20 2f 2a 20 53 65 6c 65  0x4000   /* Sele
1c10: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
1c20: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a   one row */../*.
1c30: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1c40: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1c50: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1c60: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1c70: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1c80: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
1c90: 70 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72  pWC, Parse *pPar
1ca0: 73 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  se){.  pWC->pPar
1cb0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
1cc0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
1cd0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52   pWC->nSlot = AR
1ce0: 52 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74  RAYSIZE(pWC->aSt
1cf0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
1d00: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
1d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
1d20: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1d30: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1d40: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1d50: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1d60: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1d70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d80: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1d90: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1da0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1db0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1dc0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
1dd0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
1de0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
1df0: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
1e00: 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69  m-1, a=pWC->a; i
1e10: 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a  >=0; i--, a++){.
1e20: 20 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73      if( a->flags
1e30: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
1e40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e50: 45 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45  ExprDelete(a->pE
1e60: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
1e70: 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57    if( pWC->a!=pW
1e80: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
1e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 43    sqliteFree(pWC
1ea0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
1eb0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
1ec0: 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72  ries to the Wher
1ed0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1ee0: 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65  e.  Increase the
1ef0: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70   allocated.** sp
1f00: 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  ace as necessary
1f10: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
1f20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1f30: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
1f40: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
1f50: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
1f60: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
1f70: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
1f80: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
1f90: 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a 2a 20  alided after.** 
1fa0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1fb0: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
1fc0: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
1fd0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
1fe0: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
1ff0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
2000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2010: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
2040: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
2050: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
2060: 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43 2d   idx;.  if( pWC-
2070: 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c  >nTerm>=pWC->nSl
2080: 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54  ot ){.    WhereT
2090: 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d  erm *pOld = pWC-
20a0: 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  >a;.    pWC->a =
20b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
20c0: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
20d0: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
20e0: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
20f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2100: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
2110: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
2120: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
2130: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
2140: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
2150: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2160: 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20  eFree(pOld);.   
2170: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
2180: 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54  t *= 2;.  }.  pT
2190: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
21a0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  x = pWC->nTerm];
21b0: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b  .  pWC->nTerm++;
21c0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
21d0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c  = p;.  pTerm->fl
21e0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
21f0: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
2200: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
2210: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2220: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
2230: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
2240: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
2250: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
2260: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
2270: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
2280: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
2290: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
22a0: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
22b0: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
22c0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22d0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
22e0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
22f0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
2300: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
2310: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
2320: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
2330: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2340: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
2350: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
2360: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
2370: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
2380: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
2390: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
23a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
23b0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23c0: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
23d0: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
23e0: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
23f0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2400: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
2410: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
2420: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
2430: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
2440: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
2450: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
2460: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
2470: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
2480: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
2490: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
24a0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
24b0: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
24c0: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
24d0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
24e0: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
24f0: 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67  y.  This array g
2500: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
2510: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2520: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2530: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2540: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2550: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
2560: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
2570: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
2580: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
2590: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
25a0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
25b0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
25c0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
25d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
25e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
25f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
2600: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
2610: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2620: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
2630: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2640: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
2650: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
2660: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
2670: 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20  t(P)  memset(P, 
2680: 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a  0, sizeof(*P))..
2690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26a0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
26b0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
26c0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
26d0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
26e0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2700: 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d  sk getMask(ExprM
2710: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2720: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
2730: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2740: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
2750: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
2760: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
2770: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
2780: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
2790: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
27a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
27c0: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
27d0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
27e0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
27f0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
2800: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2810: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
2820: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
2830: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2840: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2850: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
2860: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2870: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
2880: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
2890: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
28a0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
28b0: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
28c0: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
28d0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
28e0: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
28f0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2900: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
2910: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
2920: 52 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65  RRAYSIZE(pMaskSe
2930: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
2940: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
2950: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
2960: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2970: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
2980: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
2990: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
29a0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
29b0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
29c0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
29d0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
29e0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
29f0: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
2a00: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
2a10: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
2a20: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2a30: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
2a40: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
2a50: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70  voked sqlite3Exp
2a60: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2a70: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2a80: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
2a90: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
2aa0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
2ab0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ac0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
2ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2ae0: 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  lveNames() routi
2af0: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
2b00: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
2b10: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
2b20: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
2b30: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
2b40: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
2b50: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
2b60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
2b70: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
2b80: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
2b90: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
2ba0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2bb0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
2bc0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
2bd0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
2be0: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
2bf0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2c00: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2c10: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
2c20: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
2c30: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
2c40: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
2c50: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65  ExprMaskSet*, Se
2c60: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
2c70: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
2c80: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2c90: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2ca0: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
2cb0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
2cc0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
2cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
2ce0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
2cf0: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
2d00: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
2d10: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
2d20: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
2d30: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
2d40: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
2d50: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
2d60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2d70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2d80: 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  eft);.  mask |= 
2d90: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2da0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
2db0: 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pList);.  mask |
2dc0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
2dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2de0: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
2df0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
2e00: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2e10: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2e20: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2e30: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
2e40: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2e50: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
2e60: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
2e70: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
2e80: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2e90: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
2ea0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2eb0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2ec0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2ed0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2ee0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
2ef0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2f00: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2f10: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
2f20: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
2f30: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
2f40: 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d   mask;.  if( pS=
2f50: 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  =0 ){.    mask =
2f60: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2f70: 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74   mask = exprList
2f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2f90: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
2fa0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
2fb0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2fc0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2fd0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
2fe0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
2ff0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3000: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
3010: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3020: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3030: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
3040: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
3050: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3060: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
3070: 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ving);.  }.  ret
3080: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
3090: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
30a0: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
30b0: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
30c0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
30d0: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
30e0: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
30f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3100: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
3110: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
3120: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
3130: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64   "<=", ">=", and
3140: 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "IN"..*/.static
3150: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
3160: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
3170: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
3180: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
3190: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
31a0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
31b0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
31c0: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
31d0: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
31e0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
31f0: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
3200: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
3210: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
3220: 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f  op<=TK_GE);.}../
3230: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
3240: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 2e  jects of type T.
3250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
3260: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
3270: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
3280: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
3290: 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f 70  a comparision op
32a0: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
32b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
32c0: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
32d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
32e0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74 61  "Y op X"..*/.sta
32f0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
3300: 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78 70 72  mute(Expr *pExpr
3310: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  ){.  assert( all
3320: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
3330: 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ) && pExpr->op!=
3340: 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28  TK_IN );.  SWAP(
3350: 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e  CollSeq*,pExpr->
3360: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45  pRight->pColl,pE
3370: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
3380: 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  l);.  SWAP(Expr*
3390: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
33a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
33b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
33c0: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
33d0: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
33e0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
33f0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
3400: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3410: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
3420: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3430: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
3440: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
3450: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
3460: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
3470: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
3480: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
3490: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
34a0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
34b0: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
34c0: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
34d0: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
34e0: 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61  c int operatorMa
34f0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  sk(int op){.  in
3500: 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t c;.  assert( a
3510: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
3520: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
3530: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
3540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3550: 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b   = WO_EQ<<(op-TK
3560: 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _EQ);.  }.  asse
3570: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
3580: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
3590: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
35a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
35b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
35c0: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
35d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
35e0: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
35f0: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
3600: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
3610: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3620: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3630: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3640: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3650: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
3660: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
3670: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
3680: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
3690: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
36a0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
36b0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
36c0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
36d0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
36e0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
36f0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
3700: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
3710: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
3720: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3730: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
3740: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
3750: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
3760: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
3770: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3780: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3790: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
37a0: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
37b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
37c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
37d0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
37e0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
37f0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3800: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3810: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
3820: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3830: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3840: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3850: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3860: 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u16 op,         
3870: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3880: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3890: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
38a0: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
38b0: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
38c0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
38d0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
38e0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
38f0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
3900: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
3910: 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  k;.  for(pTerm=p
3920: 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
3930: 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65  erm; k; k--, pTe
3940: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
3950: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
3960: 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26  ==iCur.       &&
3970: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
3980: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3990: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
39a0: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  erm->leftColumn=
39b0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
39c0: 26 26 20 28 70 54 65 72 6d 2d 3e 6f 70 65 72 61  && (pTerm->opera
39d0: 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20  tor & op)!=0.   
39e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
39f0: 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20 29 7b  ur>=0 && pIdx ){
3a00: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
3a10: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3a20: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
3a30: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
3a40: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20    char idxaff;. 
3a50: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
3a60: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
3a70: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
3a80: 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61  e;..        idxa
3a90: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
3aa0: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
3ab0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
3ac0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
3ad0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
3ae0: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
3af0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
3b00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
3b10: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3b20: 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  , pX->pLeft);.  
3b30: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
3b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3b50: 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b 0a  ( pX->pRight ){.
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3b70: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3b80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
3b90: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
3ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3bb0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3bd0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
3be0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
3bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3c00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
3c10: 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
3c20: 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  n && pIdx->aiCol
3c30: 75 6d 6e 5b 6b 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[k]!=iColumn;
3c40: 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   k++){}.        
3c50: 61 73 73 65 72 74 28 20 6b 3c 70 49 64 78 2d 3e  assert( k<pIdx->
3c60: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
3c70: 20 20 20 69 66 28 20 70 43 6f 6c 6c 21 3d 70 49     if( pColl!=pI
3c80: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
3c90: 6c 5b 6b 5d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  l[k] ) continue;
3ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
3cb0: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
3cc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3cd0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
3ce0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3cf0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
3d00: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
3d10: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57 68  ExprMaskSet*, Wh
3d20: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
3d30: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
3d40: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
3d50: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
3d60: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a  E clause.  .**.*
3d70: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
3d80: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
3d90: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
3da0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
3db0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3dc0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
3dd0: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20  *pMaskSet,   /* 
3de0: 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  table masks */. 
3df0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3e00: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
3e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
3e20: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
3e30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
3e40: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
3e50: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3e60: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
3e70: 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65 74  abList, pMaskSet
3e80: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
3e90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3ea0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
3eb0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
3ec0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
3ed0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
3ee0: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
3ef0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
3f00: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
3f10: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
3f20: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
3f30: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
3f40: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
3f50: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
3f60: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
3f70: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
3f80: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
3f90: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
3fa0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
3fb0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
3fc0: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
3fd0: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
3fe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3ff0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73  sLikeOrGlob(.  s
4000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
4010: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
4020: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4030: 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  r,      /* Test 
4040: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
4050: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74  */.  int *pnPatt
4060: 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ern,   /* Number
4070: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
4080: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
4090: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  rs */.  int *pis
40a0: 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75  Complete  /* Tru
40b0: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
40c0: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
40d0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
40e0: 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  r */.){.  const 
40f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20  char *z;.  Expr 
4100: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
4110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4120: 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74  st;.  int c, cnt
4130: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
4140: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20    char wc[3];.  
4150: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
4160: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
4170: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
4180: 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65  , pExpr, &noCase
4190: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
41a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
41b0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
41c0: 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  t;.  pRight = pL
41d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
41e0: 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f  .  if( pRight->o
41f0: 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
4200: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4210: 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  }.  pLeft = pLis
4220: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
4230: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
4240: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
4250: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4260: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
4270: 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f  pColl;.  if( pCo
4280: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  ll==0 ){.    pCo
4290: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
42a0: 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ll;.  }.  if( (p
42b0: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
42c0: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c  TE_COLL_BINARY |
42d0: 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20  | noCase) &&.   
42e0: 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21     (pColl->type!
42f0: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43  =SQLITE_COLL_NOC
4300: 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20  ASE || !noCase) 
4310: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4320: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
4330: 71 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74  quoteExpr(pRight
4340: 29 3b 0a 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  );.  z = pRight-
4350: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f 72 28  >token.z;.  for(
4360: 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e 74 5d  cnt=0; (c=z[cnt]
4370: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
4380: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
4390: 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b 2b 29  c!=wc[2]; cnt++)
43a0: 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  {}.  if( cnt==0 
43b0: 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e  || 255==(u8)z[cn
43c0: 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t] ){.    return
43d0: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f   0;.  }.  *pisCo
43e0: 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d  mplete = z[cnt]=
43f0: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
4400: 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74  1]==0;.  *pnPatt
4410: 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74  ern = cnt;.  ret
4420: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
4430: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
4440: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
4450: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69   */../*.** The i
4460: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
4470: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
4480: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
4490: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
44a0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
44b0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
44c0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
44d0: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
44e0: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
44f0: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
4500: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
4510: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
4520: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
4530: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
4540: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4550: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
4560: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
4570: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
4580: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
4590: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
45a0: 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68   <expr>".  If th
45b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
45c0: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
45d0: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
45e0: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
45f0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
4600: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65  he original.** e
4610: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
4620: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
4630: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73   virtual express
4640: 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ion of the form.
4650: 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  ** "Y <op> X" is
4660: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
4670: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61  ERE clause and a
4680: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
4690: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
46a0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
46b0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
46d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
46e0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
46f0: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a  *pMaskSet,    /*
4700: 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a   table masks */.
4710: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
4720: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
4730: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4740: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4760: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
4770: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
4780: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
4790: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
47a0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
47b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
47c0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
47d0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
47e0: 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72  ft;.  Bitmask pr
47f0: 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 6e  ereqAll;.  int n
4800: 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69  Pattern;.  int i
4810: 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20 69 66  sComplete;..  if
4820: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
4830: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
4840: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
4850: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4860: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
4870: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4880: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
4890: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
48b0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  );.    pTerm->pr
48c0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
48d0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
48e0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
48f0: 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20  pList).         
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   | exprSelectTab
4920: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4930: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
4940: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4950: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4960: 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ht = exprTableUs
4970: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
4980: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
4990: 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20  }.  prereqAll = 
49a0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
49b0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b  MaskSet, pExpr);
49c0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
49d0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
49e0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
49f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67    prereqAll |= g
4a00: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
4a10: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
4a20: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  inTable);.  }.  
4a30: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
4a40: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
4a50: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4a60: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
4a70: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
4a80: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
4a90: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
4aa0: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4ab0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
4ac0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
4ad0: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
4ae0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
4af0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
4b00: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4b10: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4b20: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
4b30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4b40: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
4b50: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
4b60: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
4b70: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
4b80: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
4b90: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6f 70  .      pTerm->op
4ba0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
4bb0: 72 4d 61 73 6b 28 70 45 78 70 72 2d 3e 6f 70 29  rMask(pExpr->op)
4bc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4bd0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
4be0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4bf0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
4c00: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
4c10: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
4c20: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4c30: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
4c40: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
4c50: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
4c60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4c70: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4c80: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
4c90: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
4ca0: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
4cb0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
4cc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
4cd0: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
4ce0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
4cf0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
4d00: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
4d10: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
4d20: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
4d30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
4d40: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
4d50: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
4d60: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
4d70: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
4d80: 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IED;.      }else
4d90: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
4da0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
4db0: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
4dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
4dd0: 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20  Commute(pDup);. 
4de0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75       pLeft = pDu
4df0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
4e00: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
4e10: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
4e20: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
4e30: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
4e40: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4e50: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
4e60: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b  ht = prereqLeft;
4e70: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
4e80: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
4e90: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
4ea0: 6f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  operator = opera
4eb0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
4ec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
4ed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4ee0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
4ef0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
4f00: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
4f10: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
4f20: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
4f30: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
4f40: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
4f50: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
4f60: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
4f70: 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ts..  */.  else 
4f80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
4f90: 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20  K_BETWEEN ){.   
4fa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
4fb0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
4fc0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4fd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
4fe0: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
4ff0: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
5000: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
5010: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
5020: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
5030: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
5040: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
5050: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
5060: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
5070: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
5080: 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 73 5b  sqlite3Expr(ops[
5090: 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  i], sqlite3ExprD
50a0: 75 70 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  up(pExpr->pLeft)
50b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
50d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c  qlite3ExprDup(pL
50e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
50f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
5100: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
5110: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
5120: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
5130: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
5140: 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c  ;.      exprAnal
5150: 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53  yze(pSrc, pMaskS
5160: 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  et, pWC, idxNew)
5170: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
5180: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
5190: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
51a0: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
51b0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
51c0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
51d0: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
51e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
51f0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
5200: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
5210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
5220: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
5230: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
5240: 6e 76 65 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  nvert OR-connect
5250: 65 64 20 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e  ed terms into an
5260: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
5270: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 63  that.  ** they c
5280: 61 6e 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 69  an make use of i
5290: 6e 64 69 63 65 73 2e 20 20 45 78 61 6d 70 6c 65  ndices.  Example
52a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
52b0: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
52c0: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
52d0: 20 3d 20 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20   = expr3.  **.  
52e0: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
52f0: 69 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  into.  **.  **  
5300: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
5310: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 20 20 2a  expr2,expr3).  *
5320: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
5330: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
5340: 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20  .    int ok;.   
5350: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69   int i, j;.    i
5360: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72  nt iColumn, iCur
5370: 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c  sor;.    WhereCl
5380: 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68  ause sOr;.    Wh
5390: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
53a0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
53b0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
53c0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20  ERM_DYNAMIC)==0 
53d0: 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  );.    whereClau
53e0: 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57 43  seInit(&sOr, pWC
53f0: 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20 20 77  ->pParse);.    w
5400: 68 65 72 65 53 70 6c 69 74 28 26 73 4f 72 2c 20  hereSplit(&sOr, 
5410: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
5420: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c     exprAnalyzeAl
5430: 6c 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74  l(pSrc, pMaskSet
5440: 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73 73  , &sOr);.    ass
5450: 65 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 30  ert( sOr.nTerm>0
5460: 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
5470: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 43 6f     do{.      iCo
5480: 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  lumn = sOr.a[j].
5490: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
54a0: 20 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e    iCursor = sOr.
54b0: 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b  a[j].leftCursor;
54c0: 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75 72  .      ok = iCur
54d0: 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f  sor>=0;.      fo
54e0: 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c  r(i=sOr.nTerm-1,
54f0: 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20   pOrTerm=sOr.a; 
5500: 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c  i>=0 && ok; i--,
5510: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
5520: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
5530: 2d 3e 6f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45  ->operator!=WO_E
5540: 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  Q ){.          g
5550: 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69  oto or_not_possi
5560: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ble;.        }. 
5570: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
5580: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
5590: 69 43 75 72 73 6f 72 20 26 26 20 70 4f 72 54 65  iCursor && pOrTe
55a0: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  rm->leftColumn==
55b0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
55c0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
55d0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
55e0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
55f0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66   if( (pOrTerm->f
5600: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
5610: 45 44 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ED)!=0 ||.      
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
5630: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5640: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
5650: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
5660: 20 20 20 20 20 20 20 20 20 20 28 73 4f 72 2e 61            (sOr.a
5670: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
5680: 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  t].flags & TERM_
5690: 4f 52 5f 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20  OR_OK)!=0) ){.  
56a0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
56b0: 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  >flags &= ~TERM_
56c0: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
56d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
56e0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ok = 0;.        
56f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
5700: 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f  hile( !ok && (sO
5710: 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26  r.a[j++].flags &
5720: 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30   TERM_COPIED)!=0
5730: 20 26 26 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20   && j<sOr.nTerm 
5740: 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20 29 7b  );.    if( ok ){
5750: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
5760: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pList = 0;.    
5770: 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70    Expr *pNew, *p
5780: 44 75 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Dup;.      for(i
5790: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
57a0: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
57b0: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
57c0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
57d0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
57e0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
57f0: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
5800: 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e;.        pDup 
5810: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5820: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
5830: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
5840: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5850: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5860: 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b  pList, pDup, 0);
5870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5880: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
5890: 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  r(TK_COLUMN, 0, 
58a0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
58b0: 20 70 44 75 70 20 29 7b 0a 20 20 20 20 20 20 20   pDup ){.       
58c0: 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20   pDup->iTable = 
58d0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
58e0: 20 70 44 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pDup->iColumn =
58f0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20   iColumn;.      
5900: 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  }.      pNew = s
5910: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
5920: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
5930: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
5940: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
5950: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
5960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5980: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
5990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
59a0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Term->pExpr = pN
59b0: 65 77 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  ew;.      pTerm-
59c0: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 44  >flags |= TERM_D
59d0: 59 4e 41 4d 49 43 3b 0a 20 20 20 20 20 20 65 78  YNAMIC;.      ex
59e0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
59f0: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69  pMaskSet, pWC, i
5a00: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70  dxTerm);.      p
5a10: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5a20: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 7d 0a 6f  dxTerm];.    }.o
5a30: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a  r_not_possible:.
5a40: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
5a50: 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a  lear(&sOr);.  }.
5a60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5a70: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
5a80: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
5a90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
5aa0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
5ab0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
5ac0: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
5ad0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
5ae0: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
5af0: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
5b00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
5b10: 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50  keOrGlob(pWC->pP
5b20: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
5b30: 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43   &nPattern, &isC
5b40: 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20  omplete) ){.    
5b50: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52  Expr *pLeft, *pR
5b60: 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  ight;.    Expr *
5b70: 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20  pStr1, *pStr2;. 
5b80: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
5b90: 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  r1, *pNewExpr2;.
5ba0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c      int idxNew1,
5bb0: 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70   idxNew2;..    p
5bc0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
5bd0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
5be0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
5bf0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
5c00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
5c10: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  1 = sqlite3Expr(
5c20: 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  TK_STRING, 0, 0,
5c30: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
5c40: 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r1 ){.      sqli
5c50: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53  te3TokenCopy(&pS
5c60: 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69  tr1->token, &pRi
5c70: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
5c80: 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e     pStr1->token.
5c90: 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  n = nPattern;.  
5ca0: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
5cb0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5cc0: 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  Str1);.    if( p
5cd0: 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73  Str2 ){.      as
5ce0: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
5cf0: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
5d00: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
5d10: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
5d20: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
5d30: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
5d40: 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71  e3Expr(TK_GE, sq
5d50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
5d60: 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  ft), pStr1, 0);.
5d70: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
5d80: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5d90: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
5da0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
5db0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
5dc0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
5dd0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
5de0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
5df0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
5e00: 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71  e3Expr(TK_LT, sq
5e10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
5e20: 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a  ft), pStr2, 0);.
5e30: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
5e40: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5e50: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
5e60: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
5e70: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
5e80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
5e90: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
5ea0: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
5eb0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5ec0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
5ed0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
5ee0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5ef0: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
5f00: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
5f10: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
5f20: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
5f30: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
5f40: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
5f50: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5f60: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5f70: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d  PTIMIZATION */.}
5f80: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
5f90: 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66  utine decides if
5fa0: 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
5fb0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
5fc0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
5fd0: 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c  use.  If it can,
5fe0: 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20   it returns 1.  
5ff0: 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73  If pIdx cannot s
6000: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52  atisfy the.** OR
6010: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
6020: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6030: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72  rns 0..**.** pOr
6040: 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45  derBy is an ORDE
6050: 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
6060: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
6070: 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68  ent.  pTab is th
6080: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
6090: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
60a0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
60b0: 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74  same SELECT stat
60c0: 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ement and.** the
60d0: 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72   table has a cur
60e0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
60f0: 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61  ase".  pIdx is a
6100: 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e  n index on pTab.
6110: 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73  .**.** nEqCol is
6120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6130: 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74  olumns of pIdx t
6140: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
6150: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
6160: 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66  traints.  Any of
6170: 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   these columns m
6180: 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72  ay be missing fr
6190: 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  om the ORDER BY.
61a0: 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  ** clause and th
61b0: 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c  e match can stil
61c0: 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a  l be a success..
61d0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20  **.** All terms 
61e0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
61f0: 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e  that match again
6200: 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  st the index mus
6210: 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41  t be either.** A
6220: 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65  SC or DESC.  (Te
6230: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6240: 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20   BY clause past 
6250: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49  the end of a UNI
6260: 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20  QUE.** index do 
6270: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69  not need to sati
6280: 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61  sfy this constra
6290: 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65  int.)  The *pbRe
62a0: 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  v value is.** se
62b0: 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52  t to 1 if the OR
62c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
62d0: 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74   all DESC and it
62e0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a   is set to 0 if.
62f0: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
6300: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53  clause is all AS
6310: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  C..*/.static int
6320: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
6330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6340: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
6350: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6360: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
6370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6380: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
6390: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c  esting */.  Tabl
63a0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
63b0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
63c0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
63d0: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
63e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
63f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
6400: 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pTab */.  ExprLi
6410: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
6420: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
6430: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
6440: 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20  t nEqCol,       
6450: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6460: 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  of index columns
6470: 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61   with == constra
6480: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ints */.  int *p
6490: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
64a0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
64b0: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
64c0: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
64d0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
64e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
64f0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
6500: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
6510: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 20 20  SQLITE_SO_ASC;  
6520: 2f 2a 20 57 68 69 63 68 20 64 69 72 65 63 74 69  /* Which directi
6530: 6f 6e 20 77 65 20 61 72 65 20 73 6f 72 74 69 6e  on we are sortin
6540: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  g */.  int nTerm
6550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6560: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6570: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
6580: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
6590: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
65a0: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
65b0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
65c0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
65d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
65e0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
65f0: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
6600: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
6610: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
6620: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
6630: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
6640: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6650: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
6660: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
6670: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
6680: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
6690: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
66a0: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
66b0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
66c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
66d0: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
66e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
66f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
6700: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
6710: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
6720: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
6730: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
6740: 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d   */..    pExpr =
6750: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
6760: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
6770: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
6780: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61  Expr->iTable!=ba
6790: 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  se ){.      /* C
67a0: 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  an not use an in
67b0: 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74  dex sort on anyt
67c0: 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  hing that is not
67d0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
67e0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d  .      ** left-m
67f0: 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ost table of the
6800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6820: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
6830: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6840: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
6850: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
6860: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
6870: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6880: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
6890: 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn!=pIdx->aiCol
68a0: 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f 6c 6c 21  umn[i] || pColl!
68b0: 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  =pIdx->keyInfo.a
68c0: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
68d0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
68e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
68f0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
6900: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
6910: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
6920: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
6930: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6940: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
6950: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
6960: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
6970: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
6980: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
6990: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
69a0: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
69b0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
69c0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
69d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
69e0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
69f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
6a00: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
6a10: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
6a20: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
6a30: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
6a40: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
6a50: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
6a60: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
6a70: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
6a80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
6a90: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
6aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6ab0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
6ac0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74   if( pTerm->sort
6ad0: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
6ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
6af0: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
6b00: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
6b10: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
6b20: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
6b30: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
6b40: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
6b50: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
6b60: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
6b70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
6b80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6b90: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 54 65   sortOrder = pTe
6ba0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
6bb0: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
6bc0: 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    pTerm++;.  }..
6bd0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
6be0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
6bf0: 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74 65  orting if all te
6c00: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6c10: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
6c20: 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20 20 2a  are covered..  *
6c30: 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d  /.  if( j>=nTerm
6c40: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
6c50: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
6c60: 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 20 20  TE_SO_DESC;.    
6c70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6c80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6c90: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
6ca0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
6cb0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
6cc0: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
6cd0: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
6ce0: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
6cf0: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
6d00: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
6d10: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
6d20: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
6d30: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
6d40: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
6d50: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
6d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
6d70: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
6d80: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
6d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
6da0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
6db0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
6dc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6dd0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
6de0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
6df0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ause */.  int *p
6e00: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
6e10: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
6e20: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
6e30: 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  C */.){.  Expr *
6e40: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p;..  assert( pO
6e50: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
6e60: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
6e70: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20  >nExpr>0 );.  p 
6e80: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
6e90: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4f  .pExpr;.  if( pO
6ea0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
6eb0: 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
6ec0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
6ed0: 65 3d 3d 62 61 73 65 0a 20 20 20 20 20 20 20 20  e==base.        
6ee0: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
6ef0: 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  =-1 ){.    *pbRe
6f00: 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  v = pOrderBy->a[
6f10: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
6f20: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
6f30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6f40: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
6f50: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
6f60: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
6f70: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
6f80: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
6f90: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
6fa0: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
6fb0: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
6fc0: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
6fd0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
6fe0: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  orming operating
6ff0: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
7000: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
7010: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
7020: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
7030: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
7040: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
7050: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
7060: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
7070: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
7080: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
7090: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 2e 30 3b  uble logN = 1.0;
70a0: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
70b0: 2e 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78  .0;.  while( N>x
70c0: 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20   ){.    logN += 
70d0: 31 2e 30 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  1.0;.    x *= 10
70e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
70f0: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ogN;.}../*.** Fi
7100: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  nd the best inde
7110: 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  x for accessing 
7120: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
7130: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
7140: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7150: 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61  index, flags tha
7160: 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74  t describe how t
7170: 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
7180: 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20  be used, the.** 
7190: 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
71a0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
71b0: 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66  and the "cost" f
71c0: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a  or this index..*
71d0: 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
71e0: 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e  cost index wins.
71f0: 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
7200: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
7210: 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
7220: 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
7230: 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
7240: 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
7250: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
7260: 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  dex..** Factors 
7270: 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
7280: 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
7290: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
72a0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
72b0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
72c0: 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
72d0: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
72e0: 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
72f0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
7300: 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
7310: 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
7320: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
7330: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
7340: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
7350: 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
7360: 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
7370: 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
7380: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  able..**.*/.stat
7390: 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e  ic double bestIn
73a0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
73b0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
73c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
73d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
73e0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
73f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7400: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7410: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7420: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
7430: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
7440: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
7450: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
7460: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
7470: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
7480: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
7490: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
74a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
74b0: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
74c0: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
74d0: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
74e0: 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20  **ppIndex,      
74f0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70        /* Make *p
7500: 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20  pIndex point to 
7510: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a  the best index *
7520: 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  /.  int *pFlags,
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73  /* Put flags des
7550: 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f  cribing this cho
7560: 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a  ice in *pFlags *
7570: 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20  /.  int *pnEq   
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65  /* Put the numbe
75a0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
75b0: 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a  nstraints here *
75c0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
75d0: 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78   *pTerm;.  Index
75e0: 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20   *bestIdx = 0;  
75f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
7600: 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c  that gives the l
7610: 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20  owest cost */.  
7620: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
7630: 74 20 3d 20 31 2e 30 65 39 39 3b 20 2f 2a 20 54  t = 1.0e99; /* T
7640: 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
7650: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
7660: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7680: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
7690: 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20  th bestIdx */.  
76a0: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
76c0: 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45  est value for nE
76d0: 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  q */.  int iCur 
76e0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
76f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
7700: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
7710: 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
7720: 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7740: 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
7750: 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
7760: 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7780: 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
7790: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
77a0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
77c0: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
77d0: 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a  ed with pProbe *
77e0: 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  /.  int nEq;    
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
7810: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7820: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
7830: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
7840: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
7850: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
7860: 20 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64   TRACE(("bestInd
7870: 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65  ex: tbl=%s notRe
7880: 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d  ady=%x\n", pSrc-
7890: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f  >pTab->zName, no
78a0: 74 52 65 61 64 79 29 29 3b 0a 0a 20 20 2f 2a 20  tReady));..  /* 
78b0: 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69  Check for a rowi
78c0: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
78d0: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
78e0: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72  ints.  */.  pTer
78f0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
7900: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
7910: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
7920: 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  N, 0);.  if( pTe
7930: 72 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  rm ){.    Expr *
7940: 70 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e  pExpr;.    *ppIn
7950: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73  dex = 0;.    bes
7960: 74 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  tFlags = WHERE_R
7970: 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28  OWID_EQ;.    if(
7980: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
7990: 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20   & WO_EQ ){.    
79a0: 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20    /* Rowid== is 
79b0: 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20  always the best 
79c0: 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66  pick.  Look no f
79d0: 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65  urther.  Because
79e0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61   only.      ** a
79f0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
7a00: 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
7a10: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
7a20: 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
7a30: 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48      *pFlags = WH
7a40: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57  ERE_ROWID_EQ | W
7a50: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
7a60: 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20     *pnEq = 1;.  
7a70: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
7a80: 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22  best is rowid\n"
7a90: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
7aa0: 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   0.0;.    }else 
7ab0: 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65  if( (pExpr = pTe
7ac0: 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73  rm->pExpr)->pLis
7ad0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t!=0 ){.      /*
7ae0: 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29   Rowid IN (LIST)
7af0: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
7b00: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
7b10: 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20  umber of list.  
7b20: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
7b30: 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73    */.      lowes
7b40: 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  tCost = pExpr->p
7b50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
7b60: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d     lowestCost *=
7b70: 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f   estLog(lowestCo
7b80: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
7b90: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
7ba0: 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74  N (SELECT): cost
7bb0: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
7bc0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
7bd0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
7be0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
7bf0: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
7c00: 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
7c10: 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
7c20: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
7c30: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
7c40: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
7c50: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
7c60: 32 30 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20  200.0;.    }.   
7c70: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77   TRACE(("... row
7c80: 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67  id IN cost: %.9g
7c90: 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29  \n", lowestCost)
7ca0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74  );.  }..  /* Est
7cb0: 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  imate the cost o
7cc0: 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20  f a table scan. 
7cd0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   If we do not kn
7ce0: 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a  ow how many.  **
7cf0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
7d00: 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31  the table, use 1
7d10: 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75   million as a gu
7d20: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 72 6f  ess..  */.  pPro
7d30: 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  be = pSrc->pTab-
7d40: 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f 73 74 20  >pIndex;.  cost 
7d50: 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62  = pProbe ? pProb
7d60: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a  e->aiRowEst[0] :
7d70: 20 31 30 30 30 30 30 30 2e 30 3b 0a 20 20 54 52   1000000.0;.  TR
7d80: 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20  ACE(("... table 
7d90: 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a 20  scan base cost: 
7da0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
7db0: 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  .  flags = WHERE
7dc0: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20  _ROWID_RANGE;.. 
7dd0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
7de0: 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72  nstraints on a r
7df0: 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69  ange of rowids i
7e00: 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  n a table scan..
7e10: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66    */.  pTerm = f
7e20: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
7e30: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
7e40: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
7e50: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
7e60: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
7e70: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
7e80: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
7e90: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
7ea0: 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  LE, 0) ){.      
7eb0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  flags |= WHERE_T
7ec0: 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
7ed0: 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 20 20  cost *= 0.333;  
7ee0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
7ef0: 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid<EXPR elimina
7f00: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
7f10: 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  r rows */.    }.
7f20: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
7f30: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
7f40: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
7f50: 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
7f60: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
7f70: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
7f80: 20 20 20 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33     cost *= 0.333
7f90: 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
7fa0: 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d   rowid>EXPR elim
7fb0: 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
7fc0: 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s of rows */.   
7fd0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
7fe0: 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72  .. rowid range r
7ff0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
8000: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
8010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
8020: 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gs = 0;.  }..  /
8030: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73  * If the table s
8040: 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  can does not sat
8050: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
8060: 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61  Y clause, increa
8070: 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74  se.  ** the cost
8080: 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76   by NlogN to cov
8090: 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f  er the expense o
80a0: 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  f sorting. */.  
80b0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
80c0: 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
80d0: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
80e0: 72 64 65 72 42 79 2c 20 26 72 65 76 29 20 29 7b  rderBy, &rev) ){
80f0: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
8100: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48  WHERE_ORDERBY|WH
8110: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
8120: 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29  .      if( rev )
8130: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
8140: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
8150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8160: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20  lse{.      cost 
8170: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
8180: 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ost);.      TRAC
8190: 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20  E(("... sorting 
81a0: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
81b0: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
81c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
81d0: 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  f( cost<lowestCo
81e0: 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74  st ){.    lowest
81f0: 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
8200: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
8210: 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  gs;.  }..  /* Lo
8220: 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65 78  ok at each index
8230: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70  ..  */.  for(; p
8240: 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
8250: 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
8260: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8280: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8290: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d  /.    double inM
82a0: 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 2e 30 3b  ultiplier = 1.0;
82b0: 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  ..    TRACE(("..
82c0: 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
82d0: 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
82e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
82f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
8300: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
8310: 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
8320: 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
8330: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
8340: 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  s or x IN (...) 
8350: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
8360: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
8370: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
8380: 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
8390: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
83a0: 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
83b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
83c0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
83d0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
83e0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
83f0: 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29 3b  |WO_IN, pProbe);
8400: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
8410: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8420: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8430: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
8440: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70     if( pTerm->op
8450: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
8460: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
8470: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
8480: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c  Expr;.        fl
8490: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
84a0: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
84b0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
84c0: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
84d0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
84e0: 2a 3d 20 31 30 30 2e 30 3b 0a 20 20 20 20 20 20  *= 100.0;.      
84f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
8500: 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20  r->pList!=0 ){. 
8510: 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
8520: 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e  plier *= pExpr->
8530: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31  pList->nExpr + 1
8540: 2e 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  .0;.        }.  
8550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8560: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  cost = pProbe->a
8570: 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
8580: 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c  ultiplier * estL
8590: 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
85a0: 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
85b0: 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
85c0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
85d0: 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
85e0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a  E_COLUMN_IN)==0.
85f0: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d           && nEq=
8600: 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
8610: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
8620: 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
8630: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
8640: 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64  (("...... nEq=%d
8650: 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73   inMult=%.9g cos
8660: 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c 20  t=%.9g\n", nEq, 
8670: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f  inMultiplier, co
8680: 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  st));..    /* Lo
8690: 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e  ok for range con
86a0: 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a  straints.    */.
86b0: 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f      if( nEq<pPro
86c0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
86d0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
86e0: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  obe->aiColumn[nE
86f0: 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  q];.      pTerm 
8700: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
8710: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
8720: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
8730: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f  O_GT|WO_GE, pPro
8740: 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  be);.      if( p
8750: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
8760: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
8770: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
8780: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
8790: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
87a0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
87b0: 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_LE, pProbe) )
87c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
87d0: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
87e0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
87f0: 63 6f 73 74 20 2a 3d 20 30 2e 33 33 33 3b 0a 20  cost *= 0.333;. 
8800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8810: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
8820: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
8830: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
8840: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
8850: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8860: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
8870: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
8880: 20 2a 3d 20 30 2e 33 33 33 3b 0a 20 20 20 20 20   *= 0.333;.     
8890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
88a0: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
88b0: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
88c0: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
88d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
88e0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
88f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
8900: 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
8910: 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
8920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8930: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8940: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
8950: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
8960: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
8970: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
8980: 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 70 53  pParse,pProbe,pS
8990: 72 63 2d 3e 70 54 61 62 2c 69 43 75 72 2c 70 4f  rc->pTab,iCur,pO
89a0: 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29  rderBy,nEq,&rev)
89b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
89c0: 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20  flags==0 ){.    
89d0: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
89e0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
89f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8a00: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8a10: 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
8a20: 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
8a30: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
8a40: 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
8a50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8a70: 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
8a80: 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
8a90: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
8aa0: 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
8ab0: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
8ac0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
8ad0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8ae0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
8af0: 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77  if we can get aw
8b00: 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75  ay with using ju
8b10: 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  st the index wit
8b20: 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72  hout.    ** ever
8b30: 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62   reading the tab
8b40: 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  le.  If that is 
8b50: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68  the case, then h
8b60: 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  alve the.    ** 
8b70: 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64  cost of this ind
8b80: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
8b90: 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63  f( flags && pSrc
8ba0: 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42  ->colUsed < (((B
8bb0: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
8bc0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74  1)) ){.      Bit
8bd0: 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
8be0: 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
8bf0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
8c00: 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; j<pProbe->nC
8c10: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
8c20: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72       int x = pPr
8c30: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  obe->aiColumn[j]
8c40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
8c50: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
8c60: 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
8c70: 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
8c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8c90: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
8ca0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8cb0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
8cc0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2a 3d  .        cost *=
8cd0: 20 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 54 52   0.5;.        TR
8ce0: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78  ACE(("...... idx
8cf0: 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f  -only reduces co
8d00: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
8d10: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
8d20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8d30: 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61  this index has a
8d40: 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65  chieved the lowe
8d50: 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20  st cost so far, 
8d60: 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20  then use it..   
8d70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74   */.    if( cost
8d80: 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b   < lowestCost ){
8d90: 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d  .      bestIdx =
8da0: 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c   pProbe;.      l
8db0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
8dc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8dd0: 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20  flags!=0 );.    
8de0: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c    bestFlags = fl
8df0: 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e  ags;.      bestN
8e00: 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a  Eq = nEq;.    }.
8e10: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
8e20: 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
8e30: 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78  .  */.  *ppIndex
8e40: 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54 52   = bestIdx;.  TR
8e50: 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
8e60: 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39   is %s, cost=%.9
8e70: 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71  g, flags=%x, nEq
8e80: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
8e90: 62 65 73 74 49 64 78 20 3f 20 62 65 73 74 49 64  bestIdx ? bestId
8ea0: 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e  x->zName : "(non
8eb0: 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c  e)", lowestCost,
8ec0: 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74   bestFlags, best
8ed0: 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73  NEq));.  *pFlags
8ee0: 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
8ef0: 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b  *pnEq = bestNEq;
8f00: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74  .  return lowest
8f10: 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cost;.}.../*.** 
8f20: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
8f30: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
8f40: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
8f50: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
8f60: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
8f70: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
8f80: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
8f90: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
8fa0: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
8fb0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
8fc0: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
8fd0: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
8fe0: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
8ff0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
9000: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
9010: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
9020: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
9030: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
9040: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
9050: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
9060: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
9070: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
9080: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
9090: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
90a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
90b0: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
90c0: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
90d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
90e0: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
90f0: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
9100: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
9110: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
9120: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
9130: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
9140: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
9150: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
9160: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
9170: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
9180: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
9190: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
91a0: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
91b0: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
91c0: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
91d0: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
91e0: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
91f0: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
9200: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
9210: 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
9220: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
9230: 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
9240: 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
9250: 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
9260: 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
9270: 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
9280: 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
9290: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
92a0: 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
92b0: 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
92c0: 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
92d0: 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
92e0: 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
92f0: 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
9300: 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
9310: 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
9320: 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
9330: 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
9340: 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
9350: 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
9360: 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
9370: 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
9380: 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
9390: 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
93a0: 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
93b0: 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
93c0: 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
93d0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
93e0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
93f0: 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
9400: 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
9410: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9420: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
9430: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
9440: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61  {.    pTerm->fla
9450: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
9460: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
9470: 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
9480: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
9490: 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
94a0: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
94b0: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
94c0: 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
94d0: 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
94e0: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
94f0: 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
9500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
9520: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 62  rate code that b
9530: 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66 6f  uilds a probe fo
9540: 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44 65 74  r an index.  Det
9550: 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ails:.**.**    *
9560: 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f 70 20    Check the top 
9570: 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20  nColumn entries 
9580: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  on the stack.  I
9590: 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f  f any.**       o
95a0: 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20  f those entries 
95b0: 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69  are NULL, jump i
95c0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 62 72  mmediately to br
95d0: 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63  k,.**       whic
95e0: 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20 65 78  h is the loop ex
95f0: 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64  it, since no ind
9600: 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61  ex entry will ma
9610: 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69 66 20  tch.**       if 
9620: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
9630: 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  key is NULL..**.
9640: 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72 75  **    *  Constru
9650: 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72 79  ct a probe entry
9660: 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e 43   from the top nC
9670: 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69 6e  olumn entries in
9680: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 74  .**       the st
9690: 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69 74  ack with affinit
96a0: 69 65 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  ies appropriate 
96b0: 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  for index pIdx..
96c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
96d0: 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 56  uildIndexProbe(V
96e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c  dbe *v, int nCol
96f0: 75 6d 6e 2c 20 69 6e 74 20 62 72 6b 2c 20 49 6e  umn, int brk, In
9700: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 73 71  dex *pIdx){.  sq
9710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9720: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e  , OP_NotNull, -n
9730: 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56  Column, sqlite3V
9740: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9750: 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+3);.  sqlite3V
9760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
9770: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
9780: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9790: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
97a0: 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74  0, brk);.  sqlit
97b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
97c0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
97d0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c  olumn, 0);.  sql
97e0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
97f0: 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d  yStr(v, pIdx);.}
9800: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
9810: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
9820: 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
9830: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
9840: 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
9850: 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
9860: 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
9870: 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
9880: 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
9890: 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
98a0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
98b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
98c0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
98d0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
98e0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
98f0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
9900: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
9910: 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
9920: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
9930: 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a  aluated and its.
9940: 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66  ** result is lef
9950: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  t on the stack. 
9960: 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   For constraints
9970: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
9980: 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20  N (...).** this 
9990: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
99a0: 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
99b0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   iterate over al
99c0: 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a  l values of X..*
99d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
99e0: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
99f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9a00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
9a10: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9a20: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
9a30: 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
9a40: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
9a50: 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
9a60: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20  d */.  int brk, 
9a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
9a80: 6d 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e 64  mp here to aband
9a90: 6f 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  on the loop */. 
9aa0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
9ab0: 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76  vel  /* When lev
9ac0: 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
9ad0: 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
9ae0: 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  king on */.){.  
9af0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
9b00: 2d 3e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ->pExpr;.  if( p
9b10: 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a  X->op!=TK_IN ){.
9b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
9b30: 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
9b40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9b50: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
9b60: 67 68 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ght);.#ifndef SQ
9b70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
9b80: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
9b90: 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 69 6e  int iTab;.    in
9ba0: 74 20 2a 61 49 6e 3b 0a 20 20 20 20 56 64 62 65  t *aIn;.    Vdbe
9bb0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
9bc0: 64 62 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  dbe;..    sqlite
9bd0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
9be0: 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20  Parse, pX);.    
9bf0: 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
9c00: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
9c10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
9c20: 77 69 6e 64 2c 20 69 54 61 62 2c 20 62 72 6b 29  wind, iTab, brk)
9c30: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
9c40: 74 28 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20  t((v, "# %.*s", 
9c50: 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e  pX->span.n, pX->
9c60: 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c  span.z));.    pL
9c70: 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20  evel->nIn++;.   
9c80: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f   sqlite3ReallocO
9c90: 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70  rFree((void**)&p
9ca0: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a  Level->aInLoop,.
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
9ce0: 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33 2a 70 4c  aInLoop[0])*3*pL
9cf0: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
9d00: 61 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49  aIn = pLevel->aI
9d10: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61  nLoop;.    if( a
9d20: 49 6e 20 29 7b 0a 20 20 20 20 20 20 61 49 6e 20  In ){.      aIn 
9d30: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a 33  += pLevel->nIn*3
9d40: 20 2d 20 33 3b 0a 20 20 20 20 20 20 61 49 6e 5b   - 3;.      aIn[
9d50: 30 5d 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  0] = OP_Next;.  
9d60: 20 20 20 20 61 49 6e 5b 31 5d 20 3d 20 69 54 61      aIn[1] = iTa
9d70: 62 3b 0a 20 20 20 20 20 20 61 49 6e 5b 32 5d 20  b;.      aIn[2] 
9d80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
9d90: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
9da0: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 7d   iTab, 0);.    }
9db0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
9dc0: 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
9dd0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
9de0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
9df0: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f  el, pTerm);.}../
9e00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9e10: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
9e20: 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
9e30: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
9e40: 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
9e50: 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72    The values for
9e60: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
9e70: 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65   are left on the
9e80: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f   stack..**.** Fo
9e90: 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
9ea0: 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
9eb0: 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
9ec0: 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
9ed0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
9ee0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
9ef0: 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
9f00: 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
9f10: 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
9f20: 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
9f30: 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
9f40: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
9f50: 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
9f60: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
9f70: 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
9f80: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
9f90: 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
9fa0: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
9fb0: 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
9fc0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
9fd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
9fe0: 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
9ff0: 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
a000: 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
a010: 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
a020: 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a  b will be left.*
a030: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d  * on the stack -
a040: 20 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73   a is the deepes
a050: 74 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c  t and b the shal
a060: 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lowest..**.** In
a070: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
a080: 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
a090: 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
a0a0: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
a0b0: 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
a0c0: 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
a0d0: 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
a0e0: 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
a0f0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
a100: 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
a110: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
a120: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
a130: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
a140: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
a150: 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
a160: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
a170: 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73  ry cell and puts
a180: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
a190: 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
a1a0: 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69  ell in pLevel->i
a1b0: 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74  Mem.  The code t
a1c0: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
a1d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
a1e0: 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  se pLevel->iMem 
a1f0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72  to store the ter
a200: 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20  mination.** key 
a210: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
a220: 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
a230: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
a240: 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
a250: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
a260: 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
a270: 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
a280: 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
a290: 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74  al.** use..*/.st
a2a0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c  atic void codeAl
a2b0: 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
a2c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a2e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a2f0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
a300: 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
a310: 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
a320: 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
a330: 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
a340: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
a350: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
a360: 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
a370: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
a380: 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
a390: 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
a3a0: 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
a3b0: 0a 20 20 69 6e 74 20 62 72 6b 20 20 20 20 20 20  .  int brk      
a3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a3d0: 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65   here to end the
a3e0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e   loop */.){.  in
a3f0: 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
a400: 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nEq;        /* T
a410: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
a420: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
a430: 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69  s to code */.  i
a440: 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20  nt termsInMem = 
a450: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
a460: 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76  If true, store v
a470: 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65  alue in mem[] ce
a480: 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  lls */.  Vdbe *v
a490: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a4a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69  ;      /* The vi
a4b0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
a4c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a4d0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
a4e0: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
a4f0: 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
a500: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
a510: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
a520: 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c  nt iCur = pLevel
a530: 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20  ->iTabCur;   /* 
a540: 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
a550: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
a560: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
a570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
a580: 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
a590: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
a5a0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
a5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a5c0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
a5d0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
a5e0: 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
a5f0: 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
a600: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
a610: 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77  hem..  ** We alw
a620: 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73  ays need at leas
a630: 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74  t one used to st
a640: 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72  ore the loop ter
a650: 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c  minator.  ** val
a660: 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ue.  If there ar
a670: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77  e IN operators w
a680: 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f  e'll need one fo
a690: 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a  r each == or.  *
a6a0: 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e  * IN constraint.
a6b0: 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e  .  */.  pLevel->
a6c0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
a6d0: 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c 65  Mem++;.  if( pLe
a6e0: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
a6f0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a  RE_COLUMN_IN ){.
a700: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a710: 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b   += pLevel->nEq;
a720: 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20  .    termsInMem 
a730: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
a740: 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
a750: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
a760: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  .  */.  for(j=0;
a770: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
a780: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
a790: 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
a7a0: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d  mn[j];.    pTerm
a7b0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
a7c0: 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
a7d0: 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
a7e0: 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
a7f0: 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
a800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
a810: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
a820: 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
a830: 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
a840: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
a850: 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29  rm, brk, pLevel)
a860: 3b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73 49  ;.    if( termsI
a870: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  nMem ){.      sq
a880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a890: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
a8a0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c  Level->iMem+j+1,
a8b0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
a8c0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71 20   assert( j==nEq 
a8d0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
a8e0: 72 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74  re all the const
a8f0: 72 61 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65  raint values are
a900: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
a910: 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20  he stack.  */.  
a920: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
a930: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
a940: 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
a950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a960: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
a970: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a  , pLevel->iMem+j
a980: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  +1, 0);.    }.  
a990: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
a9a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
a9b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a9c0: 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
a9d0: 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
a9e0: 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
a9f0: 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
aa00: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
aa10: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
aa20: 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
aa30: 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
aa40: 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
aa50: 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
aa60: 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
aa70: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
aa80: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
aa90: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
aaa0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
aab0: 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
aac0: 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
aad0: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
aae0: 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
aaf0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ab00: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
ab10: 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
ab20: 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
ab30: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
ab40: 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /..../*.** Gener
ab50: 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
ab60: 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
ab70: 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
ab80: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
ab90: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
aba0: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
abb0: 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
abc0: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
abd0: 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
abe0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
abf0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
ac00: 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
ac10: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
ac20: 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
ac30: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
ac40: 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
ac50: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
ac60: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
ac70: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
ac80: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ac90: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
aca0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
acb0: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
acc0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
acd0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
ace0: 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
acf0: 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
ad00: 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
ad10: 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
ad20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
ad30: 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
ad40: 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
ad50: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
ad60: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
ad70: 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
ad80: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
ad90: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
ada0: 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
adb0: 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
adc0: 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
add0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
ade0: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
adf0: 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
ae00: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
ae10: 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
ae20: 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
ae30: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
ae40: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
ae50: 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
ae60: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
ae70: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
ae80: 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
ae90: 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
aea0: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
aeb0: 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
aec0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
aed0: 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
aee0: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
aef0: 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
af20: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
af30: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
af40: 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
af50: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
af60: 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
af90: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
afa0: 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
afb0: 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
afc0: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
afd0: 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
afe0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
aff0: 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
b000: 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
b010: 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
b020: 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
b030: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
b040: 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
b050: 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
b060: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
b070: 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
b080: 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
b090: 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
b0a0: 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
b0b0: 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
b0c0: 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
b0d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
b0e0: 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
b0f0: 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
b100: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
b110: 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
b120: 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
b130: 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
b140: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
b150: 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
b160: 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
b170: 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
b180: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
b190: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
b1a0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
b1b0: 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
b1c0: 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
b1d0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
b1e0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
b1f0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
b200: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
b210: 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
b220: 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
b230: 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
b240: 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
b250: 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
b260: 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
b270: 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
b280: 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
b290: 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
b2a0: 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
b2b0: 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
b2c0: 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
b2d0: 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
b2e0: 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
b2f0: 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
b300: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
b310: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
b320: 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
b330: 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
b340: 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
b350: 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
b360: 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
b370: 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
b380: 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
b390: 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
b3a0: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
b3b0: 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
b3c0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
b3d0: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
b3e0: 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
b3f0: 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
b400: 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
b410: 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
b420: 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
b430: 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
b440: 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
b450: 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
b460: 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
b470: 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
b480: 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
b490: 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
b4a0: 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
b4b0: 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
b4c0: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
b4d0: 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
b4e0: 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
b4f0: 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
b500: 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
b510: 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
b520: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
b530: 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
b540: 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
b550: 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
b560: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
b570: 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
b580: 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
b590: 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
b5a0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
b5b0: 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
b5c0: 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
b5d0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
b5e0: 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
b5f0: 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
b600: 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
b610: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
b620: 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
b630: 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
b640: 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
b650: 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
b660: 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
b670: 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
b680: 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
b690: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
b6a0: 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
b6b0: 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
b6c0: 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
b6d0: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
b6e0: 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
b6f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
b700: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
b710: 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
b720: 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
b730: 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
b740: 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
b750: 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
b760: 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
b770: 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
b780: 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
b790: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
b7a0: 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
b7b0: 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
b7c0: 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
b7d0: 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
b7e0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
b7f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
b800: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
b810: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
b820: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
b830: 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
b840: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
b850: 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
b860: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
b870: 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
b880: 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
b890: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
b8a0: 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
b8b0: 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
b8c0: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
b8d0: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
b8e0: 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
b8f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b900: 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
b910: 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
b920: 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
b930: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
b940: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
b950: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
b960: 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
b970: 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
b980: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b990: 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
b9a0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
b9b0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
b9c0: 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
b9d0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b9e0: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
b9f0: 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
ba00: 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
ba10: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
ba20: 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
ba30: 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
ba40: 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
ba50: 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
ba60: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
ba70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ba80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
ba90: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
baa0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
bab0: 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
bac0: 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
bad0: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
bae0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
baf0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
bb00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
bb10: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
bb20: 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20  pOrderBy  /* An 
bb30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
bb40: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
bb50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bb70: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bb80: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
bb90: 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
bba0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
bbb0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
bbc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
bbd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bbe0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
bbf0: 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
bc00: 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
bc10: 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d   int brk, cont =
bc20: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
bc30: 64 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75  ddresses used du
bc40: 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
bc50: 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
bc60: 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
bc70: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
bc80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
bc90: 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
bca0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
bcb0: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  m;          /* A
bcc0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   single term in 
bcd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
bce0: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
bcf0: 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  t maskSet;      
bd00: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
bd10: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
bd20: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bd40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
bd50: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
bd60: 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  these terms */. 
bd70: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
bd80: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
bd90: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
bda0: 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
bdb0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
bdc0: 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
bdd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
bde0: 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
bdf0: 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
be00: 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
be30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
be40: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
be50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
be60: 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
be70: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
be80: 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f   wc.a[].flags */
be90: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
bea0: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
beb0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
bec0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
bed0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
bee0: 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
bef0: 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
bf00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
bf10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bf20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bf30: 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
bf40: 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
bf50: 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
bf60: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c  0;.  }..  /* Spl
bf70: 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
bf80: 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
bf90: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
bfa0: 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
bfb0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
bfc0: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
bfd0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
bfe0: 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
bff0: 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20  et(&maskSet);.  
c000: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
c010: 26 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  &wc, pParse);.  
c020: 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20  whereSplit(&wc, 
c030: 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
c040: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .    .  /* Alloc
c050: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
c060: 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
c070: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
c080: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
c090: 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
c0a0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  e..  */.  pWInfo
c0b0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
c0c0: 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66   sizeof(WhereInf
c0d0: 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e  o) + pTabList->n
c0e0: 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  Src*sizeof(Where
c0f0: 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73  Level));.  if( s
c100: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
c110: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
c120: 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d   whereBeginNoMem
c130: 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
c140: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
c150: 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
c160: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
c170: 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
c180: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
c190: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
c1a0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
c1b0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
c1c0: 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
c1d0: 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
c1e0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
c1f0: 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
c200: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
c210: 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
c220: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
c230: 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74  ere && (pTabList
c240: 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->nSrc==0 || sql
c250: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c260: 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  nt(pWhere)) ){. 
c270: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
c280: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
c290: 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
c2a0: 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57  reak, 1);.    pW
c2b0: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
c2c0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
c2d0: 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
c2e0: 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
c2f0: 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
c300: 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
c310: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
c320: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
c330: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c340: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
c350: 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
c360: 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
c370: 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
c380: 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
c390: 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
c3a0: 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
c3b0: 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
c3c0: 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
c3d0: 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
c3e0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
c3f0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
c400: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
c410: 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  ateMask(&maskSet
c420: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
c430: 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  .iCursor);.  }. 
c440: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
c450: 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b 53  pTabList, &maskS
c460: 65 74 2c 20 26 77 63 29 3b 0a 20 20 69 66 28 20  et, &wc);.  if( 
c470: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
c480: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
c490: 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
c4a0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
c4b0: 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
c4c0: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
c4d0: 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
c4e0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
c4f0: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
c500: 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
c510: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
c520: 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
c530: 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
c540: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
c550: 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
c560: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
c570: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c580: 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
c590: 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
c5a0: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
c5b0: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
c5c0: 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
c5d0: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
c5e0: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
c5f0: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
c600: 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
c610: 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
c620: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
c630: 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
c640: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
c650: 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
c660: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
c670: 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
c680: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c690: 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
c6a0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
c6b0: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
c6c0: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
c6d0: 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
c6e0: 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
c6f0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
c700: 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
c710: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
c720: 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
c730: 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
c740: 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
c750: 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
c760: 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
c770: 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2a 2a 2a  0;.  TRACE(("***
c780: 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
c790: 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72   ***\n"));.  for
c7a0: 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76  (i=iFrom=0, pLev
c7b0: 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
c7c0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
c7d0: 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
c7e0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f  /* Index for FRO
c810: 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49  M table at pTabI
c820: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66  tem */.    int f
c830: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
c840: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
c850: 61 73 73 73 6f 63 69 61 74 65 64 20 77 69 74 68  asssociated with
c860: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
c870: 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c890: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
c8a0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
c8b0: 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20    double cost;  
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8d0: 20 54 68 65 20 63 6f 73 74 20 66 6f 72 20 70 49   The cost for pI
c8e0: 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  dx */.    int j;
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
c910: 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74  ping over FROM t
c920: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64  ables */.    Ind
c930: 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
c940: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c950: 62 65 73 74 20 69 6e 64 65 78 20 73 65 65 6e 20  best index seen 
c960: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e  so far */.    in
c970: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
c980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
c990: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
c9a0: 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  th pBest */.    
c9b0: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
c9d0: 45 71 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Eq associated wi
c9e0: 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  th pBest */.    
c9f0: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
ca00: 74 20 3d 20 31 2e 30 65 39 39 3b 20 2f 2a 20 43  t = 1.0e99; /* C
ca10: 6f 73 74 20 6f 66 20 74 68 65 20 70 42 65 73 74  ost of the pBest
ca20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
ca30: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
ca40: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
ca50: 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74   of j */.    Bit
ca60: 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20  mask m;         
ca70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
ca80: 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20  ask value for j 
ca90: 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 0a 20 20 20  or bestJ */..   
caa0: 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
cab0: 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
cac0: 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69  ->a[j]; j<pTabLi
cad0: 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70  st->nSrc; j++, p
cae0: 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  TabItem++){.    
caf0: 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d    m = getMask(&m
cb00: 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d  askSet, pTabItem
cb10: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
cb20: 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65    if( (m & notRe
cb30: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
cb40: 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20     if( j==iFrom 
cb50: 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20  ) iFrom++;.     
cb60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
cb70: 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 73 74 20     }.      cost 
cb80: 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72  = bestIndex(pPar
cb90: 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65  se, &wc, pTabIte
cba0: 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
cbd0: 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
cbe0: 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20  erBy : 0,.      
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20   &pIdx, &flags, 
cc10: 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  &nEq);.      if(
cc20: 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74   cost<lowestCost
cc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   ){.        lowe
cc40: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
cc50: 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
cc60: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
cc70: 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
cc80: 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20          bestNEq 
cc90: 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62  = nEq;.        b
cca0: 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
ccb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  }.      if( (pTa
ccc0: 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bItem->jointype 
ccd0: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
cce0: 4f 53 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20  OSS))!=0.       
ccf0: 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28 70 54    || (j>0 && (pT
cd00: 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74  abItem[-1].joint
cd10: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
cd20: 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20  T_CROSS))!=0).  
cd30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
cd40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
cd50: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
cd60: 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68  *** Optimizer ch
cd70: 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f  oose table %d fo
cd80: 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
cd90: 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
cda0: 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
cdb0: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
cdc0: 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  tFlags & WHERE_O
cdd0: 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
cde0: 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
cdf0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
ce00: 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c  dFlags &= bestFl
ce10: 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
ce20: 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  >flags = bestFla
ce30: 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
ce40: 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20  pIdx = pBest;.  
ce50: 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20    pLevel->nEq = 
ce60: 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65  bestNEq;.    pLe
ce70: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30  vel->aInLoop = 0
ce80: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
ce90: 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
cea0: 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c  Best ){.      pL
ceb0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
cec0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ced0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cee0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
cef0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
cf00: 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
cf10: 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
cf20: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
cf30: 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
cf40: 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
cf50: 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52   bestJ;.  }.  TR
cf60: 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
cf70: 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
cf80: 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  \n"));..  /* If 
cf90: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
cfa0: 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73  only selects a s
cfb0: 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20  ingle row, then 
cfc0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
cfd0: 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65  * clause is irre
cfe0: 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  levant..  */.  i
cff0: 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  f( (andFlags & W
d000: 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
d010: 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a  && ppOrderBy ){.
d020: 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
d030: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70   0;.  }..  /* Op
d040: 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
d050: 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
d060: 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
d070: 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
d080: 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
d090: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73  tables..  */.  s
d0a0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
d0b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
d0c0: 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
d0d0: 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
d0e0: 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65 76  r Goto */.  pLev
d0f0: 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
d100: 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
d110: 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
d120: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
d130: 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
d140: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
d150: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b 0a      Index *pIx;.
d160: 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20      int iIdxCur 
d170: 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
d180: 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r;..#ifndef SQLI
d190: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
d1a0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
d1b0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
d1c0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a      char *zMsg;.
d1d0: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
d1e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d1f0: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
d200: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
d210: 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
d220: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 54 41 42  ite3MPrintf("TAB
d230: 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  LE %s", pItem->z
d240: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
d250: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
d260: 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
d270: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d280: 22 25 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%z AS %s", zMsg
d290: 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
d2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d2b0: 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65  if( (pIx = pLeve
d2c0: 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20  l->pIdx)!=0 ){. 
d2d0: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
d2e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
d2f0: 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c   WITH INDEX %s",
d300: 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d   zMsg, pIx->zNam
d310: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
d320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d330: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
d340: 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
d350: 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d  , zMsg, P3_DYNAM
d360: 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
d370: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d380: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
d390: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
d3a0: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
d3b0: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
d3c0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
d3d0: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  b;.    if( pTab-
d3e0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20  >isTransient || 
d3f0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
d400: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
d410: 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
d420: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
d430: 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
d440: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46  qlite3OpenTableF
d450: 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 70 54 61  orReading(v, pTa
d460: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
d470: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
d480: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
d490: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
d4a0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
d4b0: 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
d4c0: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  x)!=0 ){.      s
d4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d4e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
d4f0: 49 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  Ix->iDb, 0);.   
d500: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d510: 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e  v, "# %s", pIx->
d520: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
d530: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d540: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
d550: 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
d560: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d570: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
d580: 49 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  Ix->keyInfo, P3_
d590: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
d5a0: 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
d5b0: 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
d5c0: 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  DX_ONLY)!=0 ){. 
d5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
d5f0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43  umColumns, iIdxC
d600: 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e  ur, pIx->nColumn
d610: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
d620: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
d630: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
d640: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20  Tab->iDb);.  }. 
d650: 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
d660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d670: 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
d680: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
d690: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
d6a0: 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
d6b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
d6c0: 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
d6d0: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
d6e0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
d6f0: 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
d700: 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
d710: 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
d720: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
d730: 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
d740: 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
d750: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
d760: 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
d770: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74    int j;.    int
d780: 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
d790: 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54  ->iCursor;  /* T
d7a0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
d7b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
d7c0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
d7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
d7e0: 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
d7f0: 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
d800: 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f  iIdxCur;       /
d810: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
d820: 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
d830: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54  */.    int omitT
d840: 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75  able;     /* Tru
d850: 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
d860: 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
d870: 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
d880: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
d890: 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
d8a0: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
d8b0: 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65   */..    pTabIte
d8c0: 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
d8d0: 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
d8e0: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62  .    iCur = pTab
d8f0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
d900: 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
d910: 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78  ->pIdx;.    iIdx
d920: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
d930: 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20  dxCur;.    bRev 
d940: 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
d950: 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
d960: 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61  )!=0;.    omitTa
d970: 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  ble = (pLevel->f
d980: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
d990: 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20  _ONLY)!=0;..    
d9a0: 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
d9b0: 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
d9c0: 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
d9d0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
d9e0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
d9f0: 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
da00: 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20  to brk to break 
da10: 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
da20: 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f     ** Jump to co
da30: 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
da40: 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
da50: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
da60: 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  e.    ** loop.. 
da70: 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20     */.    brk = 
da80: 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71  pLevel->brk = sq
da90: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
daa0: 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20  el(v);.    cont 
dab0: 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
dac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dad0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
dae0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
daf0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
db00: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
db10: 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
db20: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
db30: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
db40: 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
db50: 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
db60: 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
db70: 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
db80: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
db90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dba0: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
dbb0: 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d  && (pTabItem[-1]
dbc0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
dbd0: 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  EFT)!=0 ){.     
dbe0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d   if( !pParse->nM
dbf0: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
dc00: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  m++;.      pLeve
dc10: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70  l->iLeftJoin = p
dc20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
dc30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
dc50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
dc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dc70: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
dc80: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
dc90: 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 1);.      Vdb
dca0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
dcb0: 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
dcc0: 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
dcd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
dce0: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
dcf0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
dd00: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
dd10: 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
dd20: 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
dd30: 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
dd40: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   an.      **    
dd50: 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
dd60: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
dd70: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
dd80: 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20  d.  Or.      ** 
dd90: 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
dda0: 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
ddb0: 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
ddc0: 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
ddd0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
dde0: 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20  onstruct..      
ddf0: 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  */.      pTerm =
de00: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
de10: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
de20: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
de30: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
de40: 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
de50: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
de60: 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
de70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
de80: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
de90: 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73  iCur );.      as
dea0: 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
deb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
dec0: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
ded0: 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c  rse, pTerm, brk,
dee0: 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
def0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
df00: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
df10: 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  , 1, brk);.     
df20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df30: 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  p(v, OP_NotExist
df40: 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  s, iCur, brk);. 
df50: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
df60: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
df70: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
df80: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
df90: 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
dfa0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
dfb0: 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
dfc0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
dfd0: 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
dfe0: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
dff0: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
e000: 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
e010: 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
e020: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
e030: 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
e040: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
e050: 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
e060: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
e070: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
e080: 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
e090: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
e0a0: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
e0b0: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
e0c0: 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64       pEnd = find
e0d0: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
e0e0: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
e0f0: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
e100: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
e110: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
e120: 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   pStart;.       
e130: 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
e140: 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
e150: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
e160: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
e170: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
e180: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
e190: 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
e1a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e1b0: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
e1c0: 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
e1d0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
e1e0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
e1f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e200: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
e210: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e230: 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f  _ForceInt, pX->o
e240: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e  p==TK_LE || pX->
e250: 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b  op==TK_GT, brk);
e260: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e270: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65  VdbeAddOp(v, bRe
e280: 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20  v ? OP_MoveLt : 
e290: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
e2a0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56   brk);.        V
e2b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e2c0: 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64  pk"));.        d
e2d0: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
e2e0: 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
e2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e310: 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  p(v, bRev ? OP_L
e320: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
e330: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
e340: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
e350: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45  End ){.        E
e360: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
e370: 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
e380: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
e390: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
e3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
e3b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
e3c0: 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
e3d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e3e0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
e3f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
e400: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
e410: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
e420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e430: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
e440: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
e450: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
e460: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
e470: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
e480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
e490: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
e4a0: 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
e4b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e4c0: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
e4d0: 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
e4e0: 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Gt;.        }.  
e4f0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
e500: 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
e510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e520: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
e530: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e540: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
e550: 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
e560: 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
e570: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
e580: 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
e590: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
e5a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  ;.      if( test
e5b0: 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
e5c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
e5e0: 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  wid, iCur, 0);. 
e5f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
e610: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
e620: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
e630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e640: 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27  p(v, testOp, 'n'
e650: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
e660: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
e670: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e680: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
e690: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
e6a0: 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
e6b0: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
e6c0: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
e6d0: 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
e6e0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
e6f0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
e700: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
e710: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e720: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
e730: 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
e740: 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
e750: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
e760: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
e770: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
e780: 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
e790: 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
e7a0: 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
e7b0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
e7c0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
e7d0: 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
e7e0: 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
e7f0: 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
e800: 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
e810: 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
e820: 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
e830: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
e840: 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
e850: 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
e860: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
e870: 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
e880: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
e890: 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
e8a0: 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
e8b0: 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
e8c0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
e8d0: 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
e8e0: 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
e8f0: 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
e900: 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
e910: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
e920: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
e930: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
e940: 20 20 20 20 69 6e 74 20 6c 65 46 6c 61 67 3d 30      int leFlag=0
e950: 2c 20 67 65 46 6c 61 67 3d 30 3b 0a 20 20 20 20  , geFlag=0;.    
e960: 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20    int testOp;.  
e970: 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74      int topLimit
e980: 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
e990: 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
e9a0: 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  MIT)!=0;.      i
e9b0: 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70  nt btmLimit = (p
e9c0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e9d0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
e9e0: 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  =0;..      /* Ge
e9f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
ea00: 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
ea10: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
ea20: 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
ea30: 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74    ** and level t
ea40: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
ea50: 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
ea60: 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
ea70: 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
ea80: 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
ea90: 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
eaa0: 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a  notReady, brk);.
eab0: 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63  .      /* Duplic
eac0: 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
ead0: 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63   term values bec
eae0: 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ause they will a
eaf0: 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75  ll be.      ** u
eb00: 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20  sed twice: once 
eb10: 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d  to make the term
eb20: 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20  ination key and 
eb30: 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  once to make the
eb40: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20  .      ** start 
eb50: 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
eb60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
eb70: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; j++){.      
eb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eb90: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45  Op(v, OP_Dup, nE
eba0: 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  q-1, 0);.      }
ebb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
ebc0: 61 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ate the terminat
ebd0: 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69  ion key.  This i
ebe0: 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
ebf0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  that.      ** wi
ec00: 6c 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63  ll end the searc
ec10: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
ec20: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20  termination key 
ec30: 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  if there.      *
ec40: 2a 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74  * are no equalit
ec50: 79 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22  y terms and no "
ec60: 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20  X<..." term..   
ec70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
ec80: 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61  002-Dec-04: On a
ec90: 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73   reverse-order s
eca0: 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c  can, the so-call
ecb0: 65 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22  ed "termination"
ecc0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f  .      ** key co
ecd0: 6d 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c  mputed here real
ece0: 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
ecf0: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a   the start key..
ed00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ed10: 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20  f( topLimit ){. 
ed20: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
ed30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
ed40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ed50: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
ed60: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
ed70: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
ed80: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
ed90: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
eda0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
edb0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
edc0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
edd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ede0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
edf0: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
ee00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ee20: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
ee30: 20 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20         leFlag = 
ee40: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20  pX->op==TK_LE;. 
ee50: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
ee60: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
ee70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  );.        testO
ee80: 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20  p = OP_IdxGE;.  
ee90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eea0: 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e     testOp = nEq>
eeb0: 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f  0 ? OP_IdxGE : O
eec0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
eed0: 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  leFlag = 1;.    
eee0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
eef0: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
ef00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
ef10: 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
ef20: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  it;.        pLev
ef30: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
ef40: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
ef50: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
ef60: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c  be(v, nCol, brk,
ef70: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ef80: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
ef90: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 6c        int op = l
efa0: 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 4c  eFlag ? OP_MoveL
efb0: 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  e : OP_MoveLt;. 
efc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
efd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
efe0: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
eff0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f000: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f010: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f020: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
f030: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
f040: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f050: 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
f060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73  eAddOp(v, OP_Las
f080: 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  t, iIdxCur, brk)
f090: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f0a0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
f0b0: 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69   start key.  Thi
f0c0: 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61  s is the key tha
f0d0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f  t defines the lo
f0e0: 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75  wer.      ** bou
f0f0: 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  nd on the search
f100: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73  .  There is no s
f110: 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72  tart key if ther
f120: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a  e are no.      *
f130: 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  * equality terms
f140: 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73   and if there is
f150: 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d   no "X>..." term
f160: 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74  .  In.      ** t
f170: 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61  hat case, genera
f180: 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e  te a "Rewind" in
f190: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61  struction in pla
f1a0: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
f1b0: 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61  ** start key sea
f1c0: 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rch..      **.  
f1d0: 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
f1e0: 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20  04: In the case 
f1f0: 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  of a reverse-ord
f200: 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73  er search, the s
f210: 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a  o-called.      *
f220: 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65  * "start" key re
f230: 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69  ally ends up bei
f240: 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74  ng used as the t
f250: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a  ermination key..
f260: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f270: 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20  f( btmLimit ){. 
f280: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
f290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
f2a0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
f2b0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
f2c0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
f2d0: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
f2e0: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
f2f0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
f300: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
f310: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
f320: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
f330: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f340: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
f350: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
f360: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f370: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f380: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
f390: 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20         geFlag = 
f3a0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20  pX->op==TK_GE;. 
f3b0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
f3c0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
f3d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f3e0: 20 20 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d          geFlag =
f3f0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
f400: 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62    if( nEq>0 || b
f410: 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
f420: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
f430: 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20  q + btmLimit;.  
f440: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
f450: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62  Probe(v, nCol, b
f460: 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  rk, pIdx);.     
f470: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
f480: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
f490: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
f4a0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
f4b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f4c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
f4d0: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
f4e0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74   1);.          t
f4f0: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54  estOp = OP_IdxLT
f500: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f510: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
f520: 70 20 3d 20 67 65 46 6c 61 67 20 3f 20 4f 50 5f  p = geFlag ? OP_
f530: 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
f540: 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
f550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f560: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
f570: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rk);.        }. 
f580: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
f590: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
f5a0: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
f5b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
f5e0: 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
f5f0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
f600: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
f610: 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
f620: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
f630: 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
f640: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
f650: 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
f660: 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
f670: 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
f680: 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
f690: 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
f6a0: 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
f6b0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f6c0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
f6d0: 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
f6e0: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
f6f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f700: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
f710: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
f720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f730: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
f740: 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72  tOp, iIdxCur, br
f750: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
f760: 28 6c 65 46 6c 61 67 20 26 26 20 21 62 52 65 76  (leFlag && !bRev
f770: 29 20 7c 7c 20 28 21 67 65 46 6c 61 67 20 26 26  ) || (!geFlag &&
f780: 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20   bRev) ){.      
f790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f7a0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
f7b0: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
f7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f7d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f7e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f7f0: 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
f800: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f810: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f820: 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 20  _IdxIsNull, nEq 
f830: 2b 20 74 6f 70 4c 69 6d 69 74 2c 20 63 6f 6e 74  + topLimit, cont
f840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
f850: 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
f860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f870: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
f880: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
f890: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f8b0: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
f8c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f8d0: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
f8e0: 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
f8f0: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
f900: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
f910: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
f920: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
f930: 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
f940: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
f950: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70  iIdxCur;.      p
f960: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
f970: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
f980: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
f990: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
f9a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
f9b0: 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61  e 4:  There is a
f9c0: 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20  n index and all 
f9d0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
f9e0: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20  RE clause that. 
f9f0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
fa00: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e   refer to the in
fa10: 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d  dex using the "=
fa20: 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
fa30: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tors..      */. 
fa40: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
fa50: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
fa60: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20  pLevel->nEq;..  
fa70: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
fa80: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
fa90: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
faa0: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
fab0: 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
fac0: 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75  d leave the valu
fad0: 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
fae0: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
faf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
fb00: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
fb10: 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
fb20: 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
fb30: 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20  y, brk);..      
fb40: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 69  /* Generate a si
fb50: 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69  ngle key that wi
fb60: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f  ll be used to bo
fb70: 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  th start and ter
fb80: 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  minate.      ** 
fb90: 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20  the search.     
fba0: 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64 49   */.      buildI
fbb0: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71  ndexProbe(v, nEq
fbc0: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fbe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
fbf0: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
fc00: 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
fc10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
fc20: 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
fc30: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
fc40: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
fc50: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
fc60: 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
fc70: 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
fc80: 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
fc90: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
fca0: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
fcb0: 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
fcc0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
fcd0: 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
fce0: 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
fcf0: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
fd00: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
fd10: 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
fd20: 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
fd30: 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
fd40: 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
fd50: 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
fd60: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
fd70: 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
fd80: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
fd90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
fda0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
fdb0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
fdc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fdd0: 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78   OP_MoveLe, iIdx
fde0: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
fdf0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
fe00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fe10: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
fe20: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
fe30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c  AddOp(v, OP_IdxL
fe50: 54 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  T, iIdxCur, brk)
fe60: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
fe70: 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
fe80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fe90: 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
fea0: 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65  the forward orde
feb0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
fec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fed0: 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78   OP_MoveGe, iIdx
fee0: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
fef0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
ff00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ff10: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
ff20: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
ff30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ff40: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c  Op3(v, OP_IdxGE,
ff50: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22   iIdxCur, brk, "
ff60: 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
ff70: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
ff80: 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
ff90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ffa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ffb0: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
ffc0: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
ffd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ffe0: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
fff0: 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  nEq, cont);.    
10000 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
10010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10020 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10030 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
10040 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
10050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10060 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
10070 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
10080 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
10090 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
100a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
100b0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
100c0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
100d0 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
100e0 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
100f0 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
10100 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
10110 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
10120 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
10130 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10140 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
10150 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
10160 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
10170 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
10180 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
10190 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
101a0 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
101b0 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
101c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
101d0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
101e0 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a  ur, brk);.    }.
101f0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
10200 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
10210 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
10220 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
10230 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
10240 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
10250 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
10260 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
10270 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
10280 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
10290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
102a0 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77  (pTerm=wc.a, j=w
102b0 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  c.nTerm; j>0; j-
102c0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
102d0 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
102e0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
102f0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
10300 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
10310 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10320 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
10330 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
10340 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
10350 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
10360 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
10370 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
10380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
10390 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
103a0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
103b0 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
103c0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
103d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
103e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
103f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10400 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a  , pE, cont, 1);.
10410 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
10420 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
10430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10440 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
10450 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
10460 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
10470 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
10480 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
10490 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
104a0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
104b0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
104c0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
104d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
104e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
104f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
10500 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10510 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
10520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10530 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10540 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
10550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10560 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
10570 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  re, pLevel->iLef
10580 74 4a 6f 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20  tJoin, 1);.     
10590 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
105a0 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20   "# record LEFT 
105b0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
105c0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
105d0 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65  a, j=0; j<wc.nTe
105e0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
105f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10600 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
10610 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10620 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
10630 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
10640 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
10650 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
10660 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10670 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
10680 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
10690 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
106a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
106b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f  pTerm->pExpr, co
106c0 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  nt, 1);.        
106d0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
106e0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
106f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
10700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
10710 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
10720 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
10730 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
10740 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
10750 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
10760 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
10770 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
10780 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
10790 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
107a0 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
107b0 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
107c0 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
107d0 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
107e0 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
107f0 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
10800 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
10810 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
10820 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
10830 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
10840 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
10850 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
10860 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
10870 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10880 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
10890 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
108a0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
108b0 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
108c0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
108d0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
108e0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
108f0 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
10900 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
10910 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
10920 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Name;.    n = st
10930 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
10940 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
10950 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
10960 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
10970 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
10980 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
10990 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
109a0 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
109b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
109c0 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20  an], "{}");.    
109d0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
109e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
109f0 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
10a00 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
10a10 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20  [nQPlan], z);.  
10a20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
10a30 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
10a40 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
10a50 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
10a60 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ' ';.    }.    i
10a70 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
10a80 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
10a90 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
10aa0 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 73  ANGE) ){.      s
10ab0 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
10ac0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
10ad0 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20 20  ], "* ");.      
10ae0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
10af0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
10b00 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  l->pIdx==0 ){.  
10b10 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
10b20 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
10b30 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a  QPlan], "{} ");.
10b40 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
10b50 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
10b60 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70      n = strlen(p
10b70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
10b80 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
10b90 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
10ba0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
10bb0 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
10bc0 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
10bd0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
10be0 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49  lan], pLevel->pI
10bf0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
10c00 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
10c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10c20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
10c30 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
10c40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10c50 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
10c60 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
10c70 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
10c80 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
10c90 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
10ca0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
10cb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
10cc0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
10cd0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
10ce0 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
10cf0 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
10d00 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
10d10 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
10d20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
10d30 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
10d40 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
10d50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
10d60 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
10d70 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
10d80 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69    */.  pWInfo->i
10d90 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b  Continue = cont;
10da0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
10db0 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75  ear(&wc);.  retu
10dc0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
10dd0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
10de0 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
10df0 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20  ereBeginNoMem:. 
10e00 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
10e10 72 28 26 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  r(&wc);.  sqlite
10e20 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
10e30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
10e40 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
10e50 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
10e60 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
10e70 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
10e80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10e90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10ea0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
10eb0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
10ec0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
10ed0 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
10ee0 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
10ef0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
10f00 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
10f10 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
10f20 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
10f30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
10f40 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
10f50 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
10f60 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
10f70 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
10f80 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
10f90 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
10fa0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
10fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10fc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
10fd0 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
10fe0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
10ff0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
11000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11010 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
11020 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
11030 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
11040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11050 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11060 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
11070 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49    if( pLevel->nI
11080 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  n ){.      int *
11090 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  a;.      int j;.
110a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
110b0 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76  el->nIn, a=&pLev
110c0 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d  el->aInLoop[j*3-
110d0 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d  3]; j>0; j--, a-
110e0 3d 33 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  =3){.        sql
110f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11100 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32   a[0], a[1], a[2
11110 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
11120 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65    sqliteFree(pLe
11130 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  vel->aInLoop);. 
11140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
11150 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
11160 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
11170 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
11180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11190 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
111a0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
111b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
111c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
111d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61  OP_NotNull, 1, a
111e0 64 64 72 2b 34 20 2b 20 28 70 4c 65 76 65 6c 2d  ddr+4 + (pLevel-
111f0 3e 69 49 64 78 43 75 72 3e 3d 30 29 29 3b 0a 20  >iIdxCur>=0));. 
11200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11210 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
11220 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
11230 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b  [i].iCursor, 0);
11240 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
11250 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
11260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11270 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11280 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
11290 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20  >iIdxCur, 0);.  
112a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
112b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
112c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
112d0 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 7d 0a  el->top);.    }.
112e0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
112f0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
11300 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
11310 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
11320 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
11330 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
11340 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11350 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
11360 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
11370 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
11380 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
11390 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
113a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
113b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
113c0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
113d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
113e0 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
113f0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
11400 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
11410 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
11420 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
11430 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
11440 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
11450 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
11460 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11470 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
11480 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d  ansient || pTab-
11490 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
114a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
114b0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
114c0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
114d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
114e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
114f0 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
11500 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  ->iCursor, 0);. 
11510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
11520 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a  vel->pIdx!=0 ){.
11530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11540 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11550 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
11560 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  Cur, 0);.    }..
11570 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73      /* Make curs
11580 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  or substitutions
11590 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 72 65   for cases where
115a0 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73 65 0a   we want to use.
115b0 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68 65 20      ** just the 
115c0 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65 72 20  index and never 
115d0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
115e0 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ble..    ** .   
115f0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
11600 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
11610 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
11620 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
11630 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
11640 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
11650 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
11660 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
11670 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
11680 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
11690 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
116a0 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
116b0 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
116c0 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
116d0 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
116e0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
116f0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
11700 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
11710 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
11720 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
11730 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
11740 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
11750 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c 61      int i, j, la
11760 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
11770 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
11780 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
11790 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20  l->pIdx;..      
117a0 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
117b0 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
117c0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
117d0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
117e0 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
117f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11800 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
11810 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(i=pWInfo->iT
11820 6f 70 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c  op; i<last; i++,
11830 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
11840 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
11850 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
11860 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11870 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
11880 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
11890 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
118a0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
118b0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Cur;.          f
118c0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
118d0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
118e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
118f0 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
11900 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
11910 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
11920 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
11930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11960 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
11970 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
11980 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
11990 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
119a0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
119b0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
119c0 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
119d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
119e0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75  p->opcode==OP_Nu
119f0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
11a00 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
11a10 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
11a20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11a30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
11a40 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
11a50 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e   sqliteFree(pWIn
11a60 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
11a70 0a                                               .