/ Hex Artifact Content
Login

Artifact d7c3cc011834882b2d58ebb3a6a1a569ead7ebd7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 31 38   where.c,v 1.218
0340: 20 32 30 30 36 2f 30 36 2f 31 34 20 32 32 3a 30   2006/06/14 22:0
0350: 37 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a 2a  7:11 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
03f0: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
0400: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0410: 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  array..*/.#defin
0420: 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20 20  e ARRAYSIZE(X)  
0430: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
0440: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
0450: 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63  Trace output mac
0460: 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ros.*/.#if defin
0470: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
0480: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0490: 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71 6c  E_DEBUG).int sql
04a0: 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65  ite3_where_trace
04b0: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 54   = 0;.# define T
04c0: 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c 69  RACE(X)  if(sqli
04d0: 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29  te3_where_trace)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  ntf X.#else.# de
0500: 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65  fine TRACE(X).#e
0510: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
0520: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
0530: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0540: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
0550: 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ause;../*.** The
0560: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
0570: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
0580: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
0590: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
05a0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
05b0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
05c0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
05d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
05e0: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
05f0: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0600: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0610: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0620: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
0630: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
0640: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
0650: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
0660: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
0670: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
0680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
0690: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
06a0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
06b0: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
06c0: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
06d0: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
06e0: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
06f0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
0710: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
0720: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
0730: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
0740: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
0750: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
0760: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
0770: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
0780: 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c  hereTerm.leftCol
0790: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07a0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07b0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07c0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07d0: 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63  erm.operator rec
07e0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
07f0: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
0800: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
0810: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
0820: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
0830: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
0840: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
0850: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
0860: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
0870: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
0880: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
0890: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
08a0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
08b0: 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20  .** prereqRight 
08c0: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
08d0: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
08e0: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
08f0: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0900: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0910: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0920: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0930: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0940: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0950: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0960: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0970: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0980: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0990: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
09a0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
09b0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
09c0: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
09d0: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
09e0: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
09f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0a00: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0a10: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0a20: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0a30: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0a40: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0a50: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0a60: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0a70: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0a80: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
0a90: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
0aa0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
0ab0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0ac0: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0ad0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0ae0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0af0: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0b00: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0b10: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0b20: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0b30: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0b40: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0b50: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
0b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
0b70: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
0b80: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
0b90: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f   0 through 7..*/
0ba0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bb0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0bc0: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0bd0: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0be0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0bf0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0c00: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0c10: 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65  n */.  i16 iPare
0c20: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
0c30: 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61  * Disable pWC->a
0c40: 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74  [iParent] when t
0c50: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0c60: 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43  d */.  i16 leftC
0c70: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0c80: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0c90: 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20  of X in "X <op> 
0ca0: 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36  <expr>" */.  i16
0cb0: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
0cc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0cd0: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0ce0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0cf0: 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72  .  u16 eOperator
0d00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
0d10: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
0d20: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
0d30: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20           /* Bit 
0d50: 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f  flags.  See belo
0d60: 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64  w */.  u8 nChild
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0d80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  * Number of chil
0d90: 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64  dren that must d
0da0: 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57  isable us */.  W
0db0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
0dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c         /* The cl
0dd0: 61 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69  ause this term i
0de0: 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42  s part of */.  B
0df0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67  itmask prereqRig
0e00: 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ht;    /* Bitmas
0e10: 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  k of tables used
0e20: 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20   by pRight */.  
0e30: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
0e40: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
0e50: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
0e60: 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a  erenced by p */.
0e70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
0e80: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
0e90: 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23  eTerm.flags.*/.#
0ea0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
0eb0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
0ec0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
0ed0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ee0: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
0ef0: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
0f00: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
0f10: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
0f20: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
0f30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f40: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
0f50: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
0f60: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
0f70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f80: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
0f90: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
0fa0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
0fb0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31  M_OR_OK      0x1
0fc0: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
0fd0: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
0fe0: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
0ff0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1010: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1020: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1030: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1040: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1050: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1060: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1070: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1080: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1090: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
10a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
10b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
10c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
10d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
10e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10f0: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
1100: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
1110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1120: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1130: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
1140: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
1150: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
1160: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
1170: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
1180: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1190: 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20  m aStatic[10];  
11a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
11b0: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
11c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
11e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
11f0: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1200: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1210: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1220: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1230: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1240: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1250: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1260: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1270: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1280: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1290: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
12a0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
12b0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
12c0: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
12d0: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
12e0: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
12f0: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1310: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1320: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1330: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1340: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1350: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1360: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1370: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1380: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1390: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
13a0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
13b0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
13c0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
13d0: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
13e0: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
13f0: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1400: 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65  ** If ExprMaskSe
1410: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
1420: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
1430: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
1440: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
1450: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
1460: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
1470: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
1480: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
1490: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
14a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
14c0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
14d0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
14e0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
14f0: 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d   Then the  ExprM
1500: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
1510: 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68  .** would map th
1520: 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ose cursor numbe
1530: 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74  rs into bits 0 t
1540: 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20  hrough 5..**.** 
1550: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  Note that the ma
1560: 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  pping is not nec
1570: 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64  essarily ordered
1580: 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  .  In the exampl
1590: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20  e.** above, the 
15a0: 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f  mapping might go
15b0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e   like this:  4->
15c0: 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32  3, 5->1, 8->2, 2
15d0: 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20  9->0,.** 57->5, 
15e0: 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f  73->4.  Or one o
15f0: 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62  f 719 other comb
1600: 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62  inations might b
1610: 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f  e used. It.** do
1620: 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61  es not really ma
1630: 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69  tter.  What is i
1640: 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74  mportant is that
1650: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a   sparse cursor.*
1660: 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65  * numbers all ge
1670: 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69  t mapped into bi
1680: 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62  t numbers that b
1690: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
16a0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61  contain.** no ga
16b0: 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ps..*/.typedef s
16c0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16d0: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73  t ExprMaskSet;.s
16e0: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
16f0: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1720: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1730: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1740: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
1750: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
1760: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1770: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
1780: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
1790: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
17a0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
17b0: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
17c0: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
17d0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
17e0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
17f0: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1800: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1810: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1820: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1830: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1840: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
1850: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
1860: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
1870: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
1880: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
1890: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
18a0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
18b0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
18c0: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
18d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
18e0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18f0: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
1900: 65 20 57 4f 5f 4d 41 54 43 48 20 20 36 34 0a 0a  e WO_MATCH  64..
1910: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
1920: 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1930: 79 20 62 65 73 74 49 6e 64 65 78 28 29 0a 2a 2f  y bestIndex().*/
1940: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1950: 4f 57 49 44 5f 45 51 20 20 20 20 20 20 20 30 78  OWID_EQ       0x
1960: 30 30 30 31 20 20 20 2f 2a 20 72 6f 77 69 64 3d  0001   /* rowid=
1970: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
1980: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1990: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  e WHERE_ROWID_RA
19a0: 4e 47 45 20 20 20 20 30 78 30 30 30 32 20 20 20  NGE    0x0002   
19b0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
19c0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
19d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
19e0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 20 20  _COLUMN_EQ      
19f0: 30 78 30 30 31 30 20 20 20 2f 2a 20 78 3d 45 58  0x0010   /* x=EX
1a00: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
1a10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1a20: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 20  E_COLUMN_RANGE  
1a30: 20 30 78 30 30 32 30 20 20 20 2f 2a 20 78 3c 45   0x0020   /* x<E
1a40: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
1a50: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1a60: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
1a70: 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20 78 20    0x0040   /* x 
1a80: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1a90: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
1aa0: 4d 49 54 20 20 20 20 20 20 30 78 30 31 30 30 20  MIT      0x0100 
1ab0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
1ac0: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
1ad0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
1ae0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
1af0: 20 20 30 78 30 32 30 30 20 20 20 2f 2a 20 78 3e    0x0200   /* x>
1b00: 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20  EXPR or x>=EXPR 
1b10: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
1b20: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f  efine WHERE_IDX_
1b30: 4f 4e 4c 59 20 20 20 20 20 20 20 30 78 30 38 30  ONLY       0x080
1b40: 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  0   /* Use index
1b50: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
1b60: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
1b70: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
1b80: 20 20 20 30 78 31 30 30 30 20 20 20 2f 2a 20 4f     0x1000   /* O
1b90: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
1ba0: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
1bb0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1bc0: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
1bd0: 20 20 20 30 78 32 30 30 30 20 20 20 2f 2a 20 53     0x2000   /* S
1be0: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1bf0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1c00: 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20  WHERE_UNIQUE    
1c10: 20 20 20 20 20 30 78 34 30 30 30 20 20 20 2f 2a       0x4000   /*
1c20: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
1c30: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
1c40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
1c50: 49 52 54 55 41 4c 54 41 42 4c 45 20 20 20 30 78  IRTUALTABLE   0x
1c60: 38 30 30 30 20 20 20 2f 2a 20 55 73 65 20 76 69  8000   /* Use vi
1c70: 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63  rtual-table proc
1c80: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
1c90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
1ca0: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
1cb0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cd0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1ce0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
1cf0: 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  C, Parse *pParse
1d00: 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65  ){.  pWC->pParse
1d10: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43   = pParse;.  pWC
1d20: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
1d30: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52 52 41  WC->nSlot = ARRA
1d40: 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74 61 74  YSIZE(pWC->aStat
1d50: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
1d60: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
1d70: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
1d80: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
1d90: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1da0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
1db0: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
1dc0: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
1dd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
1de0: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
1df0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
1e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e10: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1e20: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
1e30: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
1e40: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66  hereTerm *a;.  f
1e50: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
1e60: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
1e70: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
1e80: 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26    if( a->flags &
1e90: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
1ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eb0: 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78 70  prDelete(a->pExp
1ec0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1ed0: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
1ee0: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
1ef0: 73 71 6c 69 74 65 46 72 65 65 28 70 57 43 2d 3e  sqliteFree(pWC->
1f00: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1f10: 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 69   Add a new entri
1f20: 65 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  es to the WhereC
1f30: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
1f40: 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61    Increase the a
1f50: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61 63  llocated.** spac
1f60: 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
1f70: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20  **.** WARNING:  
1f80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
1f90: 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68  ht reallocate th
1fa0: 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  e space used to 
1fb0: 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65  store.** WhereTe
1fc0: 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65  rms.  All pointe
1fd0: 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73  rs to WhereTerms
1fe0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c   should be inval
1ff0: 69 64 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61  ided after.** ca
2000: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
2010: 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65  ne.  Such pointe
2020: 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74  rs may be reinit
2030: 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72  ialized by refer
2040: 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57  encing.** the pW
2050: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  C->a[] array..*/
2060: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2070: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68  eClauseInsert(Wh
2080: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2090: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
20a0: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
20b0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
20c0: 64 78 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e  dx;.  if( pWC->n
20d0: 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74  Term>=pWC->nSlot
20e0: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
20f0: 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61  m *pOld = pWC->a
2100: 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73  ;.    pWC->a = s
2110: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
2120: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
2130: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
2140: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
2150: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2160: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
2170: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
2180: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
2190: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
21a0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
21b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
21c0: 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 7d  ree(pOld);.    }
21d0: 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  .    pWC->nSlot 
21e0: 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65 72  *= 2;.  }.  pTer
21f0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
2200: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  = pWC->nTerm];. 
2210: 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b 0a 20   pWC->nTerm++;. 
2220: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
2230: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67  p;.  pTerm->flag
2240: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 54 65  s = flags;.  pTe
2250: 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  rm->pWC = pWC;. 
2260: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
2270: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69  = -1;.  return i
2280: 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dx;.}../*.** Thi
2290: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
22a0: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
22b0: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
22c0: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
22d0: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
22e0: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
22f0: 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72   by the AND oper
2300: 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ator or some oth
2310: 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73  er.** operator s
2320: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
2330: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54  op parameter.  T
2340: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
2350: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66  tructure.** is f
2360: 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74  illed with point
2370: 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73  ers to subexpres
2380: 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d  sions.  For exam
2390: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48  ple:.**.**    WH
23a0: 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20  ERE  a=='hello' 
23b0: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31  AND coalesce(b,1
23c0: 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21  1)<10 AND (c+12!
23d0: 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20  =d OR c==22).** 
23e0: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
23f0: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
2400: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  _________/     \
2410: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
2420: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
2430: 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20  slot[0]         
2440: 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20     slot[1]      
2450: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d           slot[2]
2460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
2470: 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
2480: 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61   in pExpr is una
2490: 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69  ltered.  All thi
24a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
24b0: 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d  s is make slot[]
24c0: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74   entries point t
24d0: 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77  o substructure w
24e0: 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a  ithin pExpr..**.
24f0: 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f  ** In the previo
2500: 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20  us sentence and 
2510: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20  in the diagram, 
2520: 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20  "slot[]" refers 
2530: 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43  to.** the WhereC
2540: 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e  lause.a[] array.
2550: 20 20 54 68 69 73 20 61 72 72 61 79 20 67 72 6f    This array gro
2560: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
2570: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
2580: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2590: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  E clause..*/.sta
25a0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70  tic void whereSp
25b0: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
25c0: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
25d0: 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 66  r, int op){.  if
25e0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
25f0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
2600: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
2610: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
2620: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
2630: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2640: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
2650: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
2660: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
2670: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
2680: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
2690: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
26a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
26b0: 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65 66  mask set.*/.#def
26c0: 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  ine initMaskSet(
26d0: 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c  P)  memset(P, 0,
26e0: 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a   sizeof(*P))../*
26f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
2700: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
2710: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
2720: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
2730: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
2740: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
2750: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2760: 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61 73   getMask(ExprMas
2770: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2780: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2790: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27a0: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
27b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
27c0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
27d0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
27e0: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
27f0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
2800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2810: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2820: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
2830: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
2840: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
2850: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
2860: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2870: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
2880: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
2890: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28a0: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
28b0: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
28c0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
28d0: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
28e0: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
28f0: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
2900: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
2910: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
2920: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
2930: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
2940: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
2950: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
2960: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
2970: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 52 52  MaskSet->n < ARR
2980: 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65 74 2d  AYSIZE(pMaskSet-
2990: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
29a0: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
29b0: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
29c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
29d0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65  outine walks (re
29e0: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
29f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
2a00: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
2a10: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
2a20: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
2a30: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
2a40: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
2a50: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  tree..**.** In o
2a60: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f  rder for this ro
2a70: 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74  utine to work, t
2a80: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2a90: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  ion must have.**
2aa0: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f   previously invo
2ab0: 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72 52  ked sqlite3ExprR
2ac0: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f 6e  esolveNames() on
2ad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2ae0: 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61    See.** the hea
2af0: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
2b00: 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
2b10: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2b20: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73  mation..** The s
2b30: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
2b40: 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65  eNames() routine
2b50: 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75  s looks for colu
2b60: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20  mn names and.** 
2b70: 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64  sets their opcod
2b80: 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  es to TK_COLUMN 
2b90: 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e 69  and their Expr.i
2ba0: 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a  Table fields to.
2bb0: 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72 73  ** the VDBE curs
2bc0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
2bd0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
2be0: 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74  utine just has t
2bf0: 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74  o.** translate t
2c00: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2c10: 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76  s into bitmask v
2c20: 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c  alues and OR all
2c30: 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73  .** the bitmasks
2c40: 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74   together..*/.st
2c50: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2c60: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
2c70: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 45 78  ExprMaskSet*, Ex
2c80: 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
2c90: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
2ca0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45 78  ectTableUsage(Ex
2cb0: 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  prMaskSet*, Sele
2cc0: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
2cd0: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
2ce0: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2cf0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
2d00: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
2d10: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
2d20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2d30: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
2d40: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
2d50: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
2d60: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
2d70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
2d80: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
2d90: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2da0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
2db0: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
2dc0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2dd0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
2de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
2df0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2e00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2e10: 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ist);.  mask |= 
2e20: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
2e30: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2e40: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
2e50: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
2e60: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2e70: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 45  ListTableUsage(E
2e80: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2e90: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
2ea0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
2eb0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
2ec0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
2ed0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2ee0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2ef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
2f00: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
2f10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
2f20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
2f30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f40: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61  turn mask;.}.sta
2f50: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2f60: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
2f70: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2f80: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
2f90: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
2fa0: 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d 3d 30  ask;.  if( pS==0
2fb0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 30   ){.    mask = 0
2fc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
2fd0: 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ask = exprListTa
2fe0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2ff0: 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a  t, pS->pEList);.
3000: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3010: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3020: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72  MaskSet, pS->pGr
3030: 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  oupBy);.    mask
3040: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3050: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3060: 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a   pS->pOrderBy);.
3070: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3080: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3090: 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29  Set, pS->pWhere)
30a0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
30b0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
30c0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69  skSet, pS->pHavi
30d0: 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ng);.  }.  retur
30e0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
30f0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
3100: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
3110: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
3120: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
3130: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
3140: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
3150: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3160: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
3170: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
3180: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
3190: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
31a0: 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IN"..*/.static i
31b0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
31c0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
31d0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
31e0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
31f0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
3200: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
3210: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3220: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
3230: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
3240: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3250: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
3260: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
3270: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
3280: 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f 2a 0a  <=TK_GE);.}../*.
3290: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
32a0: 63 74 73 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a  cts of type T..*
32b0: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
32c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
32d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
32e0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
32f0: 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f 70 65 72  comparision oper
3300: 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f  ator.  Expressio
3310: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ns of the form "
3320: 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63  X op Y".** are c
3330: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59  onverted into "Y
3340: 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74 61 74 69   op X"..*/.stati
3350: 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75  c void exprCommu
3360: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
3370: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
3380: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
3390: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
33a0: 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28 43 6f  _IN );.  SWAP(Co
33b0: 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52  llSeq*,pExpr->pR
33c0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70  ight->pColl,pExp
33d0: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29  r->pLeft->pColl)
33e0: 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  ;.  SWAP(Expr*,p
33f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
3400: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
3410: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3420: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
3430: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
3440: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3450: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
3460: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3470: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
3480: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
3490: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
34a0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
34b0: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
34c0: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
34d0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
34e0: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
34f0: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
3500: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
3510: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
3520: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
3530: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
3540: 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  int operatorMask
3550: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20  (int op){.  int 
3560: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
3570: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
3580: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
3590: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
35a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d    }else{.    c =
35b0: 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45   WO_EQ<<(op-TK_E
35c0: 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  Q);.  }.  assert
35d0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
35e0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
35f0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
3600: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
3610: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
3620: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
3630: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3640: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
3650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3660: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
3670: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
3680: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
3690: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
36a0: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
36b0: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
36c0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
36d0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
36e0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
36f0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
3700: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
3710: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
3720: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
3730: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
3740: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
3750: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
3760: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
3770: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
3780: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3790: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
37a0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
37b0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
37c0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
37d0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
37e0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
37f0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
3800: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
3810: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3830: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
3840: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
3850: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
3860: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3870: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
3880: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
3890: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
38a0: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
38b0: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31  his mask */.  u1
38c0: 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  6 op,           
38d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
38e0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
38f0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
3900: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
3920: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
3930: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
3940: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
3950: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
3960: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
3970: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
3980: 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
3990: 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  m; k; k--, pTerm
39a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
39b0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
39c0: 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28  iCur.       && (
39d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
39e0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
39f0: 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72  0.       && pTer
3a00: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  m->leftColumn==i
3a10: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26  Column.       &&
3a20: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3a30: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
3a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 75  ){.      if( iCu
3a50: 72 3e 3d 30 20 26 26 20 70 49 64 78 20 29 7b 0a  r>=0 && pIdx ){.
3a60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
3a70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
3a80: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
3a90: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
3aa0: 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20   char idxaff;.  
3ab0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3ac0: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
3ad0: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
3ae0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61 66  ;..        idxaf
3af0: 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  f = pIdx->pTable
3b00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
3b10: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
3b20: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
3b30: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
3b40: 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74  , idxaff) ) cont
3b50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 43  inue;.        pC
3b60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
3b70: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3b80: 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20   pX->pLeft);.   
3b90: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
3ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3bb0: 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20   pX->pRight ){. 
3bc0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
3be0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
3bf0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
3c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3c10: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3c30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
3c40: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
3c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3c60: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3c70: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
3c80: 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75   && pIdx->aiColu
3c90: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
3ca0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 61  j++){}.        a
3cb0: 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e  ssert( j<pIdx->n
3cc0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
3cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3ce0: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3cf0: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
3d00: 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j]) ) continue;.
3d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
3d20: 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20  turn pTerm;.    
3d30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3d40: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3d50: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3d60: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
3d70: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 45  lyze(SrcList*, E
3d80: 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57 68 65  xprMaskSet*, Whe
3d90: 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b  reClause*, int);
3da0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
3db0: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
3dc0: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
3dd0: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
3de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3df0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
3e00: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3e10: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
3e20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3e30: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
3e40: 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 74  pMaskSet,   /* t
3e50: 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  able masks */.  
3e60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
3e80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
3e90: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
3ea0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
3eb0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
3ec0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
3ed0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
3ee0: 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65 74 2c  bList, pMaskSet,
3ef0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
3f00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f10: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
3f20: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
3f30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
3f40: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
3f50: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
3f60: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
3f70: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
3f80: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
3f90: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
3fa0: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
3fb0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
3fc0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
3fd0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
3fe0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
3ff0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
4000: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
4010: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
4020: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
4030: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
4040: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
4050: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
4060: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73 71  LikeOrGlob(.  sq
4070: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
4080: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4090: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
40a0: 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ,      /* Test t
40b0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
40c0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65  /.  int *pnPatte
40d0: 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  rn,   /* Number 
40e0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
40f0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
4100: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  s */.  int *pisC
4110: 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75 65  omplete  /* True
4120: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
4130: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
4140: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
4150: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
4160: 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20 2a  har *z;.  Expr *
4170: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
4180: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4190: 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b  t;.  int c, cnt;
41a0: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20  .  int noCase;. 
41b0: 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20 43   char wc[3];.  C
41c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
41d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
41e0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
41f0: 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65 2c   pExpr, &noCase,
4200: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
4210: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
4220: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
4230: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ;.  pRight = pLi
4240: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
4250: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
4260: 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  !=TK_STRING ){. 
4270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4280: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
4290: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
42a0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
42b0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
42c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
42d0: 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70  pColl = pLeft->p
42e0: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f 6c  Coll;.  if( pCol
42f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  l==0 ){.    pCol
4300: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
4310: 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43  l;.  }.  if( (pC
4320: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
4330: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c  E_COLL_BINARY ||
4340: 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20 20   noCase) &&.    
4350: 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d    (pColl->type!=
4360: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41  SQLITE_COLL_NOCA
4370: 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20 29  SE || !noCase) )
4380: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4390: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
43a0: 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74 29  uoteExpr(pRight)
43b0: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29  ;.  z = (char *)
43c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b  pRight->token.z;
43d0: 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 28 63  .  for(cnt=0; (c
43e0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
43f0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
4400: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 3b  [1] && c!=wc[2];
4410: 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66 28 20   cnt++){}.  if( 
4420: 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28  cnt==0 || 255==(
4430: 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20 20  u8)z[cnt] ){.   
4440: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4450: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
4460: 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26  z[cnt]==wc[0] &&
4470: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
4480: 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e 74  *pnPattern = cnt
4490: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
44c0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
44d0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
44e0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
44f0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
4500: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
4510: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
4520: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
4530: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
4540: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
4550: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
4560: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
4570: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
4580: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
4590: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
45a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
45b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
45c0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
45d0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
45e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
45f0: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
4600: 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 20 73  >token.n!=5 || s
4610: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
4620: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
4630: 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20  atch",5)!=0 ){. 
4640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4650: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
4660: 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4690: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
46a0: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
46b0: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
46c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
46d0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
46e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
46f0: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
4700: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
4710: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
4720: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
4730: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
4740: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
4750: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
4760: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
4770: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
4780: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
4790: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
47a0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
47b0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
47c0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
47d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
47e0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
47f0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
4800: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
4810: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.}.../*.** The
4820: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
4830: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
4840: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
4850: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
4860: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
4870: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
4880: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
4890: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
48a0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
48b0: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
48c0: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
48d0: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
48e0: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
48f0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
4900: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4910: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4920: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
4930: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
4940: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
4950: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
4960: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20  p> <expr>".  If 
4970: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4980: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4990: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
49a0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
49b0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
49c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
49d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
49e0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
49f0: 65 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65  ew virtual expre
4a00: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
4a10: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20  m.** "Y <op> X" 
4a20: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4a30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
4a40: 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61   analyzed separa
4a50: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
4a60: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4a70: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
4a80: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
4a90: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
4aa0: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
4ab0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20  t *pMaskSet,    
4ac0: 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a  /* table masks *
4ad0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
4ae0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
4af0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4b00: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
4b10: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
4b20: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
4b30: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
4b40: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
4b50: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
4b60: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
4b70: 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  ;.  Expr *pExpr 
4b80: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
4b90: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
4ba0: 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Left;.  Bitmask 
4bb0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74  prereqAll;.  int
4bc0: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74   nPattern;.  int
4bd0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20   isComplete;..  
4be0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
4bf0: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
4c00: 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  rn;.  prereqLeft
4c10: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
4c20: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
4c30: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
4c40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
4c50: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
4c60: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
4c70: 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  0 );.    pTerm->
4c80: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
4c90: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4ca0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4cb0: 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20  ->pList).       
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54     | exprSelectT
4ce0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4cf0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  et, pExpr->pSele
4d00: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
4d10: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
4d20: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
4d30: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4d40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
4d50: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
4d60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4d70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4d80: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
4d90: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4da0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
4db0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
4dc0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
4dd0: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
4de0: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a  JoinTable);.  }.
4df0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
4e00: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
4e10: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
4e20: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
4e30: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
4e40: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
4e50: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
4e60: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
4e70: 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70  op) && (pTerm->p
4e80: 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65  rereqRight & pre
4e90: 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20  reqLeft)==0 ){. 
4ea0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
4eb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
4ec0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
4ed0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4ee0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
4ef0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4f00: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
4f10: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
4f20: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
4f30: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
4f40: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
4f50: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
4f60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
4f70: 72 61 74 6f 72 4d 61 73 6b 28 70 45 78 70 72 2d  ratorMask(pExpr-
4f80: 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >op);.    }.    
4f90: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
4fa0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
4fb0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65  UMN ){.      Whe
4fc0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20  reTerm *pNew;.  
4fd0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a      Expr *pDup;.
4fe0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
4ff0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
5000: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
5010: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
5020: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
5030: 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20  Dup(pExpr);.    
5040: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
5050: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
5060: 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56  WC, pDup, TERM_V
5070: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
5080: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66  MIC);.        if
5090: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65  ( idxNew==0 ) re
50a0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e  turn;.        pN
50b0: 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  ew = &pWC->a[idx
50c0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  New];.        pN
50d0: 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew->iParent = id
50e0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
50f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5100: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
5110: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
5120: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   1;.        pTer
5130: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
5140: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
5150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
5160: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
5170: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
5180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5190: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75 70  exprCommute(pDup
51a0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
51b0: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
51c0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
51d0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
51e0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
51f0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  ->leftColumn = p
5200: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
5210: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
5220: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c  qRight = prereqL
5230: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
5240: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
5250: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
5260: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
5270: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
5280: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
5290: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
52a0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
52b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
52c0: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
52d0: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
52e0: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
52f0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
5300: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
5310: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
5320: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
5330: 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  lements..  */.  
5340: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
5350: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
5360: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
5370: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
5380: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
5390: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
53a0: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
53b0: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
53c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
53d0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
53e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
53f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
5400: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
5410: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
5420: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
5430: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
5440: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
5450: 28 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33  (ops[i], sqlite3
5460: 45 78 70 72 44 75 70 28 70 45 78 70 72 2d 3e 70  ExprDup(pExpr->p
5470: 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20  Left),.         
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
54a0: 75 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  up(pList->a[i].p
54b0: 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  Expr), 0);.     
54c0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
54d0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
54e0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
54f0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5500: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70  AMIC);.      exp
5510: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
5520: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
5530: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
5540: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
5550: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
5560: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
5570: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
5580: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
5590: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
55a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
55b0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
55c0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
55d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
55e0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
55f0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
5600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5610: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
5620: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65  Attempt to conve
5630: 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  rt OR-connected 
5640: 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e  terms into an IN
5650: 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61   operator so tha
5660: 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20  t.  ** they can 
5670: 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69  make use of indi
5680: 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20  ces.  Example:. 
5690: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
56a0: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
56b0: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
56c0: 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  expr3.  **.  ** 
56d0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
56e0: 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  o.  **.  **     
56f0: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
5700: 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20  r2,expr3).  **. 
5710: 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
5720: 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d  ation must be om
5730: 69 74 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55  itted if OMIT_SU
5740: 42 51 55 45 52 59 20 69 73 20 64 65 66 69 6e 65  BQUERY is define
5750: 64 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74  d because.  ** t
5760: 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
5770: 74 68 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61  the the IN opera
5780: 74 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 73  tor is part of s
5790: 75 62 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ub-queries..  */
57a0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
57b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
57c0: 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20      int ok;.    
57d0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e  int i, j;.    in
57e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73  t iColumn, iCurs
57f0: 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61  or;.    WhereCla
5800: 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65  use sOr;.    Whe
5810: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
5820: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
5830: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
5840: 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29  RM_DYNAMIC)==0 )
5850: 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  ;.    whereClaus
5860: 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d  eInit(&sOr, pWC-
5870: 3e 70 50 61 72 73 65 29 3b 0a 20 20 20 20 77 68  >pParse);.    wh
5880: 65 72 65 53 70 6c 69 74 28 26 73 4f 72 2c 20 70  ereSplit(&sOr, p
5890: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
58a0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
58b0: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
58c0: 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65   &sOr);.    asse
58d0: 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 30 20  rt( sOr.nTerm>0 
58e0: 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  );.    j = 0;.  
58f0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 43 6f 6c    do{.      iCol
5900: 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c  umn = sOr.a[j].l
5910: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
5920: 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61   iCursor = sOr.a
5930: 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  [j].leftCursor;.
5940: 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75 72 73        ok = iCurs
5950: 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72  or>=0;.      for
5960: 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20  (i=sOr.nTerm-1, 
5970: 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69  pOrTerm=sOr.a; i
5980: 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20  >=0 && ok; i--, 
5990: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
59a0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
59b0: 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45  >eOperator!=WO_E
59c0: 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  Q ){.          g
59d0: 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69  oto or_not_possi
59e0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ble;.        }. 
59f0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
5a00: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
5a10: 69 43 75 72 73 6f 72 20 26 26 20 70 4f 72 54 65  iCursor && pOrTe
5a20: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  rm->leftColumn==
5a30: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
5a40: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
5a50: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
5a60: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
5a70: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66   if( (pOrTerm->f
5a80: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
5a90: 45 44 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ED)!=0 ||.      
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
5ab0: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5ac0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
5ad0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
5ae0: 20 20 20 20 20 20 20 20 20 20 28 73 4f 72 2e 61            (sOr.a
5af0: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
5b00: 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  t].flags & TERM_
5b10: 4f 52 5f 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20  OR_OK)!=0) ){.  
5b20: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
5b30: 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  >flags &= ~TERM_
5b40: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
5b50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5b60: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ok = 0;.        
5b70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
5b80: 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f  hile( !ok && (sO
5b90: 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26  r.a[j++].flags &
5ba0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30   TERM_COPIED)!=0
5bb0: 20 26 26 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20   && j<sOr.nTerm 
5bc0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20 29 7b  );.    if( ok ){
5bd0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
5be0: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pList = 0;.    
5bf0: 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70    Expr *pNew, *p
5c00: 44 75 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Dup;.      for(i
5c10: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
5c20: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
5c30: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
5c40: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
5c50: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
5c60: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
5c70: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
5c80: 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e;.        pDup 
5c90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5ca0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
5cb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
5cc0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5cd0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5ce0: 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b  pList, pDup, 0);
5cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5d00: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
5d10: 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  r(TK_COLUMN, 0, 
5d20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
5d30: 20 70 44 75 70 20 29 7b 0a 20 20 20 20 20 20 20   pDup ){.       
5d40: 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20   pDup->iTable = 
5d50: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
5d60: 20 70 44 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pDup->iColumn =
5d70: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20   iColumn;.      
5d80: 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  }.      pNew = s
5d90: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
5da0: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
5db0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
5dc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
5dd0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
5de0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
5df0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
5e00: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
5e10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  ist = pList;.   
5e20: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
5e30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
5e40: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
5e50: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
5e60: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65  AMIC);.        e
5e70: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
5e80: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
5e90: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  idxNew);.       
5ea0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
5eb0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
5ec0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
5ed0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
5ee0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
5ef0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
5f00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5f20: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
5f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5f40: 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65  .or_not_possible
5f50: 3a 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  :.    whereClaus
5f60: 65 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20  eClear(&sOr);.  
5f70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5f80: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
5f90: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
5fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5fb0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
5fc0: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
5fd0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
5fe0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
5ff0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
6000: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
6010: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  r..  */.  if( is
6020: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e  LikeOrGlob(pWC->
6030: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
6040: 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69  r, &nPattern, &i
6050: 73 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20  sComplete) ){.  
6060: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
6070: 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72  pRight;.    Expr
6080: 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b   *pStr1, *pStr2;
6090: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
60a0: 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32  xpr1, *pNewExpr2
60b0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
60c0: 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20  1, idxNew2;..   
60d0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
60e0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
60f0: 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  r;.    pRight = 
6100: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
6110: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  0].pExpr;.    pS
6120: 74 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr1 = sqlite3Exp
6130: 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20  r(TK_STRING, 0, 
6140: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6150: 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71  Str1 ){.      sq
6160: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
6170: 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pStr1->token, &p
6180: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
6190: 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65       pStr1->toke
61a0: 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a  n.n = nPattern;.
61b0: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20      }.    pStr2 
61c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
61d0: 28 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28  (pStr1);.    if(
61e0: 20 70 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20   pStr2 ){.      
61f0: 61 73 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74  assert( pStr2->t
6200: 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20  oken.dyn );.    
6210: 20 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32    ++*(u8*)&pStr2
6220: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65  ->token.z[nPatte
6230: 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rn-1];.    }.   
6240: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
6250: 69 74 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20  ite3Expr(TK_GE, 
6260: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6270: 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29  Left), pStr1, 0)
6280: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
6290: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
62a0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
62b0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
62c0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
62d0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
62e0: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
62f0: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
6300: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
6310: 69 74 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20  ite3Expr(TK_LT, 
6320: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6330: 4c 65 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29  Left), pStr2, 0)
6340: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
6350: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
6360: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
6370: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
6380: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
6390: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
63a0: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
63b0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
63c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
63d0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
63e0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
63f0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
6400: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
6410: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
6420: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
6430: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
6440: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
6450: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
6460: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
6470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
6480: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
6490: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
64a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
64b0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
64c0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
64d0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
64e0: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
64f0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
6510: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
6520: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
6530: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
6540: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
6550: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
6560: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
6570: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
6580: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
6590: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
65a0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
65b0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
65c0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
65d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
65e0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
65f0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
6600: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
6610: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
6620: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
6630: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
6640: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
6650: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
6660: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
6670: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
6680: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
6690: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
66a0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
66b0: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
66c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
66d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
66e0: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
66f0: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
6700: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6710: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
6720: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
6730: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
6740: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
6750: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
6760: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
6770: 33 45 78 70 72 28 54 4b 5f 4d 41 54 43 48 2c 20  3Expr(TK_MATCH, 
6780: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  0, sqlite3ExprDu
6790: 70 28 70 52 69 67 68 74 29 2c 20 30 29 3b 0a 20  p(pRight), 0);. 
67a0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
67b0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
67c0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
67d0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
67e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
67f0: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
6800: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
6810: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
6820: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
6830: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
6840: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
6850: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
6860: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
6870: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  m->leftColumn = 
6880: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
6890: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
68a0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
68b0: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
68c0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
68d0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
68e0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
68f0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 54  dxNew];.      pT
6900: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
6910: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  .      pTerm->fl
6920: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
6930: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
6940: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
6950: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
6960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6970: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6980: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
6990: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
69a0: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
69b0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
69c0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
69d0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
69e0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
69f0: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
6a00: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
6a10: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
6a20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6a30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6a40: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
6a50: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
6a60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
6a70: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
6a80: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
6a90: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
6aa0: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
6ab0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
6ac0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
6ad0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
6ae0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
6af0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
6b00: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
6b10: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
6b20: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
6b30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6b40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
6b50: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
6b60: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
6b70: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
6b80: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
6b90: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
6ba0: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
6bb0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
6bc0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
6bd0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
6be0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
6bf0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
6c00: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
6c10: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
6c20: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
6c30: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
6c40: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
6c50: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
6c60: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
6c70: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
6c80: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
6c90: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
6ca0: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
6cb0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
6cc0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
6cd0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6ce0: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
6cf0: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
6d00: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
6d10: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
6d20: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
6d30: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
6d40: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
6d50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6d60: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6d70: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
6d80: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
6d90: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
6da0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
6db0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
6dc0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
6dd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6de0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
6df0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
6e00: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
6e10: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
6e20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
6e30: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
6e40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6e50: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
6e60: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
6e70: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
6e80: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
6e90: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
6ea0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
6eb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
6ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6ee0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
6ef0: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f10: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
6f20: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
6f30: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
6f40: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
6f70: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
6f80: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6f90: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
6fa0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
6fb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6fd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6fe0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
6ff0: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
7000: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
7010: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
7020: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
7030: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
7040: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7050: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
7060: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
7070: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ndex..  */.  for
7080: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  (i=j=0, pTerm=pO
7090: 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65  rderBy->a; j<nTe
70a0: 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43  rm && i<pIdx->nC
70b0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
70c0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
70d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
70e0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44  ssion of the ORD
70f0: 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20  ER BY pTerm */. 
7100: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
7110: 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l;    /* The col
7120: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7130: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  of pExpr */.    
7140: 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  int termSortOrde
7150: 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72  r; /* Sort order
7160: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
7170: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
7180: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
7190: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
71a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
71b0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
71c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
71d0: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
71e0: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
71f0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
7200: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
7210: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
7220: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
7230: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
7240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7250: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
7260: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7270: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
7280: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
7290: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
72a0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69  pDfltColl;.    i
72b0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
72c0: 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n!=pIdx->aiColum
72d0: 6e 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20 20  n[i] || .       
72e0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
72f0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
7300: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29  dx->azColl[i]) )
7310: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
7320: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
7330: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
7340: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
7350: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
7360: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
7370: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
7380: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
7390: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
73a0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
73b0: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
73c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
73d0: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
73e0: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
73f0: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
7400: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
7410: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
7440: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
7450: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
7460: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
7470: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
7480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
7490: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
74a0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
74b0: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
74c0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
74d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
74e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
74f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
7500: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
7510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
7520: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
7530: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
7540: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
7550: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f  ssert( pIdx->aSo
7560: 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c 7c  rtOrder[i]==0 ||
7570: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
7580: 72 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20 74  r[i]==1 );.    t
7590: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  ermSortOrder = p
75a0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
75b0: 69 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  i] ^ pTerm->sort
75c0: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
75d0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
75e0: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
75f0: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
7600: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
7610: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
7620: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
7630: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
7640: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
7650: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
7660: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
7670: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
7680: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
7690: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
76a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
76b0: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
76c0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
76d0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
76e0: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  m++;.  }..  /* T
76f0: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
7700: 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
7710: 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   if all terms of
7720: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7730: 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ause.  ** are co
7740: 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  vered..  */.  if
7750: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
7760: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
7770: 72 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65 74  rder!=0;.    ret
7780: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7790: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
77a0: 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73  Check table to s
77b0: 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20  ee if the ORDER 
77c0: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72  BY clause in pOr
77d0: 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74  derBy can be sat
77e0: 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72  isfied.** by sor
77f0: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66  ting in order of
7800: 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20   ROWID.  Return 
7810: 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73  true if so and s
7820: 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a  et *pbRev to be.
7830: 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65  ** true for reve
7840: 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61  rse ROWID and fa
7850: 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20  lse for forward 
7860: 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a  ROWID order..*/.
7870: 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61  static int sorta
7880: 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e  bleByRowid(.  in
7890: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
78a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
78b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
78c0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
78d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
78e0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
78f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7900: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  e */.  int *pbRe
7910: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
7920: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
7930: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
7940: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  /.){.  Expr *p;.
7950: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
7960: 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
7970: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
7980: 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70  xpr>0 );.  p = p
7990: 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
79a0: 78 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  xpr;.  if( pOrde
79b0: 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  rBy->nExpr==1 &&
79c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
79d0: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
79e0: 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 26  base.          &
79f0: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31  & p->iColumn==-1
7a00: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
7a10: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
7a20: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72  sortOrder;.    r
7a30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
7a40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7a50: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
7a60: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
7a70: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
7a80: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
7a90: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
7aa0: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
7ab0: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
7ac0: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
7ad0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
7ae0: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
7af0: 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77  ing operatings w
7b00: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
7b10: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
7b20: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
7b30: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
7b40: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
7b50: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
7b60: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
7b70: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
7b80: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
7b90: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
7ba0: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
7bb0: 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
7bc0: 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
7bd0: 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
7be0: 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
7bf0: 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 23  eturn logN;.}..#
7c00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7c10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7c20: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
7c30: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
7c40: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
7c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
7c60: 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
7c70: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
7c80: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
7c90: 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
7ca0: 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
7cb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
7cc0: 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
7cd0: 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
7ce0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
7cf0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7d00: 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
7d10: 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
7d20: 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
7d30: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
7d40: 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
7d50: 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
7d60: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
7d70: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
7d80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
7d90: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
7da0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7db0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
7dc0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
7dd0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
7de0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
7df0: 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
7e00: 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
7e10: 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
7e20: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7e30: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
7e40: 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
7e50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
7e60: 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
7e70: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
7e80: 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
7e90: 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
7ea0: 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
7eb0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
7ec0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7ed0: 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
7ee0: 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
7ef0: 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
7f00: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
7f10: 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
7f20: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7f40: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7f50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
7f60: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f80: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
7f90: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
7fa0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
7fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
7fc0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
7fd0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
7fe0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
7ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8000: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
8010: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
8020: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
8030: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8050: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
8060: 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79  */.  int orderBy
8070: 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
8080: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
8090: 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20  e can potential 
80a0: 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sort */.  sqlite
80b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
80c0: 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65  pIdxInfo /* Inde
80d0: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
80e0: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
80f0: 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ex */.){.  Table
8100: 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70   *pTab = pSrc->p
8110: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Tab;.  sqlite3_i
8120: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
8130: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
8140: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
8150: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
8160: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
8170: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
8180: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
8190: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
81a0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
81b0: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
81c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
81d0: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
81e0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
81f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
8200: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8210: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
8220: 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
8230: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
8240: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
8250: 20 66 6f 72 20 74 68 69 73 20 76 69 72 74 75 61   for this virtua
8260: 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c  l table, then al
8270: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20  locate.  ** and 
8280: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
8290: 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  w.  */.  pIdxInf
82a0: 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a  o = *ppIdxInfo;.
82b0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
82c0: 30 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  0 ){.    WhereTe
82d0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 69  rm *pTerm;.    i
82e0: 6e 74 20 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 2f  nt nTerm;..    /
82f0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
8300: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
8310: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
8320: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
8330: 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  g.    ** to this
8340: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
8350: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72  /.    for(i=nTer
8360: 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
8370: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
8380: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
8390: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
83a0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
83b0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
83c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
83d0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
83e0: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e  tor==WO_IN ) con
83f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65  tinue;.      nTe
8400: 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rm++;.    }..   
8410: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
8420: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
8430: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
8440: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
8450: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
8460: 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
8470: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
8480: 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
8490: 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71  of.    ** the sq
84a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
84b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
84c0: 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  */.    nOrderBy 
84d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  = 0;.    if( pOr
84e0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66  derBy ){.      f
84f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
8500: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
8510: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
8520: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
8530: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8540: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
8550: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
8560: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
8570: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
8580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8590: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64       if( i==pOrd
85a0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
85b0: 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20         nOrderBy 
85c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
85d0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
85e0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
85f0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
8600: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
8610: 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  re.    */.    pI
8620: 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  dxInfo = sqliteM
8630: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
8640: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
8670: 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
8680: 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
8690: 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
86c0: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
86d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
86e0: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
86f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8700: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
8710: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20   memory");.     
8720: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20   return 0.0;.   
8730: 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66   }.    *ppIdxInf
8740: 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  o = pIdxInfo;.. 
8750: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
8760: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
8770: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
8780: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8790: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  e contains.    *
87a0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
87b0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
87c0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
87d0: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
87e0: 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69  om.    ** changi
87f0: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
8800: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
8810: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
8820: 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  der to.    ** in
8830: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
8840: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
8850: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
8860: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8870: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
8880: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20  pIdxInfo[1];.   
8890: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
88a0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
88b0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
88c0: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
88d0: 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74      pUsage = (st
88e0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
88f0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
8900: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
8910: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20  y[nOrderBy];.   
8920: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
8930: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
8940: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e   nTerm;.    *(in
8950: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
8960: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
8970: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
8980: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
8990: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
89a0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
89b0: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
89c0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
89d0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
89e0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
89f0: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
8a00: 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75  erBy;.    *(stru
8a10: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8a20: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
8a30: 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
8a40: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
8a50: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
8aa0: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70      for(i=j=0, p
8ab0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
8ac0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
8ad0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
8ae0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
8af0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
8b00: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
8b10: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
8b20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
8b30: 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_IN ) continue;
8b40: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
8b50: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
8b60: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  rm->leftColumn;.
8b70: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
8b80: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
8b90: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  i;.      pIdxCon
8ba0: 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d  s[j].op = pTerm-
8bb0: 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
8bc0: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
8bd0: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
8be0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
8bf0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
8c00: 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
8c10: 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
8c20: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8c30: 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
8c40: 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
8c50: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
8c60: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
8c70: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
8c80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
8c90: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
8ca0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
8cb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8cc0: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
8cd0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8ce0: 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LT );.      ass
8cf0: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
8d00: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8d10: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  INT_LE );.      
8d20: 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
8d30: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8d40: 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
8d50: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
8d60: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8d70: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
8d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8d90: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
8da0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8db0: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61  MATCH );.      a
8dc0: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
8dd0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
8de0: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
8df0: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
8e00: 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b  H) );.      j++;
8e10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
8e20: 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
8e30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
8e40: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8e50: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8e60: 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42        pIdxOrderB
8e70: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
8e80: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
8e90: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
8ea0: 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
8eb0: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
8ec0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
8ed0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
8ee0: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nt, the sqlite3_
8ef0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8f00: 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e  ture that pIdxIn
8f10: 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74  fo points.  ** t
8f20: 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  o will have been
8f30: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69   initialized, ei
8f40: 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20  ther during the 
8f50: 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
8f60: 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e  on or.  ** durin
8f70: 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76  g some prior inv
8f80: 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65  ocation.  Now we
8f90: 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75   just have to cu
8fa0: 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a  stomize the.  **
8fb0: 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78   details of pIdx
8fc0: 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72  Info for the cur
8fd0: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
8fe0: 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20  and pass it to. 
8ff0: 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   ** xBestIndex..
9000: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    */..  /* The m
9010: 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  odule name must 
9020: 62 65 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  be defined */.  
9030: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a  assert( pTab->az
9040: 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61  ModuleArg && pTa
9050: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
9060: 5d 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  ] );.  if( pTab-
9070: 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20  >pVtab==0 ){.   
9080: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9090: 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69  (pParse, "undefi
90a0: 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f  ned module %s fo
90b0: 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20  r table %s",.   
90c0: 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64       pTab->azMod
90d0: 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d  uleArg[0], pTab-
90e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
90f0: 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20  urn 0.0;.  }..  
9100: 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73  /* Set the aCons
9110: 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
9120: 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69  fields and initi
9130: 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20  alize all .  ** 
9140: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
9150: 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
9160: 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b   ** aConstraint[
9170: 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65  ].usable is true
9180: 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
9190: 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
91a0: 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20  -hand.  ** side 
91b0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65  contains only re
91c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
91d0: 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
91e0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  f the current.  
91f0: 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ** table.  In ot
9200: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
9210: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
9220: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
9230: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
9240: 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20   column = expr. 
9250: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20   **.  ** and we 
9260: 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61  are evaluating a
9270: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
9280: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f  constraint on co
9290: 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e  lumn is .  ** on
92a0: 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20  ly valid if all 
92b0: 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
92c0: 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20  d in expr occur 
92d0: 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
92e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
92f0: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e  ntaining column.
9300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  **.  ** The a
9310: 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72  Constraints[] ar
9320: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ray contains ent
9330: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  ries for all con
9340: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e  straints.  ** on
9350: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
9360: 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65  le.  That way we
9370: 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f   only have to co
9380: 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20  mpute it once.  
9390: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77  ** even though w
93a0: 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70  e might try to p
93b0: 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64  ick the best ind
93c0: 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ex multiple time
93d0: 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68  s..  ** For each
93e0: 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b   attempt at pick
93f0: 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68  ing an index, th
9400: 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  e order of table
9410: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  s in the.  ** jo
9420: 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66  in might be diff
9430: 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65  erent so we have
9440: 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
9450: 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20  e usable flag.  
9460: 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  ** each time..  
9470: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
9480: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
9490: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
94a0: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
94b0: 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55  Constraint;.  pU
94c0: 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
94d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
94e0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
94f0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
9500: 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
9510: 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d  Cons++){.    j =
9520: 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
9530: 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72  Offset;.    pTer
9540: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
9550: 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
9560: 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d 3e  able =  (pTerm->
9570: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
9580: 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d 0a  tReady)==0;.  }.
9590: 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
95a0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
95b0: 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
95c0: 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
95d0: 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
95e0: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
95f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
9600: 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
9610: 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78  Str);.  }.  pIdx
9620: 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
9630: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
9640: 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78  xNum = 0;.  pIdx
9650: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
9660: 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  IdxStr = 0;.  pI
9670: 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
9680: 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70  onsumed = 0;.  p
9690: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
96a0: 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
96b0: 42 49 47 5f 44 42 4c 3b 0a 20 20 6e 4f 72 64 65  BIG_DBL;.  nOrde
96c0: 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  rBy = pIdxInfo->
96d0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
96e0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
96f0: 42 79 20 26 26 20 21 6f 72 64 65 72 42 79 55 73  By && !orderByUs
9700: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e  able ){.    *(in
9710: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
9720: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
9730: 20 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70    pTab->pVtab->p
9740: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
9750: 65 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20  ex(pTab->pVtab, 
9760: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 2a 28 69  pIdxInfo);.  *(i
9770: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
9780: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
9790: 42 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64  By;.  return pId
97a0: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
97b0: 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Cost;.}.#endif /
97c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
97d0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
97e0: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65  *.** Find the be
97f0: 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63  st index for acc
9800: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
9810: 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75  lar table.  Retu
9820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
9830: 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c  to the index, fl
9840: 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ags that describ
9850: 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20  e how the index 
9860: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20  should be used, 
9870: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
9880: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
9890: 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22  aints, and the "
98a0: 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69  cost" for this i
98b0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
98c0: 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65  lowest cost inde
98d0: 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73  x wins.  The cos
98e0: 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  t is an estimate
98f0: 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   of the amount o
9900: 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73  f.** CPU and dis
9910: 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72  k I/O need to pr
9920: 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
9930: 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65  t using the sele
9940: 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46  cted index..** F
9950: 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
9960: 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
9970: 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
9980: 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
9990: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
99a0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
99b0: 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
99c0: 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
99d0: 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
99e0: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
99f0: 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
9a00: 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
9a10: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
9a20: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
9a30: 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
9a40: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
9a50: 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
9a60: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
9a70: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
9a80: 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61   bestIndex(.  Pa
9a90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9ab0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
9ac0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9ad0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9ae0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
9af0: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
9b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
9b10: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
9b20: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
9b30: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
9b40: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
9b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
9b60: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
9b70: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
9b80: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
9b90: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
9ba0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
9bb0: 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
9bc0: 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78   Index **ppIndex
9bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9be0: 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f  Make *ppIndex po
9bf0: 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74 20  int to the best 
9c00: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  index */.  int *
9c10: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
9c20: 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c         /* Put fl
9c30: 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74  ags describing t
9c40: 68 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70  his choice in *p
9c50: 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  Flags */.  int *
9c60: 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20  pnEq            
9c70: 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68         /* Put th
9c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
9c90: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
9ca0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68   here */.){.  Wh
9cb0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
9cc0: 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78    Index *bestIdx
9cd0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
9ce0: 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65   Index that give
9cf0: 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  s the lowest cos
9d00: 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f  t */.  double lo
9d10: 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
9d20: 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
9d30: 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20  f using bestIdx 
9d40: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61  */.  int bestFla
9d50: 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
9d60: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
9d70: 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64  ated with bestId
9d80: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e  x */.  int bestN
9d90: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
9da0: 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65     /* Best value
9db0: 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e   for nEq */.  in
9dc0: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
9dd0: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
9de0: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
9df0: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
9e00: 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
9e10: 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
9e20: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
9e30: 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
9e40: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b  ng */.  int rev;
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9e70: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
9e80: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  rder */.  int fl
9e90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
9ea0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
9eb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
9ec0: 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Probe */.  int n
9ed0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
9ee0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9ef0: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
9f00: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f  straints */.  do
9f10: 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
9f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
9f30: 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62  t of using pProb
9f40: 65 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22  e */..  TRACE(("
9f50: 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25  bestIndex: tbl=%
9f60: 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22  s notReady=%x\n"
9f70: 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
9f80: 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b  ame, notReady));
9f90: 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  .  lowestCost = 
9fa0: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
9fb0: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
9fc0: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a  >pTab->pIndex;..
9fd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
9fe0: 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  e has no indices
9ff0: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
a000: 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  o terms in the w
a010: 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65  here.  ** clause
a020: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
a030: 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77  he ROWID, then w
a040: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
a050: 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20  able to do.  ** 
a060: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
a070: 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65  han a full table
a080: 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61   scan on this ta
a090: 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61  ble.  We might a
a0a0: 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20  s.  ** well put 
a0b0: 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20  it first in the 
a0c0: 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61  join order.  Tha
a0d0: 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69  t way, perhaps i
a0e0: 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65  t can be.  ** re
a0f0: 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65  ferenced by othe
a100: 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  r tables in the 
a110: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
a120: 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20   pProbe==0 &&.  
a130: 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c     findTerm(pWC,
a140: 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
a150: 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c  _EQ|WO_IN|WO_LT|
a160: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
a170: 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  E,0)==0 &&.     
a180: 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  (pOrderBy==0 || 
a190: 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64  !sortableByRowid
a1a0: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
a1b0: 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a   &rev)) ){.    *
a1c0: 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  pFlags = 0;.    
a1d0: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
a1e0: 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20    *pnEq = 0;.   
a1f0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d   return 0.0;.  }
a200: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
a210: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
a220: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
a230: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
a240: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
a250: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
a260: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
a270: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
a280: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
a290: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
a2a0: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a    *ppIndex = 0;.
a2b0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
a2c0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
a2d0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
a2e0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
a2f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
a300: 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74  id== is always t
a310: 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c  he best pick.  L
a320: 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20  ook no further. 
a330: 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20   Because only.  
a340: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
a350: 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
a360: 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
a370: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
a380: 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c  er */.      *pFl
a390: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
a3a0: 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49  D_EQ | WHERE_UNI
a3b0: 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71  QUE;.      *pnEq
a3c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 54 52 41 43   = 1;.      TRAC
a3d0: 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20  E(("... best is 
a3e0: 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20  rowid\n"));.    
a3f0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
a400: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78    }else if( (pEx
a410: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
a420: 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  r)->pList!=0 ){.
a430: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
a440: 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69  N (LIST): cost i
a450: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
a460: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a470: 20 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65   list.      ** e
a480: 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20  lements.  */.   
a490: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
a4a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
a4b0: 78 70 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73  xpr;.      lowes
a4c0: 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28  tCost *= estLog(
a4d0: 6c 6f 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20  lowestCost);.   
a4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
a4f0: 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43   Rowid IN (SELEC
a500: 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67  T): cost is Nlog
a510: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
a520: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
a530: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a540: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e  result of the in
a550: 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20  ner select.  We 
a560: 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65  have no way to e
a570: 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a  stimate.      **
a580: 20 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d   that value so m
a590: 61 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73 73  ake a wild guess
a5a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73  . */.      lowes
a5b0: 74 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20  tCost = 200;.   
a5c0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
a5d0: 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74  .. rowid IN cost
a5e0: 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73  : %.9g\n", lowes
a5f0: 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
a600: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
a610: 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20  cost of a table 
a620: 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20  scan.  If we do 
a630: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e  not know how man
a640: 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61  y.  ** entries a
a650: 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  re in the table,
a660: 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61   use 1 million a
a670: 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a  s a guess..  */.
a680: 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20    cost = pProbe 
a690: 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  ? pProbe->aiRowE
a6a0: 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b  st[0] : 1000000;
a6b0: 0a 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 74  .  TRACE(("... t
a6c0: 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63  able scan base c
a6d0: 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  ost: %.9g\n", co
a6e0: 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20  st));.  flags = 
a6f0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
a700: 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  E;..  /* Check f
a710: 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
a720: 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  n a range of row
a730: 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ids in a table s
a740: 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  can..  */.  pTer
a750: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
a760: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
a770: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
a780: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  E|WO_GT|WO_GE, 0
a790: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
a7a0: 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65  {.    if( findTe
a7b0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
a7c0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
a7d0: 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20  T|WO_LE, 0) ){. 
a7e0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
a7f0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
a800: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20       cost /= 3; 
a810: 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
a820: 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e  owid<EXPR elimin
a830: 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
a840: 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d  or rows */.    }
a850: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
a860: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
a870: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
a880: 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_GE, 0) ){.  
a890: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
a8a0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
a8b0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20      cost /= 3;  
a8c0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
a8d0: 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid>EXPR elimina
a8e0: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
a8f0: 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  f rows */.    }.
a900: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
a910: 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64 75  rowid range redu
a920: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
a930: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d  \n", cost));.  }
a940: 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20  else{.    flags 
a950: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
a960: 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  f the table scan
a970: 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66   does not satisf
a980: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
a990: 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a  lause, increase.
a9a0: 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79    ** the cost by
a9b0: 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20   NlogN to cover 
a9c0: 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73  the expense of s
a9d0: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  orting. */.  if(
a9e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
a9f0: 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52   if( sortableByR
aa00: 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65  owid(iCur, pOrde
aa10: 72 42 79 2c 20 26 72 65 76 29 20 29 7b 0a 20 20  rBy, &rev) ){.  
aa20: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
aa30: 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45  RE_ORDERBY|WHERE
aa40: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20  _ROWID_RANGE;.  
aa50: 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
aa60: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
aa70: 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
aa80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
aa90: 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
aaa0: 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74  cost*estLog(cost
aab0: 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
aac0: 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63  "... sorting inc
aad0: 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25  reases cost to %
aae0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
aaf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ab00: 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20  cost<lowestCost 
ab10: 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  ){.    lowestCos
ab20: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65  t = cost;.    be
ab30: 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
ab40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
ab50: 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20  at each index.. 
ab60: 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f   */.  for(; pPro
ab70: 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
ab80: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
ab90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
abb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
abc0: 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74     double inMult
abd0: 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20  iplier = 1;..   
abe0: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64   TRACE(("... ind
abf0: 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62  ex %s:\n", pProb
ac00: 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  e->zName));..   
ac10: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
ac20: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ac30: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
ac40: 74 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  t are satisfied.
ac50: 20 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52      ** by x=EXPR
ac60: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
ac70: 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74  x IN (...) const
ac80: 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  raints..    */. 
ac90: 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20     flags = 0;.  
aca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72    for(i=0; i<pPr
acb0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  obe->nColumn; i+
acc0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  +){.      int j 
acd0: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
ace0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65  mn[i];.      pTe
acf0: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
ad00: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
ad10: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
ad20: 4e 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  N, pProbe);.    
ad30: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
ad40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c   break;.      fl
ad50: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
ad60: 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66  UMN_EQ;.      if
ad70: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ad80: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
ad90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
ada0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
adb0: 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
adc0: 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
add0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  IN;.        if( 
ade0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d  pExpr->pSelect!=
adf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
ae00: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32  nMultiplier *= 2
ae10: 35 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  5;.        }else
ae20: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
ae30: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
ae40: 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a    inMultiplier *
ae50: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
ae60: 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20  nExpr + 1;.     
ae70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae80: 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50   }.    cost = pP
ae90: 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69  robe->aiRowEst[i
aea0: 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ] * inMultiplier
aeb0: 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74   * estLog(inMult
aec0: 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71  iplier);.    nEq
aed0: 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50   = i;.    if( pP
aee0: 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
aef0: 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73  E_None && (flags
af00: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
af10: 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  IN)==0.         
af20: 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  && nEq==pProbe->
af30: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
af40: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
af50: 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
af60: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
af70: 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25   nEq=%d inMult=%
af80: 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22  .9g cost=%.9g\n"
af90: 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c  , nEq, inMultipl
afa0: 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20  ier, cost));..  
afb0: 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
afc0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
afd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
afe0: 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
aff0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
b000: 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
b010: 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
b020: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
b030: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
b040: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
b050: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
b060: 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
b070: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
b080: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
b090: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
b0a0: 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
b0b0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
b0c0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
b0d0: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50   WO_LT|WO_LE, pP
b0e0: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
b0f0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
b100: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
b110: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
b120: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b130: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
b140: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
b150: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
b160: 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
b170: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
b180: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
b190: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
b1a0: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
b1b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
b1c0: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65  E(("...... range
b1d0: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
b1e0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
b1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b200: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
b210: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20  additional cost 
b220: 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68  of sorting if th
b230: 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a  at is a factor..
b240: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b250: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
b260: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
b270: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
b280: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b290: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  isSortingIndex(p
b2a0: 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 69 43 75  Parse,pProbe,iCu
b2b0: 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26  r,pOrderBy,nEq,&
b2c0: 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rev) ){.        
b2d0: 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a  if( flags==0 ){.
b2e0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
b2f0: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
b300: 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ANGE;.        }.
b310: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
b320: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
b330: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
b340: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
b350: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
b360: 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
b370: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b380: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
b390: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
b3a0: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
b3b0: 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e  ..... orderby in
b3c0: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
b3d0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
b3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
b3f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
b400: 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65  see if we can ge
b410: 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e  t away with usin
b420: 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
b430: 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
b440: 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  ever reading the
b450: 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74   table.  If that
b460: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
b470: 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20  en halve the.   
b480: 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73   ** cost of this
b490: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
b4a0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20     if( flags && 
b4b0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20  pSrc->colUsed < 
b4c0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
b4d0: 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20  BMS-1)) ){.     
b4e0: 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
b4f0: 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
b500: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
b510: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65  or(j=0; j<pProbe
b520: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
b530: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
b540: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
b550: 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
b560: 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
b570: 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
b580: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
b590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b5a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
b5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
b5c0: 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
b5d0: 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73  NLY;.        cos
b5e0: 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  t /= 2;.        
b5f0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69  TRACE(("...... i
b600: 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20  dx-only reduces 
b610: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
b620: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
b630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b640: 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73  f this index has
b650: 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f   achieved the lo
b660: 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72  west cost so far
b670: 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20  , then use it.. 
b680: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f     */.    if( co
b690: 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20  st < lowestCost 
b6a0: 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78  ){.      bestIdx
b6b0: 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20   = pProbe;.     
b6c0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f   lowestCost = co
b6d0: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
b6e0: 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20  ( flags!=0 );.  
b6f0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
b700: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73  flags;.      bes
b710: 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  tNEq = nEq;.    
b720: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
b730: 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75  rt the best resu
b740: 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64  lt.  */.  *ppInd
b750: 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20  ex = bestIdx;.  
b760: 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64  TRACE(("best ind
b770: 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25  ex is %s, cost=%
b780: 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e  .9g, flags=%x, n
b790: 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  Eq=%d\n",.      
b7a0: 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73 74    bestIdx ? best
b7b0: 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e  Idx->zName : "(n
b7c0: 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73  one)", lowestCos
b7d0: 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65  t, bestFlags, be
b7e0: 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61  stNEq));.  *pFla
b7f0: 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  gs = bestFlags;.
b800: 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45    *pnEq = bestNE
b810: 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65  q;.  return lowe
b820: 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  stCost;.}.../*.*
b830: 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
b840: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
b850: 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
b860: 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
b870: 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
b880: 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
b890: 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
b8a0: 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
b8b0: 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
b8c0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
b8d0: 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
b8e0: 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
b8f0: 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
b900: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
b910: 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
b920: 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
b930: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
b940: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
b950: 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
b960: 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
b970: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
b980: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
b990: 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
b9a0: 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
b9b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
b9c0: 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
b9d0: 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
b9e0: 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
b9f0: 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
ba00: 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
ba10: 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
ba20: 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
ba30: 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
ba40: 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
ba50: 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
ba60: 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
ba70: 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
ba80: 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
ba90: 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
baa0: 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
bab0: 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
bac0: 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
bad0: 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
bae0: 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
baf0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
bb00: 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
bb10: 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
bb20: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
bb30: 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
bb40: 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
bb50: 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
bb60: 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
bb70: 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
bb80: 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
bb90: 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
bba0: 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
bbb0: 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
bbc0: 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
bbd0: 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
bbe0: 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
bbf0: 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
bc00: 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
bc10: 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
bc20: 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
bc30: 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
bc40: 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
bc50: 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
bc60: 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
bc70: 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
bc80: 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
bc90: 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
bca0: 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
bcb0: 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
bcc0: 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
bcd0: 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
bce0: 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  & (pTerm->flags 
bcf0: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
bd00: 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
bd10: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
bd20: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
bd30: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
bd40: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
bd50: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66   ){.    pTerm->f
bd60: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
bd70: 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
bd80: 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
bd90: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
bda0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
bdb0: 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
bdc0: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
bdd0: 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
bde0: 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
bdf0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
be00: 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
be10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
be20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
be30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
be40: 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20   builds a probe 
be50: 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44  for an index.  D
be60: 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
be70: 20 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f   *  Check the to
be80: 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65  p nColumn entrie
be90: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  s on the stack. 
bea0: 20 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20   If any.**      
beb0: 20 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65   of those entrie
bec0: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70  s are NULL, jump
bed0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
bee0: 62 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68  brk,.**       wh
bef0: 69 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20  ich is the loop 
bf00: 65 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69  exit, since no i
bf10: 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20  ndex entry will 
bf20: 6d 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69  match.**       i
bf30: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
bf40: 65 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 20 50  e key is NULL. P
bf50: 6f 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74  op (nColumn+nExt
bf60: 72 61 29 20 0a 2a 2a 20 20 20 20 20 20 20 65 6c  ra) .**       el
bf70: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
bf80: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  stack..**.**    
bf90: 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70  *  Construct a p
bfa0: 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  robe entry from 
bfb0: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
bfc0: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20  entries in.**   
bfd0: 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 77 69      the stack wi
bfe0: 74 68 20 61 66 66 69 6e 69 74 69 65 73 20 61 70  th affinities ap
bff0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
c000: 64 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20 20 20  dex pIdx. .**   
c010: 20 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d 6e      Only nColumn
c020: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 70 6f   elements are po
c030: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
c040: 61 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73 65  ack in this case
c050: 0a 2a 2a 20 20 20 20 20 20 20 28 62 79 20 4f 50  .**       (by OP
c060: 5f 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a 2a 2a  _MakeRecord)..**
c070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c080: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
c090: 0a 20 20 56 64 62 65 20 2a 76 2c 20 0a 20 20 69  .  Vdbe *v, .  i
c0a0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20 69  nt nColumn, .  i
c0b0: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
c0c0: 74 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65 78 20  t brk, .  Index 
c0d0: 2a 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c 69 74  *pIdx.){.  sqlit
c0e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c0f0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c  P_NotNull, -nCol
c100: 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65  umn, sqlite3Vdbe
c110: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
c120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c130: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
c140: 20 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 2c   nColumn+nExtra,
c150: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
c160: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
c170: 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20 73  to, 0, brk);.  s
c180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c190: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
c1a0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
c1b0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
c1c0: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
c1d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
c1e0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
c1f0: 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
c200: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
c210: 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
c220: 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
c230: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
c240: 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
c250: 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
c260: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
c270: 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
c280: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
c290: 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
c2a0: 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  int is left on t
c2b0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
c2c0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ack..**.** For a
c2d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
c2e0: 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
c2f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
c300: 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
c310: 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
c320: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
c330: 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
c340: 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
c350: 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
c360: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
c370: 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
c380: 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
c390: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
c3a0: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
c3b0: 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  d codeEqualityTe
c3c0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
c3d0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
c3e0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c3f0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
c400: 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
c410: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
c420: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
c430: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  coded */.  int b
c440: 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk,            /
c450: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 61  * Jump here to a
c460: 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70 20  bandon the loop 
c470: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
c480: 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e  *pLevel  /* When
c490: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
c4a0: 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
c4b0: 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29   working on */.)
c4c0: 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70  {.  Expr *pX = p
c4d0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 69  Term->pExpr;.  i
c4e0: 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  f( pX->op!=TK_IN
c4f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c500: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  pX->op==TK_EQ );
c510: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
c520: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
c530: 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64 65  >pRight);.#ifnde
c540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c550: 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
c560: 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
c570: 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20 20 20    int *aIn;.    
c580: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c590: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20 73 71  ->pVdbe;..    sq
c5a0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
c5b0: 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a  ct(pParse, pX);.
c5c0: 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
c5d0: 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
c5e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c5f0: 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
c600: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  0);.    VdbeComm
c610: 65 6e 74 28 28 76 2c 20 22 23 20 25 2e 2a 73 22  ent((v, "# %.*s"
c620: 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58  , pX->span.n, pX
c630: 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20  ->span.z));.    
c640: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20  pLevel->nIn++;. 
c650: 20 20 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63     sqliteRealloc
c660: 4f 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26  OrFree((void**)&
c670: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c  pLevel->aInLoop,
c680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
c6b0: 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 32 2a 70  >aInLoop[0])*2*p
c6c0: 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20  Level->nIn);.   
c6d0: 20 61 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61   aIn = pLevel->a
c6e0: 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
c6f0: 61 49 6e 20 29 7b 0a 20 20 20 20 20 20 61 49 6e  aIn ){.      aIn
c700: 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a   += pLevel->nIn*
c710: 32 20 2d 20 32 3b 0a 20 20 20 20 20 20 61 49 6e  2 - 2;.      aIn
c720: 5b 30 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  [0] = iTab;.    
c730: 20 20 61 49 6e 5b 31 5d 20 3d 20 73 71 6c 69 74    aIn[1] = sqlit
c740: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c750: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
c760: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
c770: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e       pLevel->nIn
c780: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
c790: 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
c7a0: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
c7b0: 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  rm);.}../*.** Ge
c7c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c7d0: 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
c7e0: 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
c7f0: 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
c800: 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76  ** index.  The v
c810: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
c820: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65  nstraints are le
c830: 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
c840: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
c850: 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
c860: 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
c870: 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
c880: 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
c890: 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
c8a0: 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
c8b0: 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
c8c0: 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
c8d0: 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
c8e0: 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
c8f0: 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
c900: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
c910: 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
c920: 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
c930: 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
c940: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
c950: 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
c960: 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
c970: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
c980: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
c990: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
c9a0: 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
c9b0: 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
c9c0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
c9d0: 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
c9e0: 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68  be left.** on th
c9f0: 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20 74  e stack - a is t
ca00: 68 65 20 64 65 65 70 65 73 74 20 61 6e 64 20 62  he deepest and b
ca10: 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e   the shallowest.
ca20: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
ca30: 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d  ample above nEq=
ca40: 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75  =2.  But this su
ca50: 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66  broutine works f
ca60: 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20  or any value.** 
ca70: 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67  of nEq including
ca80: 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20   0.  If nEq==0, 
ca90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
caa0: 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a  nearly a no-op..
cab0: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
cac0: 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c  g it does is all
cad0: 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c  ocate the pLevel
cae0: 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65  ->iMem memory ce
caf0: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ll..**.** This r
cb00: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c  outine always al
cb10: 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74  locates at least
cb20: 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   one memory cell
cb30: 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68 65   and puts.** the
cb40: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 61 74   address of that
cb50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
cb60: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54  pLevel->iMem.  T
cb70: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
cb80: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
cb90: 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65 76  ne will use pLev
cba0: 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72  el->iMem to stor
cbb0: 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
cbc0: 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
cbd0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
cbe0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
cbf0: 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
cc00: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
cc10: 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
cc20: 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
cc30: 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
cc40: 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
cc50: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
cc60: 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  id codeAllEquali
cc70: 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
cc80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
cc90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cca0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
ccb0: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
ccc0: 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
ccd0: 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
cce0: 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
ccf0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
cd00: 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
cd10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
cd20: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
cd30: 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
cd40: 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
cd50: 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
cd60: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
cd70: 62 72 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  brk             
cd80: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
cd90: 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a  o end the loop *
cda0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  /.){.  int nEq =
cdb0: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20   pLevel->nEq;   
cdc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
cdd0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
cde0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
cdf0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d  de */.  int term
ce00: 73 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20  sInMem = 0;     
ce10: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
ce20: 2c 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69 6e  , store value in
ce30: 20 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a   mem[] cells */.
ce40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ce50: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
ce60: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
ce70: 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
ce80: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
ce90: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65  ndex *pIdx = pLe
cea0: 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20  vel->pIdx;   /* 
ceb0: 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
cec0: 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
ced0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  op */.  int iCur
cee0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
cef0: 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur;   /* The cur
cf00: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
cf10: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
cf20: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
cf30: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
cf40: 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
cf50: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cf80: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  er */..  /* Figu
cf90: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
cfa0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
cfb0: 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
cfc0: 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
cfd0: 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65  ** We always nee
cfe0: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75  d at least one u
cff0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
d000: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72   loop terminator
d010: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66  .  ** value.  If
d020: 20 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70   there are IN op
d030: 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65  erators we'll ne
d040: 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  ed one for each 
d050: 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f  == or.  ** IN co
d060: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
d070: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20   pLevel->iMem = 
d080: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
d090: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
d0a0: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
d0b0: 4d 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50 61  MN_IN ){.    pPa
d0c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65  rse->nMem += pLe
d0d0: 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65  vel->nEq;.    te
d0e0: 72 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  rmsInMem = 1;.  
d0f0: 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
d100: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
d110: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
d120: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
d130: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
d140: 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
d150: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
d160: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
d170: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
d180: 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  k, notReady, WO_
d190: 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b  EQ|WO_IN, pIdx);
d1a0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  .    if( pTerm==
d1b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  0 ) break;.    a
d1c0: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
d1d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
d1e0: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  D)==0 );.    cod
d1f0: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
d200: 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b  arse, pTerm, brk
d210: 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69  , pLevel);.    i
d220: 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b  f( termsInMem ){
d230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d240: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
d250: 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
d260: 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20  iMem+j+1, 1);.  
d270: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
d280: 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f  ( j==nEq );..  /
d290: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
d2a0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  the constraint v
d2b0: 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68 65  alues are on the
d2c0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
d2d0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65 72  k.  */.  if( ter
d2e0: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66  msInMem ){.    f
d2f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
d300: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
d310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d320: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
d330: 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b  l->iMem+j+1, 0);
d340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
d350: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
d360: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65  _TEST)./*.** The
d370: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
d380: 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74  ble holds a text
d390: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
d3a0: 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72  query plan gener
d3b0: 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d  ated.** by the m
d3c0: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
d3d0: 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
d3e0: 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61  egin().  Each ca
d3f0: 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e  ll to WhereBegin
d400: 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
d410: 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68  he previous.  Th
d420: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
d430: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
d440: 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73  ng and.** analys
d450: 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72  is only..*/.char
d460: 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
d470: 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20  lan[BMS*2*40];  
d480: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a  /* Text of the j
d490: 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oin */.static in
d4a0: 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20  t nQPlan = 0;   
d4b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
d4c0: 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20  xt free slow in 
d4d0: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f  _query_plan[] */
d4e0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
d4f0: 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  TE_TEST */.../*.
d500: 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
d510: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
d520: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
d530: 72 65 49 6e 66 6f 46 72 65 65 28 57 68 65 72 65  reInfoFree(Where
d540: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
d550: 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
d560: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
d570: 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
d580: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
d590: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
d5a0: 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
d5b0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
d5c0: 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
d5d0: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
d5e0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
d5f0: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
d600: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d610: 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
d620: 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
d630: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
d640: 65 46 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20  eFree(pInfo);.  
d650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d660: 73 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66  sqliteFree(pWInf
d670: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  o);.  }.}.../*.*
d680: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
d690: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
d6a0: 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
d6b0: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
d6c0: 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
d6e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
d6f0: 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
d700: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
d710: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
d720: 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
d730: 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
d740: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
d750: 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
d760: 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
d770: 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
d780: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
d790: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
d7a0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
d7b0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
d7c0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
d7d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
d7e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d7f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d800: 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
d810: 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
d820: 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
d830: 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
d840: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
d850: 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
d860: 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
d870: 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
d880: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
d890: 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
d8a0: 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
d8b0: 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
d8c0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
d8d0: 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
d8e0: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
d8f0: 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
d900: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
d910: 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
d920: 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
d930: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
d940: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
d950: 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
d960: 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
d970: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
d980: 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
d990: 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
d9a0: 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
d9b0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
d9c0: 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
d9d0: 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
d9e0: 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
d9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
da00: 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
da10: 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
da20: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
da30: 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
da40: 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
da50: 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
da60: 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
da90: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
daa0: 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dac0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
dad0: 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
dae0: 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
daf0: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
db00: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
db10: 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
db20: 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
db30: 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
db40: 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
db50: 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
db60: 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
db70: 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
db80: 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
db90: 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
dba0: 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
dbb0: 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
dbc0: 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
dbd0: 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
dbe0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
dbf0: 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
dc00: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
dc10: 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
dc20: 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
dc30: 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
dc40: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
dc50: 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
dc60: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
dc70: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
dc80: 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
dc90: 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
dca0: 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
dcb0: 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
dcc0: 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
dcd0: 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
dce0: 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
dcf0: 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
dd00: 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
dd10: 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
dd20: 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
dd30: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
dd40: 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
dd50: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
dd60: 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
dd70: 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
dd80: 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
dd90: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
dda0: 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
ddb0: 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
ddc0: 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
ddd0: 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
dde0: 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
ddf0: 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
de00: 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
de10: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
de20: 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
de30: 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
de40: 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
de50: 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
de60: 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
de70: 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
de80: 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
de90: 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
dea0: 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
deb0: 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
dec0: 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
ded0: 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
dee0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
def0: 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
df00: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
df10: 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
df20: 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
df30: 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
df40: 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
df50: 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
df60: 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
df70: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
df80: 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
df90: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
dfa0: 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
dfb0: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
dfc0: 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
dfd0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
dfe0: 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
dff0: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
e000: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e010: 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
e020: 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
e030: 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
e040: 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
e050: 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
e060: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
e070: 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
e080: 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
e090: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
e0a0: 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
e0b0: 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
e0c0: 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
e0d0: 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
e0e0: 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
e0f0: 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
e100: 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
e110: 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
e120: 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
e130: 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
e140: 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
e150: 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
e160: 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
e170: 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
e180: 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
e190: 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
e1a0: 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
e1b0: 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
e1c0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
e1d0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
e1e0: 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
e1f0: 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
e200: 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
e210: 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
e220: 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
e230: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
e240: 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
e250: 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
e260: 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
e270: 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
e280: 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
e290: 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
e2a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
e2b0: 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
e2c0: 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
e2d0: 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
e2e0: 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
e2f0: 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
e300: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
e310: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
e320: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e330: 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
e340: 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
e350: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
e360: 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
e370: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
e380: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
e390: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
e3a0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
e3b0: 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
e3c0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
e3d0: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
e3e0: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
e3f0: 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
e400: 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
e410: 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
e420: 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
e430: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
e440: 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
e450: 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
e460: 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
e470: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
e480: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
e490: 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
e4a0: 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
e4b0: 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
e4c0: 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
e4d0: 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
e4e0: 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
e4f0: 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
e500: 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
e510: 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
e520: 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
e530: 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
e540: 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
e550: 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
e560: 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
e570: 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
e580: 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
e590: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
e5a0: 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
e5b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e5c0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
e5d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
e5e0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
e5f0: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
e600: 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
e610: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
e620: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
e630: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
e640: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
e650: 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 20  ist **ppOrderBy 
e660: 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
e670: 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
e680: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e6b0: 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  er */.  WhereInf
e6c0: 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
e6d0: 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
e6e0: 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
e6f0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
e700: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
e710: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e720: 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
e730: 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
e740: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c  ne */.  int brk,
e750: 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20   cont = 0;      
e760: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20     /* Addresses 
e770: 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65  used during code
e780: 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
e790: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
e7a0: 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
e7b0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
e7c0: 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
e7d0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ed */.  WhereTer
e7e0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e7f0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
e800: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
e810: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
e820: 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74  rMaskSet maskSet
e830: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;       /* The e
e840: 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
e850: 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  et */.  WhereCla
e860: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
e870: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
e880: 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64 65  clause is divide
e890: 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72  d into these ter
e8a0: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ms */.  struct S
e8b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
e8c0: 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e  bItem;  /* A sin
e8d0: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70  gle entry from p
e8e0: 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
e8f0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e910: 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
e920: 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73  n the pWInfo lis
e930: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
e940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e950: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e960: 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75  unused FROM clau
e970: 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  se element */.  
e980: 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20  int andFlags;   
e990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e             /* AN
e9a0: 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  D-ed combination
e9b0: 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66   of all wc.a[].f
e9c0: 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  lags */..  /* Th
e9d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
e9e0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
e9f0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
ea00: 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
ea10: 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
ea20: 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
ea30: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
ea40: 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
ea50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ea60: 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
ea70: 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
ea80: 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
ea90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
eaa0: 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
eab0: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
eac0: 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
ead0: 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
eae0: 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
eaf0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
eb00: 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
eb10: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
eb20: 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b 53  itMaskSet(&maskS
eb30: 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
eb40: 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50 61 72  seInit(&wc, pPar
eb50: 73 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  se);.  whereSpli
eb60: 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54  t(&wc, pWhere, T
eb70: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
eb80: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
eb90: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
eba0: 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
ebb0: 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
ebc0: 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
ebd0: 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  rn value..  */. 
ebe0: 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
ebf0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57  Malloc( sizeof(W
ec00: 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62  hereInfo) + pTab
ec10: 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f  List->nSrc*sizeo
ec20: 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
ec30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
ec40: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
ec50: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
ec60: 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70  inNoMem;.  }.  p
ec70: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
ec80: 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
ec90: 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
eca0: 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
ecb0: 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
ecc0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ecd0: 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  );..  /* Special
ece0: 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
ecf0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
ed00: 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
ed10: 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
ed20: 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
ed30: 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
ed40: 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
ed50: 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
ed60: 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70  if( pWhere && (p
ed70: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30  TabList->nSrc==0
ed80: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
ed90: 73 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  sConstant(pWhere
eda0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
edb0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
edc0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
edd0: 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b  nfo->iBreak, 1);
ede0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
edf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
ee00: 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
ee10: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
ee20: 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
ee30: 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
ee40: 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
ee50: 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
ee60: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
ee70: 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
ee80: 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
ee90: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
eea0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
eeb0: 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
eec0: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
eed0: 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
eee0: 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
eef0: 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
ef00: 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
ef10: 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  cessed..  */.  f
ef20: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
ef30: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
ef40: 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26      createMask(&
ef50: 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  maskSet, pTabLis
ef60: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
ef70: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c  ;.  }.  exprAnal
ef80: 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
ef90: 20 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b   &maskSet, &wc);
efa0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
efb0: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
efc0: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
efd0: 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20  ginNoMem;.  }.. 
efe0: 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
eff0: 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
f000: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
f010: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
f020: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
f030: 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
f040: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
f050: 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
f060: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
f070: 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
f080: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
f090: 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
f0a0: 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
f0b0: 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20  fo->a[].flags   
f0c0: 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
f0d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
f0e0: 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
f0f0: 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
f100: 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
f110: 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
f120: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
f130: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
f140: 20 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f       When term o
f150: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
f160: 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
f170: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
f180: 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
f190: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
f1a0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
f1b0: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
f1c0: 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
f1d0: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
f1e0: 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
f1f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
f200: 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73  oop also figures
f210: 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67   out the nesting
f220: 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
f230: 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a   in the FROM.  *
f240: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
f250: 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
f260: 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49  tmask)0;.  pTabI
f270: 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
f280: 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57  a;.  pLevel = pW
f290: 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c  Info->a;.  andFl
f2a0: 61 67 73 20 3d 20 7e 30 3b 0a 20 20 54 52 41 43  ags = ~0;.  TRAC
f2b0: 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
f2c0: 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
f2d0: 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d  ;.  for(i=iFrom=
f2e0: 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
f2f0: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
f300: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
f310: 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
f320: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
f330: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f340: 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
f350: 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
f360: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f380: 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74   Flags asssociat
f390: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
f3a0: 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20      int nEq;    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
f3d0: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
f3e0: 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  s */.    double 
f3f0: 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
f400: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
f410: 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20   for pIdx */.   
f420: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f440: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
f450: 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
f460: 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
f470: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f480: 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  /* The best inde
f490: 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  x seen so far */
f4a0: 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61  .    int bestFla
f4b0: 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
f4c0: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
f4d0: 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
f4e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e  */.    int bestN
f4f0: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
f500: 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69     /* nEq associ
f510: 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
f520: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  */.    double lo
f530: 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
f540: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68     /* Cost of th
f550: 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69  e pBest */.    i
f560: 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20  nt bestJ = 0;   
f570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f580: 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a  e value of j */.
f590: 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20      Bitmask m;  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65  /* Bitmask value
f5c0: 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20   for j or bestJ 
f5d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  */.    int once 
f5e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f5f0: 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20     /* True when 
f600: 66 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73  first table is s
f610: 65 65 6e 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65  een */..    lowe
f620: 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  stCost = SQLITE_
f630: 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72  BIG_DBL;.    for
f640: 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
f650: 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
f660: 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j]; j<pTabList->
f670: 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49  nSrc; j++, pTabI
f680: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  tem++){.      in
f690: 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20  t doNotReorder; 
f6a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
f6b0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f   table should no
f6c0: 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a  t be reordered *
f6d0: 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  /..      doNotRe
f6e0: 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
f6f0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
f700: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
f710: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
f720: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 6a 3e 30           || (j>0
f730: 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31   && (pTabItem[-1
f740: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ].jointype & (JT
f750: 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
f760: 21 3d 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  !=0);.      if( 
f770: 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f  once && doNotReo
f780: 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
f790: 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28      m = getMask(
f7a0: 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  &maskSet, pTabIt
f7b0: 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
f7c0: 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74      if( (m & not
f7d0: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
f7e0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f       if( j==iFro
f7f0: 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20  m ) iFrom++;.   
f800: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
f820: 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70  ert( pTabItem->p
f830: 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  Tab );.#ifndef S
f840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f850: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66  ALTABLE.      if
f860: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f870: 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
f880: 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
f890: 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
f8a0: 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62  Parse, &wc, pTab
f8b0: 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f  ppOrderBy ? *ppO
f8f0: 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30  rderBy : 0, i==0
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 26 70 4c 65 76 65 6c 2d 3e 70 49 64 78 49    &pLevel->pIdxI
f930: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  nfo);.        fl
f940: 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
f950: 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  UALTABLE;.      
f960: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
f970: 64 78 49 6e 66 6f 20 26 26 20 70 4c 65 76 65 6c  dxInfo && pLevel
f980: 2d 3e 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  ->pIdxInfo->orde
f990: 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20  rByConsumed ){. 
f9a0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
f9b0: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
f9c0: 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45  BLE | WHERE_ORDE
f9d0: 52 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RBY;.        }. 
f9e0: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
f9f0: 0a 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30  .        nEq = 0
fa00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23  ;.      }else .#
fa10: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
fa20: 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
fa30: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
fa40: 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  wc, pTabItem, no
fa50: 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
fa80: 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
fa90: 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26  &pIdx, &flags, &
fac0: 6e 45 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nEq);.      }.  
fad0: 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77      if( cost<low
fae0: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  estCost ){.     
faf0: 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20     once = 1;.   
fb00: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
fb10: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  = cost;.        
fb20: 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
fb30: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
fb40: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
fb50: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
fb60: 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
fb70: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
fb80: 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65   if( doNotReorde
fb90: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
fba0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2a 2a 2a  .    TRACE(("***
fbb0: 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73   Optimizer choos
fbc0: 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  e table %d for l
fbd0: 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
fbe0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
fbf0: 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
fc00: 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
fc10: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
fc20: 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
fc30: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
fc40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
fc50: 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
fc60: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
fc70: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
fc80: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
fc90: 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
fca0: 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
fcb0: 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
fcc0: 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
fcd0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
fce0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
fcf0: 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
fd00: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
fd10: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
fd20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
fd30: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
fd40: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
fd50: 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
fd60: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
fd70: 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
fd80: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
fd90: 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
fda0: 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  stJ;.  }.  TRACE
fdb0: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
fdc0: 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
fdd0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
fde0: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
fdf0: 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
fe00: 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
fe10: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
fe20: 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
fe30: 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
fe40: 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
fe50: 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
fe60: 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
fe70: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
fe80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
fe90: 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
fea0: 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
feb0: 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
fec0: 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
fed0: 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
fee0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
fef0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
ff00: 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
ff10: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
ff20: 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
ff30: 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20  oto */.  pLevel 
ff40: 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66  = pWInfo->a;.  f
ff50: 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
ff60: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
ff70: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
ff80: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
ff90: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
ffa0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
ffb0: 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
ffc0: 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  pIx;      /* Ind
ffd0: 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
ffe0: 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20  s pTab (if any) 
fff0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
10000 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10010 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
10020 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
10030 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
10040 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
10050 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64  >iIdxCur;..#ifnd
10060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
10070 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
10080 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
10090 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  2 ){.      char 
100a0 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72  *zMsg;.      str
100b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
100c0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
100d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
100e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73  From];.      zMs
100f0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
10100 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70  tf("TABLE %s", p
10110 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
10120 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
10130 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
10140 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
10150 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73  Printf("%z AS %s
10160 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
10170 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
10180 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 78 20  .      if( (pIx 
10190 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
101a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  =0 ){.        zM
101b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
101c0 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44  ntf("%z WITH IND
101d0 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  EX %s", zMsg, pI
101e0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
101f0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
10200 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
10210 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
10220 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
10230 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
10240 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
10250 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  %z USING PRIMARY
10260 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   KEY", zMsg);.  
10270 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
10280 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10290 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73  LTABLE.      els
102a0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49  e if( pLevel->pI
102b0 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  dxInfo ){.      
102c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
102d0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 20 3d  info *pIdxInfo =
102e0 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66   pLevel->pIdxInf
102f0 6f 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  o;.        zMsg 
10300 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10310 28 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42  ("%z VIRTUAL TAB
10320 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
10330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10340 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69       pIdxInfo->i
10350 64 78 4e 75 6d 2c 20 70 49 64 78 49 6e 66 6f 2d  dxNum, pIdxInfo-
10360 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  >idxStr);.      
10370 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
10380 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
10390 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
103a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
103b0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
103c0 66 28 22 25 7a 20 4f 52 44 45 52 20 42 59 22 2c  f("%z ORDER BY",
103d0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
103e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
103f0 65 4f 70 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61  eOp3(v, OP_Expla
10400 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  in, i, pLevel->i
10410 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44  From, zMsg, P3_D
10420 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
10430 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10440 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
10450 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
10460 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
10470 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
10480 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
10490 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
104a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
104b0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
104c0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
104d0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
104e0 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
104f0 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
10500 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
10510 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10520 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c  TABLE.    if( pL
10530 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 20 29  evel->pIdxInfo )
10540 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10550 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 4f 70  dbeOp3(v, OP_VOp
10560 65 6e 2c 20 30 2c 20 30 2c 20 28 63 6f 6e 73 74  en, 0, 0, (const
10570 20 63 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74   char*)pTab->pVt
10580 61 62 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20  ab, P3_VTAB);.  
10590 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
105a0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
105b0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
105c0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
105d0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
105e0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
105f0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
10600 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
10610 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 69  enRead);.      i
10620 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73  f( pTab->nCol<(s
10630 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
10640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
10650 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
10660 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
10670 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
10680 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
10690 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
106a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
106b0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71  beChangeP2(v, sq
106c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
106d0 41 64 64 72 28 76 29 2d 31 2c 20 6e 29 3b 0a 20  Addr(v)-1, n);. 
106e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
106f0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
10700 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10710 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
10720 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
10730 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
10740 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
10750 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  e);.    }.    pL
10760 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
10770 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
10780 72 3b 0a 20 20 20 20 69 66 28 20 28 70 49 78 20  r;.    if( (pIx 
10790 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
107a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  =0 ){.      KeyI
107b0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
107c0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
107d0 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
107e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
107f0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
10800 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
10810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10820 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10830 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20   iDb, 0);.      
10840 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10850 22 23 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  "# %s", pIx->zNa
10860 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
10870 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10880 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
10890 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20  ur, pIx->tnum,. 
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
108c0 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
108d0 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OFF);.    }.    
108e0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  if( (pLevel->fla
108f0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
10900 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
10910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10920 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
10930 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20  lumns, iIdxCur, 
10940 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  pIx->nColumn+1);
10950 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10960 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
10970 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
10980 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
10990 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
109a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
109b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
109c0 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
109d0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
109e0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
109f0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
10a00 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
10a10 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
10a20 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
10a30 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
10a40 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
10a50 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
10a60 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  k)0;.  for(i=0, 
10a70 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
10a80 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
10a90 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
10aa0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  +){.    int j;. 
10ab0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
10ac0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
10ad0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
10ae0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
10af0 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  le */.    Index 
10b00 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  *pIdx;       /* 
10b10 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
10b20 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
10b30 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
10b40 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
10b50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
10b60 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
10b70 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
10b80 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
10b90 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
10ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76   */.    int bRev
10bb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
10bc0 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
10bd0 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
10be0 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70   order */..    p
10bf0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
10c00 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
10c10 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20  From];.    iCur 
10c20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
10c30 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  sor;.    pIdx = 
10c40 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20  pLevel->pIdx;.  
10c50 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
10c60 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
10c70 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
10c80 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
10c90 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20  EVERSE)!=0;.    
10ca0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
10cb0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
10cc0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b  RE_IDX_ONLY)!=0;
10cd0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
10ce0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
10cf0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
10d00 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
10d10 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ns.    ** for th
10d20 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
10d30 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20   Jump to brk to 
10d40 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
10d50 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70  oop..    ** Jump
10d60 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
10d70 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
10d80 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
10d90 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   of the.    ** l
10da0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
10db0 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72  brk = pLevel->br
10dc0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10dd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
10de0 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
10df0 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
10e00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10e10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
10e20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
10e30 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
10e40 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
10e50 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69  e and.    ** ini
10e60 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
10e70 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
10e80 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
10e90 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20   matches any.   
10ea0 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
10eb0 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
10ec0 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   join..    */.  
10ed0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
10ee0 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
10ef0 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  em[-1].jointype 
10f00 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
10f10 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
10f20 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73  se->nMem ) pPars
10f30 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
10f40 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
10f50 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  in = pParse->nMe
10f60 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  m++;.      sqlit
10f70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10f80 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65  P_MemInt, 0, pLe
10f90 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
10fa0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10fb0 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c  nt((v, "# init L
10fc0 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
10fd0 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d  h flag"));.    }
10fe0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10ff0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11000 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  LE.    if( pLeve
11010 6c 2d 3e 70 49 64 78 49 6e 66 6f 20 29 7b 0a 20  l->pIdxInfo ){. 
11020 20 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20       /* Case 0: 
11030 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
11040 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
11050 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
11060 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 20 20  and VNext.      
11070 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
11080 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
11090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
110a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
110b0 6f 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 70 4c  o *pIdxInfo = pL
110c0 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 3b 0a  evel->pIdxInfo;.
110d0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74        int nConst
110e0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
110f0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
11100 20 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69       struct sqli
11110 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
11120 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61  aint_usage *aUsa
11130 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
11170 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
11180 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  e;.      const s
11190 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
111a0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
111b0 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20  aConstraint =.  
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11200 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 66 6f  raint;..      fo
11210 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6e 73 74  r(i=1; i<=nConst
11220 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
11230 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
11240 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
11250 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
11260 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
11270 61 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  aUsage[j].argvIn
11280 64 65 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  dex==i ){.      
11290 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 61 43        int k = aC
112a0 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
112b0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
112c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
112d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63  rCode(pParse, wc
112e0 2e 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e 70 52 69  .a[k].pExpr->pRi
112f0 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
11300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
11320 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 43         if( j==nC
11330 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
11340 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11360 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
11370 20 69 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-1, 0);.      
11380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11390 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
113a0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
113b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
113c0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
113d0 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
113e0 62 72 6b 2c 20 70 49 64 78 49 6e 66 6f 2d 3e 69  brk, pIdxInfo->i
113f0 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
11410 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
11420 65 49 64 78 53 74 72 20 3f 20 50 33 5f 4d 50 52  eIdxStr ? P3_MPR
11430 49 4e 54 46 20 3a 20 50 33 5f 53 54 41 54 49 43  INTF : P3_STATIC
11440 29 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  );.      pIdxInf
11450 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
11460 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Str = 0;.      f
11470 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
11480 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
11490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
114a0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  f( pIdxInfo->aCo
114b0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
114c0 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
114d0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
114e0 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 5d 29  Level, &wc.a[i])
114f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11500 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
11510 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
11520 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
11530 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
11540 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
11550 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11560 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  ddr(v);.    }els
11570 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
11580 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11590 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ABLE */..    if(
115a0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
115b0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
115c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
115d0 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
115e0 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
115f0 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
11600 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  g an.      **   
11610 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
11620 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
11630 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
11640 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a  ld.  Or.      **
11650 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
11660 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
11670 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
11680 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
11690 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
116a0 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20  construct..     
116b0 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20   */.      pTerm 
116c0 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
116d0 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
116e0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
116f0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
11700 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
11710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
11720 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
11730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
11740 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
11750 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  =iCur );.      a
11760 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
11770 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
11780 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
11790 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b  arse, pTerm, brk
117a0 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
117b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
117c0 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
117d0 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20  t, 1, brk);.    
117e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117f0 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  Op(v, OP_NotExis
11800 74 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  ts, iCur, brk);.
11810 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11820 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
11830 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
11840 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
11850 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
11860 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
11870 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
11880 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
11890 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
118a0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
118b0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
118c0 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  D field..      *
118d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74  /.      int test
118e0 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
118f0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
11900 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
11910 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
11920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
11930 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
11940 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
11950 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
11960 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
11970 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
11980 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e        pEnd = fin
11990 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
119a0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
119b0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
119c0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
119d0 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
119e0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
119f0 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
11a00 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20  .        pEnd = 
11a10 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
11a20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
11a30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11a40 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20  *pX;.        pX 
11a50 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
11a60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11a70 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
11a80 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
11a90 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
11aa0 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
11ab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11ac0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
11ad0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11ae0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11af0 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e  P_ForceInt, pX->
11b00 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d  op==TK_LE || pX-
11b10 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29  >op==TK_GT, brk)
11b20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11b30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52  3VdbeAddOp(v, bR
11b40 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a  ev ? OP_MoveLt :
11b50 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
11b60 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
11b70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11b80 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20  "pk"));.        
11b90 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
11ba0 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
11bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11bd0 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  Op(v, bRev ? OP_
11be0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
11bf0 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
11c00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11c10 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
11c20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
11c30 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
11c40 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
11c50 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
11c60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
11c70 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  d->leftCursor==i
11c80 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Cur );.        s
11c90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11ca0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
11cb0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  t);.        pLev
11cc0 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
11cd0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
11ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11cf0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
11d00 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
11d10 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
11d20 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
11d30 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
11d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
11d50 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
11d60 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
11d70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11d80 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
11d90 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
11da0 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _Gt;.        }. 
11db0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
11dc0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
11dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11de0 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
11df0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11e00 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
11e10 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
11e20 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
11e30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
11e40 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
11e50 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
11e60 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  t;.      if( tes
11e70 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
11e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11e90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
11ea0 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a  owid, iCur, 0);.
11eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11ec0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
11ed0 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
11ee0 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
11ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f00 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51  Op(v, testOp, SQ
11f10 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
11f20 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
11f30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
11f40 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
11f50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
11f60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
11f70 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
11f80 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
11f90 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
11fa0 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
11fb0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
11fc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
11fd0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
11fe0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
11ff0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
12000 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
12010 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
12020 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
12030 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
12040 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
12050 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
12060 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
12070 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
12080 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
12090 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
120a0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
120b0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
120c0 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
120d0 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
120e0 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
120f0 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
12100 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
12110 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
12120 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
12130 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
12140 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
12150 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
12160 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
12170 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
12180 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
12190 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
121a0 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
121b0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
121c0 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
121d0 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
121e0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
121f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
12200 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
12210 20 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b      int topEq=0;
12220 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12230 69 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65  if top limit use
12240 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73  s ==. False is s
12250 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20  trictly < */.   
12260 20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20     int btmEq=0; 
12270 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
12280 66 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73  f btm limit uses
12290 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74   ==. False if st
122a0 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20  rictly > */.    
122b0 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d    int topOp, btm
122c0 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f  Op;   /* Operato
122d0 72 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61  rs for the top a
122e0 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68  nd bottom search
122f0 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20   bounds */.     
12300 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20   int testOp;.   
12310 20 20 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b     int nNotNull;
12320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12330 20 6f 66 20 72 6f 77 73 20 6f 66 20 69 6e 64 65   of rows of inde
12340 78 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6e  x that must be n
12350 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  on-NULL */.     
12360 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20   int topLimit = 
12370 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
12380 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
12390 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20  )!=0;.      int 
123a0 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76  btmLimit = (pLev
123b0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
123c0 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b  E_BTM_LIMIT)!=0;
123d0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
123e0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
123f0 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
12400 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
12410 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
12420 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20  * and level the 
12430 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
12440 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
12450 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
12460 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
12470 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
12480 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
12490 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20  Ready, brk);..  
124a0 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65      /* Duplicate
124b0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
124c0 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75 73  rm values becaus
124d0 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20  e they will all 
124e0 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  be.      ** used
124f0 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20   twice: once to 
12500 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61  make the termina
12510 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63  tion key and onc
12520 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20  e to make the.  
12530 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
12540 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12550 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
12560 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
12570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12580 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31  v, OP_Dup, nEq-1
12590 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
125a0 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
125b0 75 74 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73  ut what comparis
125c0 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20  on operators to 
125d0 75 73 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20  use for top and 
125e0 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a  bottom .      **
125f0 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20   search bounds. 
12600 46 6f 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67  For an ascending
12610 20 69 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74   index, the bott
12620 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20  om bound is a > 
12630 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f  or >=.      ** o
12640 70 65 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20  perator and the 
12650 74 6f 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c  top bound is a <
12660 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e   or <= operator.
12670 20 20 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69    For a descendi
12680 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  ng.      ** inde
12690 78 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  x the operators 
126a0 61 72 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20  are reversed..  
126b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f      */.      nNo
126c0 74 4e 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74 6f  tNull = nEq + to
126d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 66  pLimit;.      if
126e0 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
126f0 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
12700 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  SO_ASC ){.      
12710 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c    topOp = WO_LT|
12720 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62  WO_LE;.        b
12730 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  tmOp = WO_GT|WO_
12740 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  GE;.      }else{
12750 0a 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d  .        topOp =
12760 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20   WO_GT|WO_GE;.  
12770 20 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f        btmOp = WO
12780 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _LT|WO_LE;.     
12790 20 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70     SWAP(int, top
127a0 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29  Limit, btmLimit)
127b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
127c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
127d0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79   termination key
127e0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
127f0 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20  ey value that.  
12800 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20      ** will end 
12810 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65  the search.  The
12820 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61  re is no termina
12830 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72  tion key if ther
12840 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e  e.      ** are n
12850 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  o equality terms
12860 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20   and no "X<..." 
12870 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  term..      **. 
12880 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63       ** 2002-Dec
12890 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73  -04: On a revers
128a0 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68  e-order scan, th
128b0 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72  e so-called "ter
128c0 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20  mination".      
128d0 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20  ** key computed 
128e0 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73  here really ends
128f0 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73 74   up being the st
12900 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a  art key..      *
12910 2f 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c  /.      if( topL
12920 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
12930 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
12940 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
12950 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
12960 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
12970 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
12980 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f   k, notReady, to
12990 70 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  pOp, pIdx);.    
129a0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
129b0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  m!=0 );.        
129c0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
129d0 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
129e0 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
129f0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
12a00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
12a10 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12a20 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
12a30 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71 20  ;.        topEq 
12a40 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
12a50 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
12a60 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  E);.        disa
12a70 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
12a80 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
12a90 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47  testOp = OP_IdxG
12aa0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
12ab0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
12ac0 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47   nEq>0 ? OP_IdxG
12ad0 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  E : OP_Noop;.   
12ae0 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a       topEq = 1;.
12af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12b00 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
12b10 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
12b20 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f   nCol = nEq + to
12b30 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
12b40 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
12b50 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
12b60 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
12b70 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
12b80 6e 45 71 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b  nEq, brk, pIdx);
12b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
12ba0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
12bb0 6e 74 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20  nt op = topEq ? 
12bc0 4f 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d  OP_MoveLe : OP_M
12bd0 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20  oveLt;.         
12be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12bf0 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  p(v, op, iIdxCur
12c00 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
12c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c30 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
12c40 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
12c50 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
12c60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
12c70 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ev ){.        sq
12c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12c90 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43  , OP_Last, iIdxC
12ca0 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
12cb0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
12cc0 72 61 74 65 20 74 68 65 20 73 74 61 72 74 20 6b  rate the start k
12cd0 65 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ey.  This is the
12ce0 20 6b 65 79 20 74 68 61 74 20 64 65 66 69 6e 65   key that define
12cf0 73 20 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20  s the lower.    
12d00 20 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68    ** bound on th
12d10 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
12d20 20 69 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79   is no start key
12d30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
12d40 0a 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69  .      ** equali
12d50 74 79 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20  ty terms and if 
12d60 74 68 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e  there is no "X>.
12d70 2e 2e 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20  .." term.  In.  
12d80 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
12d90 2c 20 67 65 6e 65 72 61 74 65 20 61 20 22 52 65  , generate a "Re
12da0 77 69 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f  wind" instructio
12db0 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  n in place of th
12dc0 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74  e.      ** start
12dd0 20 6b 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20   key search..   
12de0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
12df0 30 30 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74  002-Dec-04: In t
12e00 68 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 76  he case of a rev
12e10 65 72 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63  erse-order searc
12e20 68 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64  h, the so-called
12e30 0a 20 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74  .      ** "start
12e40 22 20 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64  " key really end
12e50 73 20 75 70 20 62 65 69 6e 67 20 75 73 65 64 20  s up being used 
12e60 61 73 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  as the terminati
12e70 6f 6e 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  on key..      */
12e80 0a 20 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69  .      if( btmLi
12e90 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45  mit ){.        E
12ea0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
12eb0 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
12ec0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
12ed0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
12ee0 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
12ef0 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d  k, notReady, btm
12f00 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  Op, pIdx);.     
12f10 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
12f20 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
12f30 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
12f40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12f50 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
12f60 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
12f70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
12f80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12f90 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
12fa0 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d  .        btmEq =
12fb0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12fc0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
12fd0 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  );.        disab
12fe0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
12ff0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
13000 73 65 7b 0a 20 20 20 20 20 20 20 20 62 74 6d 45  se{.        btmE
13010 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  q = 1;.      }. 
13020 20 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c       if( nEq>0 |
13030 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  | btmLimit ){.  
13040 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
13050 20 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b   nEq + btmLimit;
13060 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e  .        buildIn
13070 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c  dexProbe(v, nCol
13080 2c 20 30 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b  , 0, brk, pIdx);
13090 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
130a0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v ){.          p
130b0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
130c0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
130d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
130e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
130f0 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
13100 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
13110 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50       testOp = OP
13120 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20 20 20  _IdxLT;.        
13130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13140 20 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45 71 20   int op = btmEq 
13150 3f 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50  ? OP_MoveGe : OP
13160 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20  _MoveGt;.       
13170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13180 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  dOp(v, op, iIdxC
13190 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
131a0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
131b0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
131c0 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f      testOp = OP_
131d0 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Noop;.      }els
131e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
131f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13200 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75  P_Rewind, iIdxCu
13210 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
13220 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
13230 61 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20  ate the the top 
13240 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
13250 20 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d   there is a term
13260 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
13270 20 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20   key we have to 
13280 74 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65  test for that ke
13290 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74  y and abort at t
132a0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20  he top of the.  
132b0 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
132c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72     */.      star
132d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
132e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
132f0 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
13300 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
13310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13320 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
13330 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
13340 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13360 2c 20 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75  , testOp, iIdxCu
13370 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
13380 20 69 66 28 20 28 74 6f 70 45 71 20 26 26 20 21   if( (topEq && !
13390 62 52 65 76 29 20 7c 7c 20 28 21 62 74 6d 45 71  bRev) || (!btmEq
133a0 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20 20 20   && bRev) ){.   
133b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
133c0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
133d0 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43  , "+", P3_STATIC
133e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
133f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13400 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13410 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75  P_RowKey, iIdxCu
13420 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
13430 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13440 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e   OP_IdxIsNull, n
13450 4e 6f 74 4e 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a  NotNull, cont);.
13460 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
13470 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
13480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13490 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
134a0 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
134b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
134c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
134d0 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
134e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
134f0 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
13500 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
13510 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
13520 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
13530 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
13540 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
13550 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
13560 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
13570 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  xCur;.      pLev
13580 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
13590 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
135a0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
135b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b  ERE_COLUMN_EQ ){
135c0 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34  .      /* Case 4
135d0 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
135e0 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72  ndex and all ter
135f0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
13600 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20 20  clause that.    
13610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65    **          re
13620 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78  fer to the index
13630 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20   using the "==" 
13640 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
13650 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
13660 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
13670 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
13680 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20 20 20  vel->nEq;..     
13690 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
136a0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
136b0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
136c0 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
136d0 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c  N.      ** and l
136e0 65 61 76 65 20 74 68 65 20 76 61 6c 75 65 73 20  eave the values 
136f0 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f  of those terms o
13700 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  n the stack..   
13710 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65     */.      code
13720 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
13730 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
13740 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20   &wc, notReady, 
13750 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  brk);..      /* 
13760 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c  Generate a singl
13770 65 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20  e key that will 
13780 62 65 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20  be used to both 
13790 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e  start and termin
137a0 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
137b0 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f   search.      */
137c0 0a 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65  .      buildInde
137d0 78 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 30  xProbe(v, nEq, 0
137e0 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
137f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13800 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
13810 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
13820 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
13830 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
13840 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
13850 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
13860 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
13870 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
13880 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
13890 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
138a0 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
138b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
138c0 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
138d0 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
138e0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
138f0 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
13900 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
13910 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
13920 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
13930 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
13940 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
13950 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
13960 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
13970 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
13980 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
13990 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
139a0 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
139b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  .        /* Scan
139c0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
139d0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
139e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
139f0 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78   OP_MoveLe, iIdx
13a00 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
13a10 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
13a20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13a30 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
13a40 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
13a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13a60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c  AddOp(v, OP_IdxL
13a70 54 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  T, iIdxCur, brk)
13a80 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
13a90 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
13aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13ab0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
13ac0 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65  the forward orde
13ad0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
13ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13af0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78   OP_MoveGe, iIdx
13b00 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
13b10 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
13b20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13b30 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
13b40 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
13b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13b60 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c  Op3(v, OP_IdxGE,
13b70 20 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22   iIdxCur, brk, "
13b80 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
13b90 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
13ba0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
13bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13bd0 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
13be0 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
13bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13c00 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
13c10 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  nEq, cont);.    
13c20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
13c30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13c40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13c50 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
13c60 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
13c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c80 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
13c90 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
13ca0 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
13cb0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
13cc0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
13cd0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
13ce0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
13cf0 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
13d00 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
13d10 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
13d20 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
13d30 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
13d40 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
13d50 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13d60 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
13d70 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
13d80 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
13d90 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
13da0 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
13db0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
13dc0 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
13dd0 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
13de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13df0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
13e00 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a  ur, brk);.    }.
13e10 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
13e20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
13e30 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
13e40 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
13e50 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
13e60 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
13e70 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
13e80 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
13e90 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
13ea0 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
13eb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13ec0 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77  (pTerm=wc.a, j=w
13ed0 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  c.nTerm; j>0; j-
13ee0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
13ef0 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
13f00 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13f10 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
13f20 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
13f30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13f40 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13f50 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
13f60 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
13f70 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
13f80 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
13f90 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
13fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
13fb0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
13fc0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
13fd0 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
13fe0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
13ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
14000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14010 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14020 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a  , pE, cont, 1);.
14030 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
14040 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
14050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14060 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
14070 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
14080 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
14090 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
140a0 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
140b0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
140c0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
140d0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
140e0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
140f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
14100 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
14110 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
14120 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
14130 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
14140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14150 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
14160 49 6e 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  Int, 1, pLevel->
14170 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
14180 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14190 2c 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54  , "# record LEFT
141a0 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
141b0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63      for(pTerm=wc
141c0 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54  .a, j=0; j<wc.nT
141d0 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
141e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
141f0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28  pTerm->flags & (
14200 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
14210 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
14220 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
14230 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
14240 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
14250 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14270 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
14280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14290 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
142a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63   pTerm->pExpr, c
142b0 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ont, 1);.       
142c0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
142d0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
142e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
142f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14300 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69  ST  /* For testi
14310 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
14320 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f   use only */.  /
14330 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
14340 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72  query plan infor
14350 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
14360 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20   current table. 
14370 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65   ** and the inde
14380 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
14390 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49   it (if any).  I
143a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
143b0 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75  lf.  ** is not u
143c0 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73  sed, its name is
143d0 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20   just '{}'.  If 
143e0 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  no index is used
143f0 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
14400 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d  is listed as "{}
14410 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61  ".  If the prima
14420 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74  ry key is used t
14430 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61  he.  ** index na
14440 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a  me is '*'..  */.
14450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
14460 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
14470 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
14480 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70      int n;.    p
14490 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
144a0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49  >a[i];.    pTabI
144b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
144c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
144d0 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49  ];.    z = pTabI
144e0 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
144f0 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
14500 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
14510 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73  zName;.    n = s
14520 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66  trlen(z);.    if
14530 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
14540 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
14550 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
14560 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14570 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
14580 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
14590 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
145a0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
145b0 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20  lan], "{}");.   
145c0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
145d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
145e0 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
145f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
14600 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20  n[nQPlan], z);. 
14610 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
14620 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
14630 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
14640 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
14650 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ' ';.    }.    
14660 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
14670 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
14680 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
14690 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
146a0 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
146b0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
146c0 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20  n], "* ");.     
146d0 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
146e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
146f0 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20  el->pIdx==0 ){. 
14700 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
14710 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
14720 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b  nQPlan], "{} ");
14730 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
14740 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
14750 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
14760 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
14770 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
14780 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
14790 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
147a0 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20  plan)-2 ){.     
147b0 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
147c0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
147d0 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70  Plan], pLevel->p
147e0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
147f0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
14800 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14810 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
14820 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
14830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14840 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
14850 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
14860 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
14870 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
14880 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
14890 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
148a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
148b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
148c0 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
148d0 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
148e0 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
148f0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
14900 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
14910 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
14920 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
14930 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
14940 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
14950 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
14960 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
14970 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e  .  */.  pWInfo->
14980 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74  iContinue = cont
14990 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  ;.  whereClauseC
149a0 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74  lear(&wc);.  ret
149b0 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
149c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
149d0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
149e0 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a  hereBeginNoMem:.
149f0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
14a00 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65  ar(&wc);.  where
14a10 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
14a20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14a30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14a40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
14a50 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
14a60 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
14a70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
14a80 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
14a90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
14aa0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
14ab0 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
14ac0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
14ad0 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
14ae0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14af0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
14b00 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
14b10 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
14b20 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
14b30 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  List;..  /* Gene
14b40 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
14b50 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
14b60 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
14b70 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
14b80 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
14b90 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
14ba0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
14bb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14bc0 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
14bd0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
14be0 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
14bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14c00 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
14c10 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
14c20 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
14c30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14c40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14c50 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29  (v, pLevel->brk)
14c60 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
14c70 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->nIn ){.      i
14c80 6e 74 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74  nt *a;.      int
14c90 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
14ca0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26  pLevel->nIn, a=&
14cb0 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
14cc0 6a 2a 32 2d 32 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  j*2-2]; j>0; j--
14cd0 2c 20 61 2d 3d 32 29 7b 0a 20 20 20 20 20 20 20  , a-=2){.       
14ce0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14cf0 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 61 5b  p(v, OP_Next, a[
14d00 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 20 20 20  0], a[1]);.     
14d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14d20 6d 70 48 65 72 65 28 76 2c 20 61 5b 31 5d 2d 31  mpHere(v, a[1]-1
14d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14d40 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76   sqliteFree(pLev
14d50 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  el->aInLoop);.  
14d60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
14d70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
14d80 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
14d90 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14db0 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70  , OP_IfMemPos, p
14dc0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
14dd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14de0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14df0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
14e00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
14e10 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  or, 0);.      if
14e20 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
14e30 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
14e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e50 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
14e60 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
14e70 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e90 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
14ea0 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b  0, pLevel->top);
14eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14ec0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
14ed0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
14ee0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
14ef0 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
14f00 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
14f10 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
14f20 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
14f30 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14f40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14f50 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
14f60 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
14f70 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
14f80 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
14f90 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
14fa0 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
14fb0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
14fc0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
14fd0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
14fe0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
14ff0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
15000 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
15010 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
15020 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
15030 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
15040 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
15050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
15060 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
15070 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c   pTab->isEphem |
15080 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
15090 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
150a0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  if( (pLevel->fla
150b0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
150c0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
150d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
150e0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  p(v, OP_Close, p
150f0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
15100 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
15110 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
15120 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
15130 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15140 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
15150 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  l->iIdxCur, 0);.
15160 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
15170 6b 65 20 63 75 72 73 6f 72 20 73 75 62 73 74 69  ke cursor substi
15180 74 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65  tutions for case
15190 73 20 77 68 65 72 65 20 77 65 20 77 61 6e 74 20  s where we want 
151a0 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75  to use.    ** ju
151b0 73 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  st the index and
151c0 20 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63 65   never reference
151d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
151e0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
151f0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
15200 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
15210 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
15220 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
15230 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
15240 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
15250 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
15260 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
15270 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
15280 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
15290 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
152a0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
152b0 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
152c0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
152d0 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
152e0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
152f0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
15300 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
15310 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
15320 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
15330 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
15340 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  Y ){.      int k
15350 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
15360 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
15370 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
15380 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a  = pLevel->pIdx;.
15390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
153a0 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
153b0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
153c0 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
153d0 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
153e0 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
153f0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15400 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
15410 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
15420 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
15430 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
15440 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
15450 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
15460 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
15470 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
15480 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
15490 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
154a0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
154b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
154c0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
154d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
154e0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
154f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
15500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15510 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
15530 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
15540 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
15550 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15560 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
15570 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
15580 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
15590 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
155a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
155b0 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
155c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
155d0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
155e0 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a  ==OP_NullRow ){.
155f0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
15600 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
15610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15630 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
15640 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66  .  */.  whereInf
15650 6f 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20  oFree(pWInfo);. 
15660 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.