/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact f55d4459a122457a135cf9ec859bf28777d9156f:


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 33 34   where.c,v 1.234
0340: 20 32 30 30 36 2f 31 32 2f 32 30 20 30 33 3a 32   2006/12/20 03:2
0350: 34 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a 2a  4:19 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 23  e WO_MATCH  64.#
1910: 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c  define WO_ISNULL
1920: 20 31 32 38 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75   128../*.** Valu
1930: 65 20 66 6f 72 20 66 6c 61 67 73 20 72 65 74 75  e for flags retu
1940: 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64 65  rned by bestInde
1950: 78 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  x().*/.#define W
1960: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20  HERE_ROWID_EQ   
1970: 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20      0x0001   /* 
1980: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
1990: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  wid IN (...) */.
19a0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
19b0: 57 49 44 5f 52 41 4e 47 45 20 20 20 20 30 78 30  WID_RANGE    0x0
19c0: 30 30 32 20 20 20 2f 2a 20 72 6f 77 69 64 3c 45  002   /* rowid<E
19d0: 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64  XPR and/or rowid
19e0: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
19f0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1a00: 20 20 20 20 20 20 30 78 30 30 31 30 20 20 20 2f        0x0010   /
1a10: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
1a20: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1a30: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  e WHERE_COLUMN_R
1a40: 41 4e 47 45 20 20 20 30 78 30 30 32 30 20 20 20  ANGE   0x0020   
1a50: 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72  /* x<EXPR and/or
1a60: 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x>EXPR */.#defi
1a70: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
1a80: 49 4e 20 20 20 20 20 20 30 78 30 30 34 30 20 20  IN      0x0040  
1a90: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
1aa0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1ab0: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 20 20 30  TOP_LIMIT      0
1ac0: 78 30 31 30 30 20 20 20 2f 2a 20 78 3c 45 58 50  x0100   /* x<EXP
1ad0: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
1ae0: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
1af0: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
1b00: 49 54 20 20 20 20 20 20 30 78 30 32 30 30 20 20  IT      0x0200  
1b10: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
1b20: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
1b30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1b40: 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 20  E_IDX_ONLY      
1b50: 20 30 78 30 38 30 30 20 20 20 2f 2a 20 55 73 65   0x0800   /* Use
1b60: 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d   index only - om
1b70: 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  it table */.#def
1b80: 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45 52 42  ine WHERE_ORDERB
1b90: 59 20 20 20 20 20 20 20 20 30 78 31 30 30 30 20  Y        0x1000 
1ba0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c    /* Output will
1bb0: 20 61 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65   appear in corre
1bc0: 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  ct order */.#def
1bd0: 69 6e 65 20 57 48 45 52 45 5f 52 45 56 45 52 53  ine WHERE_REVERS
1be0: 45 20 20 20 20 20 20 20 20 30 78 32 30 30 30 20  E        0x2000 
1bf0: 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76    /* Scan in rev
1c00: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64  erse order */.#d
1c10: 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51  efine WHERE_UNIQ
1c20: 55 45 20 20 20 20 20 20 20 20 20 30 78 34 30 30  UE         0x400
1c30: 30 20 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  0   /* Selects n
1c40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
1c50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
1c60: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c70: 45 20 20 20 30 78 38 30 30 30 20 20 20 2f 2a 20  E   0x8000   /* 
1c80: 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  Use virtual-tabl
1c90: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
1ca0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1cb0: 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  e a preallocated
1cc0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1cd0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
1ce0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
1cf0: 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c 61 75  seInit(WhereClau
1d00: 73 65 20 2a 70 57 43 2c 20 50 61 72 73 65 20 2a  se *pWC, Parse *
1d10: 70 50 61 72 73 65 29 7b 0a 20 20 70 57 43 2d 3e  pParse){.  pWC->
1d20: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1d30: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20  .  pWC->nTerm = 
1d40: 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  0;.  pWC->nSlot 
1d50: 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57 43 2d  = ARRAYSIZE(pWC-
1d60: 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43  >aStatic);.  pWC
1d70: 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74  ->a = pWC->aStat
1d80: 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  ic;.}../*.** Dea
1d90: 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43  llocate a WhereC
1da0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
1db0: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
1dc0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
1dd0: 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65  tself is not fre
1de0: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
1df0: 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65  e is the inverse
1e00: 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49   of whereClauseI
1e10: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
1e20: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
1e30: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
1e40: 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20  se *pWC){.  int 
1e50: 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
1e60: 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  a;.  for(i=pWC->
1e70: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
1e80: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 66  +){.    if( a->f
1ea0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
1eb0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
1ec0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 61  ite3ExprDelete(a
1ed0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
1ee0: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
1ef0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
1f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1f10: 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a  (pWC->a);.  }.}.
1f20: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1f30: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
1f40: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
1f50: 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61 73 65  cture.  Increase
1f60: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
1f70: 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63 65 73  * space as neces
1f80: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  sary..**.** WARN
1f90: 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ING:  This routi
1fa0: 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63  ne might realloc
1fb0: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73  ate the space us
1fc0: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57  ed to store.** W
1fd0: 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20  hereTerms.  All 
1fe0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72  pointers to Wher
1ff0: 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65  eTerms should be
2000: 20 69 6e 76 61 6c 69 64 65 64 20 61 66 74 65 72   invalided after
2010: 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
2020: 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20   routine.  Such 
2030: 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20  pointers may be 
2040: 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  reinitialized by
2050: 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
2060: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
2070: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
2080: 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  t whereClauseIns
2090: 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  ert(WhereClause 
20a0: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 69  *pWC, Expr *p, i
20b0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 57 68 65  nt flags){.  Whe
20c0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
20d0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20   int idx;.  if( 
20e0: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
20f0: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
2100: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
2110: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d  pWC->a;.    pWC-
2120: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
2130: 63 28 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  c( sizeof(pWC->a
2140: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
2150: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
2160: 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ->a==0 ) return 
2170: 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57  0;.    memcpy(pW
2180: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
2190: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
21a0: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
21b0: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
21c0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
21d0: 71 6c 69 74 65 46 72 65 65 28 70 4f 6c 64 29 3b  qliteFree(pOld);
21e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
21f0: 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a  nSlot *= 2;.  }.
2200: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2210: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
2220: 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  rm];.  pWC->nTer
2230: 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45  m++;.  pTerm->pE
2240: 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d  xpr = p;.  pTerm
2250: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2260: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
2270: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
2280: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
2290: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
22a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22b0: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
22c0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
22d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
22e0: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
22f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
2300: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
2310: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
2320: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
2330: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
2340: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
2350: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
2360: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2370: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
2380: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
2390: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
23a0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
23b0: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
23c0: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
23d0: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
23e0: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
23f0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
2400: 5c 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 2f  _______________/
2420: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
2430: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
2440: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
2450: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2470: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
2480: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2490: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
24a0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
24b0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
24c0: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
24d0: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
24e0: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
24f0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
2500: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
2510: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
2520: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
2530: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
2540: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
2550: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
2560: 61 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72  array.  This arr
2570: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
2580: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
2590: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
25a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
25b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25c0: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
25d0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
25e0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29   *pExpr, int op)
25f0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
2600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2610: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
2620: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
2630: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
2640: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
2650: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
2660: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
2670: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
2680: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
2690: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
26a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
26b0: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
26c0: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a  ssion mask set.*
26d0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
26e0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
26f0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
2700: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
2710: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2720: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
2730: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
2740: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
2750: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
2760: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
2770: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45  itmask getMask(E
2780: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2790: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
27a0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
27b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
27c0: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
27d0: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
27e0: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
27f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
2800: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  Bitmask)1)<<i;. 
2810: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2820: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
2830: 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20  eate a new mask 
2840: 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73  for cursor iCurs
2850: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  or..**.** There 
2860: 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65  is one cursor pe
2870: 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  r table in the F
2880: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
2890: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61   number of.** ta
28a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
28b0: 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
28c0: 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72  ed by a test ear
28d0: 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ly in the.** sql
28e0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
28f0: 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65   routine.  So we
2900: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70   know that the p
2910: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a  MaskSet->ix[].**
2920: 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65   array will neve
2930: 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73  r overflow..*/.s
2940: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
2950: 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65  eMask(ExprMaskSe
2960: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
2970: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
2980: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
2990: 20 3c 20 41 52 52 41 59 53 49 5a 45 28 70 4d 61   < ARRAYSIZE(pMa
29a0: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
29b0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
29c0: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
29d0: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
29e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
29f0: 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29  ks (recursively)
2a00: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2a10: 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ree and generate
2a20: 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  s.** a bitmask i
2a30: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
2a40: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
2a50: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
2a60: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a  on.** tree..**.*
2a70: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
2a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77  his routine to w
2a90: 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ork, the calling
2aa0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68   function must h
2ab0: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
2ac0: 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65  y invoked sqlite
2ad0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
2ae0: 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65  s() on the expre
2af0: 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74  ssion.  See.** t
2b00: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
2b10: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
2b20: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
2b30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2b40: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
2b50: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72  ResolveNames() r
2b60: 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f  outines looks fo
2b70: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  r column names a
2b80: 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72  nd.** sets their
2b90: 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43   opcodes to TK_C
2ba0: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20  OLUMN and their 
2bb0: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
2bc0: 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42  ds to.** the VDB
2bd0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
2be0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
2bf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
2c00: 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73   has to.** trans
2c10: 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  late the cursor 
2c20: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
2c30: 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20  mask values and 
2c40: 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69  OR all.** the bi
2c50: 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e  tmasks together.
2c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2c70: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2c80: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2c90: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
2ca0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2cb0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2cc0: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a  age(ExprMaskSet*
2cd0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
2ce0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
2cf0: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
2d00: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2d10: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
2d20: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
2d30: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2d40: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
2d50: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
2d60: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2d70: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2d80: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2d90: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2da0: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2db0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2dc0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2dd0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2de0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2df0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b  ->pLeft);.  mask
2e00: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2e10: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2e20: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61   p->pList);.  ma
2e30: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
2e40: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2e50: 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  Set, p->pSelect)
2e60: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  ;.  return mask;
2e70: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2e80: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2e90: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
2ea0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2eb0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2ec0: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
2ed0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
2ee0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2ef0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
2f00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2f10: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
2f20: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2f30: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2f40: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2f50: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2f60: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2f70: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2f80: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
2f90: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
2fa0: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
2fb0: 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69 66 28  mask mask;.  if(
2fc0: 20 70 53 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 61   pS==0 ){.    ma
2fd0: 73 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  sk = 0;.  }else{
2fe0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 65 78 70 72  .    mask = expr
2ff0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3000: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
3010: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
3020: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
3030: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
3040: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
3050: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
3060: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
3070: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
3080: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
3090: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
30a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
30b0: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
30c0: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
30d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
30e0: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d 0a 20  >pHaving);.  }. 
30f0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
3100: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
3110: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
3120: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
3130: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
3140: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
3150: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
3160: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
3170: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
3180: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
3190: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
31a0: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
31b0: 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74   and "IN"..*/.st
31c0: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64  atic int allowed
31d0: 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73  Op(int op){.  as
31e0: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
31f0: 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45  Q && TK_GT<TK_GE
3200: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
3210: 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LT>TK_EQ && TK_
3220: 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LT<TK_GE );.  as
3230: 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45  sert( TK_LE>TK_E
3240: 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45  Q && TK_LE<TK_GE
3250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
3260: 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a  _GE==TK_EQ+4 );.
3270: 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f    return op==TK_
3280: 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51  IN || (op>=TK_EQ
3290: 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c   && op<=TK_GE) |
32a0: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b  | op==TK_ISNULL;
32b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
32c0: 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79  wo objects of ty
32d0: 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  pe T..*/.#define
32e0: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
32f0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
3300: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
3310: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 69  mute a comparisi
3320: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
3330: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
3340: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
3350: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
3360: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
3370: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
3380: 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20 2a  prCommute(Expr *
3390: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
33a0: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
33b0: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
33c0: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
33d0: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
33e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
33f0: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
3400: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50 28  >pColl);.  SWAP(
3410: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
3420: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
3430: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
3440: 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op>=TK_GT ){.   
3450: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
3460: 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61  TK_GT+2 );.    a
3470: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
3480: 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _LE+2 );.    ass
3490: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
34a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34b0: 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20  TK_GT<TK_LE );. 
34c0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
34d0: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70  ->op>=TK_GT && p
34e0: 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20  Expr->op<=TK_GE 
34f0: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
3500: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54   = ((pExpr->op-T
3510: 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a  K_GT)^2)+TK_GT;.
3520: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
3530: 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78  nslate from TK_x
3540: 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f  x operator to WO
3550: 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a  _xx bitmask..*/.
3560: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72 61  static int opera
3570: 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b  torMask(int op){
3580: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73 65  .  int c;.  asse
3590: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  rt( allowedOp(op
35a0: 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  ) );.  if( op==T
35b0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20  K_IN ){.    c = 
35c0: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_IN;.  }else i
35d0: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
35e0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
35f0: 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  SNULL;.  }else{.
3600: 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28      c = WO_EQ<<(
3610: 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20  op-TK_EQ);.  }. 
3620: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3630: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
3640: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
3650: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
3660: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
3670: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
3680: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
3690: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
36a0: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
36b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
36c0: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
36d0: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
36e0: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
36f0: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3700: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3710: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3720: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3730: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
3740: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
3750: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
3760: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
3770: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
3780: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
3790: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
37a0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
37b0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
37c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
37d0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
37e0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
37f0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
3800: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3810: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
3820: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
3830: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
3840: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
3850: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3860: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3870: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3880: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3890: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
38a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
38b0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
38c0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
38d0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
38e0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
38f0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
3900: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3910: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3920: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3930: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3940: 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u16 op,         
3950: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3960: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
3970: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
3980: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
3990: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
39a0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
39b0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
39c0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
39d0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
39e0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
39f0: 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  k;.  for(pTerm=p
3a00: 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
3a10: 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65  erm; k; k--, pTe
3a20: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
3a30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
3a40: 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26  ==iCur.       &&
3a50: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
3a60: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3a70: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
3a80: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  erm->leftColumn=
3a90: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3aa0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
3ab0: 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20  ator & op)!=0.  
3ac0: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69    ){.      if( i
3ad0: 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20 26  Cur>=0 && pIdx &
3ae0: 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
3af0: 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  or!=WO_ISNULL ){
3b00: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
3b10: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3b20: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
3b30: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
3b40: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20    char idxaff;. 
3b50: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
3b60: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
3b70: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
3b80: 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61  e;..        idxa
3b90: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
3ba0: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
3bb0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
3bc0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
3bd0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
3be0: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
3bf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
3c00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
3c10: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3c20: 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  , pX->pLeft);.  
3c30: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
3c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3c50: 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b 0a  ( pX->pRight ){.
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3c70: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3c80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
3c90: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
3ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3cb0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3cd0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
3ce0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
3cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3d00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
3d10: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
3d20: 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  n && pIdx->aiCol
3d30: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
3d40: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
3d50: 61 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e  assert( j<pIdx->
3d60: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
3d70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3d80: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3d90: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
3da0: 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [j]) ) continue;
3db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
3dc0: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
3dd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3de0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
3df0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3e00: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
3e10: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
3e20: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57 68  ExprMaskSet*, Wh
3e30: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
3e40: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
3e50: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
3e60: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
3e70: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a  E clause.  .**.*
3e80: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
3e90: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
3ea0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
3eb0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
3ec0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3ed0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
3ee0: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20  *pMaskSet,   /* 
3ef0: 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  table masks */. 
3f00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3f10: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
3f20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
3f30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
3f40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
3f50: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
3f60: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3f70: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
3f80: 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65 74  abList, pMaskSet
3f90: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
3fa0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3fb0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
3fc0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
3fd0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
3fe0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
3ff0: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
4000: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
4010: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
4020: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
4030: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
4040: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
4050: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
4060: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
4070: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
4080: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
4090: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
40a0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
40b0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
40c0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
40d0: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
40e0: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
40f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4100: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73  sLikeOrGlob(.  s
4110: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
4120: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
4130: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4140: 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  r,      /* Test 
4150: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
4160: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74  */.  int *pnPatt
4170: 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ern,   /* Number
4180: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
4190: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
41a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  rs */.  int *pis
41b0: 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75  Complete  /* Tru
41c0: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
41d0: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
41e0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
41f0: 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  r */.){.  const 
4200: 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20  char *z;.  Expr 
4210: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
4220: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4230: 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74  st;.  int c, cnt
4240: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
4250: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20    char wc[3];.  
4260: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
4270: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
4280: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
4290: 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65  , pExpr, &noCase
42a0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
42b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
42c0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
42d0: 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  t;.  pRight = pL
42e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
42f0: 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f  .  if( pRight->o
4300: 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
4310: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4320: 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  }.  pLeft = pLis
4330: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
4340: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
4350: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
4360: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4370: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
4380: 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f  pColl;.  if( pCo
4390: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  ll==0 ){.    pCo
43a0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
43b0: 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ll;.  }.  if( (p
43c0: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
43d0: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c  TE_COLL_BINARY |
43e0: 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20  | noCase) &&.   
43f0: 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21     (pColl->type!
4400: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43  =SQLITE_COLL_NOC
4410: 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20  ASE || !noCase) 
4420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4430: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
4440: 71 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74  quoteExpr(pRight
4450: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
4460: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
4470: 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 28  ;.  for(cnt=0; (
4480: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
4490: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
44a0: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
44b0: 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66 28  ; cnt++){}.  if(
44c0: 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d   cnt==0 || 255==
44d0: 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20  (u8)z[cnt] ){.  
44e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
44f0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
4500: 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26   z[cnt]==wc[0] &
4510: 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20  & z[cnt+1]==0;. 
4520: 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e   *pnPattern = cn
4530: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
4540: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4550: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
4560: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
4570: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4580: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
4590: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
45a0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
45b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
45c0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
45d0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
45e0: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
45f0: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
4600: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
4610: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
4620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4630: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
4640: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
4650: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
4660: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
4670: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4680: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
4690: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
46a0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
46b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
46c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c  pr->token.n!=5 |
46d0: 7c 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  |.       sqlite3
46e0: 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74 20  StrNICmp((const 
46f0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
4700: 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29 21  en.z,"match",5)!
4710: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4720: 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   0;.  }.  pList 
4730: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
4740: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
4750: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
4760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
4770: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
4780: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
4790: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
47a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
47b0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
47c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
47d0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
47e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
47f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
4800: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
4810: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
4820: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
4830: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
4840: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
4850: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
4860: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
4870: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
4880: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
4890: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
48a0: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
48b0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
48c0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
48d0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
48e0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
48f0: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
4900: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
4910: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  }.../*.** The in
4920: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
4930: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
4940: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
4950: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
4960: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
4970: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
4980: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
4990: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
49a0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
49b0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
49c0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
49d0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
49e0: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
49f0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
4a00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
4a10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
4a20: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
4a30: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
4a40: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
4a50: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
4a60: 3c 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68 65  <expr>".  If the
4a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
4a80: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
4a90: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
4aa0: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 20  oth X and Y are 
4ab0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
4ac0: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78  e original.** ex
4ad0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
4ae0: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
4af0: 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 69  virtual expressi
4b00: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  on of the form.*
4b10: 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20  * "Y <op> X" is 
4b20: 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45  added to the WHE
4b30: 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61 6e  RE clause and an
4b40: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
4b50: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
4b60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
4b70: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
4b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
4b90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
4ba0: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
4bb0: 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20  pMaskSet,    /* 
4bc0: 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  table masks */. 
4bd0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4be0: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
4bf0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
4c00: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c20: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
4c30: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
4c40: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
4c50: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
4c60: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
4c70: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
4c80: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42  Term->pExpr;.  B
4c90: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
4ca0: 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  t;.  Bitmask pre
4cb0: 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 6e 50  reqAll;.  int nP
4cc0: 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73  attern;.  int is
4cd0: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 69 6e 74 20  Complete;.  int 
4ce0: 6f 70 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  op;..  if( sqlit
4cf0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
4d00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72 65   ) return;.  pre
4d10: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
4d20: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4d30: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
4d40: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
4d50: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
4d60: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
4d70: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
4d80: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d  ==0 );.    pTerm
4d90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
4da0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4db0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
4dc0: 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20 20  pr->pList).     
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 7c 20 65 78 70 72 53 65 6c 65 63       | exprSelec
4df0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4e00: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 53 65  kSet, pExpr->pSe
4e10: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  lect);.  }else i
4e20: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
4e30: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
4e40: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
4e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
4e60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
4e70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4e80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4e90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
4ea0: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
4eb0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4ec0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
4ed0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
4ee0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
4ef0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
4f00: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d  rereqAll |= getM
4f10: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
4f20: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
4f30: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65  able);.  }.  pTe
4f40: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
4f50: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
4f60: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
4f70: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
4f80: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
4f90: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
4fa0: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
4fb0: 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72  dOp(op) && (pTer
4fc0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
4fd0: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
4fe0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
4ff0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
5000: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  t;.    Expr *pRi
5010: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
5020: 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ght;.    if( pLe
5030: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
5040: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
5050: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
5060: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
5070: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
5080: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
5090: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
50a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
50b0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
50c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
50d0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
50e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
50f0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
5100: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
5110: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
5120: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
5130: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
5140: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
5150: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
5160: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5170: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
5180: 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
5190: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
51a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
51b0: 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  ee(pDup);.      
51c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
51d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
51e0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
51f0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
5200: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
5210: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
5220: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
5230: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
5240: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
5250: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
5260: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
5270: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
5280: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
5290: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
52a0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
52b0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
52c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
52d0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
52e0: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
52f0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
5300: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
5310: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
5320: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
5330: 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20  mmute(pDup);.   
5340: 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d     pLeft = pDup-
5350: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e  >pLeft;.      pN
5360: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
5370: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
5380: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
5390: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
53a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
53b0: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
53c0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20   = prereqLeft;. 
53d0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
53e0: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
53f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
5400: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
5410: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
5420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
5430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5440: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
5450: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
5460: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
5470: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
5480: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
5490: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
54a0: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
54b0: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
54c0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
54d0: 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  s..  */.  else i
54e0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
54f0: 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20  _BETWEEN ){.    
5500: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
5510: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
5520: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
5530: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
5540: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
5550: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
5560: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
5570: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
5580: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
5590: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
55a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
55b0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
55c0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
55d0: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
55e0: 71 6c 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69  qlite3Expr(ops[i
55f0: 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ], sqlite3ExprDu
5600: 70 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c  p(pExpr->pLeft),
5610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5630: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 69  lite3ExprDup(pLi
5640: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c  st->a[i].pExpr),
5650: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
5660: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
5670: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
5680: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
5690: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
56a0: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
56b0: 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ze(pSrc, pMaskSe
56c0: 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  t, pWC, idxNew);
56d0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
56e0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
56f0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
5700: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
5710: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
5720: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
5730: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
5740: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5750: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
5760: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
5770: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5780: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
5790: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
57a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
57b0: 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ERY).  /* Attemp
57c0: 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d  t to convert OR-
57d0: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
57e0: 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61  into an IN opera
57f0: 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a  tor so that.  **
5800: 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75   they can make u
5810: 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
5820: 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
5830: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
5840: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
5850: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
5860: 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e    **.  ** is con
5870: 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  verted into.  **
5880: 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .  **      x IN 
5890: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
58a0: 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  r3).  **.  ** Th
58b0: 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
58c0: 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65 64 20  must be omitted 
58d0: 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  if OMIT_SUBQUERY
58e0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 65 63 61   is defined beca
58f0: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d  use.  ** the com
5900: 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20 74 68  piler for the th
5910: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
5920: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71 75 65   part of sub-que
5930: 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ries..  */.  els
5940: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
5950: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69 6e  =TK_OR ){.    in
5960: 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69 2c  t ok;.    int i,
5970: 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   j;.    int iCol
5980: 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20 20  umn, iCursor;.  
5990: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 4f    WhereClause sO
59a0: 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  r;.    WhereTerm
59b0: 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20 20   *pOrTerm;..    
59c0: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
59d0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  flags & TERM_DYN
59e0: 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  AMIC)==0 );.    
59f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
5a00: 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72 73  &sOr, pWC->pPars
5a10: 65 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  e);.    whereSpl
5a20: 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20  it(&sOr, pExpr, 
5a30: 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72  TK_OR);.    expr
5a40: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
5a50: 20 70 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72 29   pMaskSet, &sOr)
5a60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4f  ;.    assert( sO
5a70: 72 2e 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 20  r.nTerm>0 );.   
5a80: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a   j = 0;.    do{.
5a90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
5aa0: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c  sOr.a[j].leftCol
5ab0: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73  umn;.      iCurs
5ac0: 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65  or = sOr.a[j].le
5ad0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
5ae0: 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b  ok = iCursor>=0;
5af0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
5b00: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
5b10: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
5b20: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
5b30: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
5b40: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
5b50: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
5b60: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
5b70: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
5b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5b90: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
5ba0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
5bb0: 72 20 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  r && pOrTerm->le
5bc0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
5bd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
5be0: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d  OrTerm->flags |=
5bf0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
5c00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
5c10: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5c20: 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30   TERM_COPIED)!=0
5c30: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
5c40: 20 20 20 20 20 20 20 20 28 28 70 4f 72 54 65 72          ((pOrTer
5c50: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
5c60: 56 49 52 54 55 41 4c 29 21 3d 30 20 26 26 0a 20  VIRTUAL)!=0 &&. 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65      (sOr.a[pOrTe
5c90: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61  rm->iParent].fla
5ca0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
5cb0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
5cc0: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
5cd0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
5ce0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5cf0: 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30            ok = 0
5d00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5d10: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
5d20: 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b  !ok && (sOr.a[j+
5d30: 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  +].flags & TERM_
5d40: 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c  COPIED)!=0 && j<
5d50: 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  sOr.nTerm );.   
5d60: 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20   if( ok ){.     
5d70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5d80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
5d90: 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20   *pNew, *pDup;. 
5da0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
5db0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
5dc0: 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70  i=sOr.nTerm-1, p
5dd0: 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e  OrTerm=sOr.a; i>
5de0: 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70  =0 && ok; i--, p
5df0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
5e00: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
5e10: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  >flags & TERM_OR
5e20: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
5e30: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ue;.        pDup
5e40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5e50: 70 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  p(pOrTerm->pExpr
5e60: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
5e70: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5e80: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5e90: 28 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29  (pList, pDup, 0)
5ea0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
5eb0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
5ec0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
5ed0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5ee0: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
5ef0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
5f00: 78 70 72 44 75 70 28 70 4c 65 66 74 29 3b 0a 20  xprDup(pLeft);. 
5f10: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
5f20: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70  te3Expr(TK_IN, p
5f30: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
5f40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
5f50: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
5f60: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
5f70: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
5f80: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
5f90: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74       pNew->pList
5fa0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
5fb0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
5fc0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
5fd0: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
5fe0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
5ff0: 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  C);.        expr
6000: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d  Analyze(pSrc, pM
6010: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78  askSet, pWC, idx
6020: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
6030: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
6040: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
6050: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
6060: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6070: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
6080: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
6090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
60a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
60b0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
60c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72        }.    }.or
60d0: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20  _not_possible:. 
60e0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
60f0: 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23  ear(&sOr);.  }.#
6100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6110: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6120: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
6130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
6140: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
6150: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
6160: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
6170: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
6180: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
6190: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
61a0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b    */.  if( isLik
61b0: 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61  eOrGlob(pWC->pPa
61c0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
61d0: 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f  &nPattern, &isCo
61e0: 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20 45  mplete) ){.    E
61f0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
6200: 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ght;.    Expr *p
6210: 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20  Str1, *pStr2;.  
6220: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
6230: 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  1, *pNewExpr2;. 
6240: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20     int idxNew1, 
6250: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
6260: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  eft = pExpr->pLi
6270: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
6280: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
6290: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
62a0: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31  pExpr;.    pStr1
62b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
62c0: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
62d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  0);.    if( pStr
62e0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
62f0: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74  e3TokenCopy(&pSt
6300: 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67  r1->token, &pRig
6310: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
6320: 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e    pStr1->token.n
6330: 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20   = nPattern;.   
6340: 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73   }.    pStr2 = s
6350: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
6360: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 53  tr1);.    if( pS
6370: 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73 73  tr2 ){.      ass
6380: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
6390: 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b  n.dyn );.      +
63a0: 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74  +*(u8*)&pStr2->t
63b0: 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d  oken.z[nPattern-
63c0: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  1];.    }.    pN
63d0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
63e0: 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71 6c  3Expr(TK_GE, sql
63f0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
6400: 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  t), pStr1, 0);. 
6410: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
6420: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6430: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
6440: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
6450: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
6460: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
6470: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
6480: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
6490: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
64a0: 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c  3Expr(TK_LT, sql
64b0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65 66  ite3ExprDup(pLef
64c0: 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20  t), pStr2, 0);. 
64d0: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
64e0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
64f0: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
6500: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
6510: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65  _DYNAMIC);.    e
6520: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
6530: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
6540: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
6550: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
6560: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
6570: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
6580: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
6590: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
65a0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
65b0: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
65c0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
65d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
65e0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
65f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
6600: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
6610: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
6620: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6630: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6640: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
6650: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
6660: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
6670: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
6680: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
6690: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
66a0: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
66b0: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
66c0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
66d0: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
66e0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
66f0: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
6700: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
6710: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
6720: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
6730: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
6740: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
6750: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
6760: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
6770: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
6780: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
6790: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
67a0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
67b0: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
67c0: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
67d0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
67e0: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
67f0: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
6800: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
6810: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
6820: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
6830: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
6840: 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20     prereqExpr = 
6850: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
6860: 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29  MaskSet, pRight)
6870: 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75  ;.    prereqColu
6880: 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  mn = exprTableUs
6890: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
68a0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70  eft);.    if( (p
68b0: 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72  rereqExpr & prer
68c0: 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a  eqColumn)==0 ){.
68d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
68e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
68f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6900: 70 72 28 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  pr(TK_MATCH, 0, 
6910: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6920: 52 69 67 68 74 29 2c 20 30 29 3b 0a 20 20 20 20  Right), 0);.    
6930: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
6940: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
6950: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
6960: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
6970: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 70 4e  NAMIC);.      pN
6980: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
6990: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
69a0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
69b0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
69c0: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
69d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
69e0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
69f0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
6a00: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
6a10: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
6a20: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
6a30: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
6a40: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
6a50: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
6a60: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
6a70: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
6a80: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
6a90: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
6aa0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
6ab0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
6ac0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
6ad0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
6ae0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
6af0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6b00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6b10: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
6b20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
6b30: 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69  outine decides i
6b40: 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73  f pIdx can be us
6b50: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
6b60: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
6b70: 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e  ause.  If it can
6b80: 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  , it returns 1. 
6b90: 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20   If pIdx cannot 
6ba0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f  satisfy the.** O
6bb0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
6bc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6bd0: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f  urns 0..**.** pO
6be0: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
6bf0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
6c00: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
6c10: 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74  ment.  pTab is t
6c20: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
6c30: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
6c40: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  M clause of that
6c50: 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61   same SELECT sta
6c60: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68  tement and.** th
6c70: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75  e table has a cu
6c80: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
6c90: 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
6ca0: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62  an index on pTab
6cb0: 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
6cc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6cd0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
6ce0: 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
6cf0: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
6d00: 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f  straints.  Any o
6d10: 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  f these columns 
6d20: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66  may be missing f
6d30: 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
6d40: 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74  .** clause and t
6d50: 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69  he match can sti
6d60: 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e  ll be a success.
6d70: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73  .**.** All terms
6d80: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6d90: 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69   that match agai
6da0: 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75  nst the index mu
6db0: 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20  st be either.** 
6dc0: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54  ASC or DESC.  (T
6dd0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
6de0: 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74  R BY clause past
6df0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e   the end of a UN
6e00: 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f  IQUE.** index do
6e10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74   not need to sat
6e20: 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72  isfy this constr
6e30: 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52  aint.)  The *pbR
6e40: 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  ev value is.** s
6e50: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f  et to 1 if the O
6e60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
6e70: 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69  s all DESC and i
6e80: 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  t is set to 0 if
6e90: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
6ea0: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41   clause is all A
6eb0: 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SC..*/.static in
6ec0: 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  t isSortingIndex
6ed0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6ee0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6ef0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6f00: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6f20: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
6f30: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  testing */.  int
6f40: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
6f50: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
6f60: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6f70: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
6f80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6f90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
6fa0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
6fb0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
6fc0: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
6fd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
6fe0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
6ff0: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
7000: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7020: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
7030: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
7040: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7070: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
7080: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
7090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
70a0: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
70b0: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
70c0: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
70d0: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70f0: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
7100: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
7110: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7120: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
7130: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
7140: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
7150: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7160: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
7170: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
7180: 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20  y!=0 );.  nTerm 
7190: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
71a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  r;.  assert( nTe
71b0: 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  rm>0 );..  /* Ma
71c0: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
71d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
71e0: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
71f0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
7200: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
7210: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
7220: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
7230: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
7240: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
7250: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
7260: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
7270: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
7280: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
7290: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
72a0: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
72b0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
72c0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
72d0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
72e0: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
72f0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
7300: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
7310: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
7320: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
7330: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
7340: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
7350: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
7360: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
7370: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
7380: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7390: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
73a0: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
73b0: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
73c0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
73d0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
73e0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
73f0: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
7400: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
7410: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
7420: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
7430: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
7440: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
7450: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
7460: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
7470: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
7480: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
7490: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
74a0: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
74b0: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
74c0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
74d0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
74e0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
74f0: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
7500: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
7510: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
7520: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
7530: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
7540: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
7550: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
7560: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
7570: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7580: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7590: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   0;.    }.    pC
75a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
75b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
75c0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
75d0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
75e0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
75f0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
7600: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43    if( i<pIdx->nC
7610: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
7620: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
7630: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
7640: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
7650: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
7660: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
7670: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
7680: 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
7690: 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
76a0: 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
76b0: 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
76c0: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d  azColl[i];.    }
76d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c  else{.      iCol
76e0: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
76f0: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  iSortOrder = 0;.
7700: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43        zColl = pC
7710: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
7720: 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  }.    if( pExpr-
7730: 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
7740: 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  n || sqlite3StrI
7750: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
7760: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
7770: 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74    /* Term j of t
7780: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7790: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
77a0: 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68  h column i of th
77b0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
77c0: 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b   if( i<nEqCol ){
77d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
77e0: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  n index column t
77f0: 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
7800: 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74  ed by == fails t
7810: 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20  o match an.     
7820: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74     ** ORDER BY t
7830: 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e  erm, that is OK.
7840: 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68    Just ignore th
7850: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  at column of the
7860: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a   index.        *
7870: 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
7880: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
7890: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
78a0: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
78b0: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
78c0: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61  d is not constra
78d0: 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20  ined by ==.     
78e0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69     ** then the i
78f0: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  ndex cannot sati
7900: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
7910: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
7920: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
7940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
7950: 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
7960: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  rder!=0 );.    a
7970: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f  ssert( pTerm->so
7980: 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54  rtOrder==0 || pT
7990: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
79a0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
79b0: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c   iSortOrder==0 |
79c0: 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20  | iSortOrder==1 
79d0: 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
79e0: 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65  rder = iSortOrde
79f0: 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  r ^ pTerm->sortO
7a00: 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e  rder;.    if( i>
7a10: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
7a20: 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
7a30: 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  r!=sortOrder ){.
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
7a50: 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  es can only be u
7a60: 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52  sed if all ORDER
7a70: 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74   BY terms past t
7a80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71  he.        ** eq
7a90: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
7aa0: 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ts are all eithe
7ab0: 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a  r DESC or ASC. *
7ac0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
7ad0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72  }else{.      sor
7af0: 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
7b00: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
7b10: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
7b20: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
7b30: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  umn<0 ){.      /
7b40: 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64  * If the indexed
7b50: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70   column is the p
7b60: 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65  rimary key and e
7b70: 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65  verything matche
7b80: 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61  s.      ** so fa
7b90: 72 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  r, then we are a
7ba0: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
7bb0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
7bc0: 64 20 74 6f 20 73 6f 72 74 0a 20 20 20 20 20 20  d to sort.      
7bd0: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ** because the p
7be0: 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e  rimary key is un
7bf0: 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65  ique and so none
7c00: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 63 6f   of the other co
7c10: 6c 75 6d 6e 73 0a 20 20 20 20 20 20 2a 2a 20 77  lumns.      ** w
7c20: 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66  ill make any dif
7c30: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f  ference.      */
7c40: 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d  .      j = nTerm
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
7c60: 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
7c70: 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e  r!=0;.  if( j>=n
7c80: 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Term ){.    /* A
7c90: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
7ca0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7cb0: 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
7cc0: 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20  his index so.   
7cd0: 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63   ** this index c
7ce0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
7cf0: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  orting. */.    r
7d00: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
7d10: 66 28 20 6a 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( j==pIdx->nCol
7d20: 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  umn && pIdx->onE
7d30: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
7d40: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d  .    /* All term
7d50: 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20  s of this index 
7d60: 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66 69  match some prefi
7d70: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
7d80: 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
7d90: 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20 69  and this index i
7da0: 73 20 55 4e 49 51 55 45 2c 20 73 6f 20 74 68 69  s UNIQUE, so thi
7db0: 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  s index can be u
7dc0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  sed for sorting.
7dd0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
7de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
7e00: 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66   table to see if
7e10: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7e20: 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79  ause in pOrderBy
7e30: 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
7e40: 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20  d.** by sorting 
7e50: 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49  in order of ROWI
7e60: 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  D.  Return true 
7e70: 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70  if so and set *p
7e80: 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72  bRev to be.** tr
7e90: 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52  ue for reverse R
7ea0: 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66  OWID and false f
7eb0: 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44  or forward ROWID
7ec0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
7ed0: 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79  c int sortableBy
7ee0: 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73  Rowid(.  int bas
7ef0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7f00: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
7f10: 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62  r for table to b
7f20: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
7f30: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7f40: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
7f50: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
7f60: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
7f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
7f80: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
7f90: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
7fa0: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
7fb0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
7fc0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
7fd0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
7fe0: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
7ff0: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
8000: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
8010: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
8020: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
8030: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20  iColumn==-1 ){. 
8040: 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64     *pbRev = pOrd
8050: 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  erBy->a[0].sortO
8060: 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e  rder;.    return
8070: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
8080: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   0;.}../*.** Pre
8090: 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74  pare a crude est
80a0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67  imate of the log
80b0: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
80c0: 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  put value..** Th
80d0: 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e  e results need n
80e0: 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68  ot be exact.  Th
80f0: 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  is is only used 
8100: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a  for estimating.*
8110: 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74  * the total cost
8120: 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f   of performing o
8130: 70 65 72 61 74 69 6e 67 73 20 77 69 74 68 20 4f  peratings with O
8140: 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67  (logN) or O(Nlog
8150: 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79  N).** complexity
8160: 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20  .  Because N is 
8170: 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74  just a guess, it
8180: 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61   is no great tra
8190: 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20  gedy if.** logN 
81a0: 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e  is a little off.
81b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
81c0: 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20  e estLog(double 
81d0: 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67  N){.  double log
81e0: 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20  N = 1;.  double 
81f0: 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28  x = 10;.  while(
8200: 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e   N>x ){.    logN
8210: 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20   += 1;.    x *= 
8220: 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  10;.  }.  return
8230: 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   logN;.}../*.** 
8240: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
8250: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
8260: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
8270: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
8280: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
8290: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
82a0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
82b0: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
82c0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
82d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
82e0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
82f0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
8300: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
8310: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8320: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8330: 4c 54 41 42 4c 45 29 20 26 26 20 5c 0a 20 20 20  LTABLE) && \.   
8340: 20 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51       (defined(SQ
8350: 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
8360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
8370: 55 47 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64  UG)).static void
8380: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
8390: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
83a0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
83b0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
83c0: 33 5f 77 68 65 72 65 5f 74 72 61 63 65 20 29 20  3_where_trace ) 
83d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
83e0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
83f0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
8400: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
8410: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
8420: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
8430: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
8440: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
8450: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
8460: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
8470: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
8480: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
8490: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
84a0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
84b0: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
84c0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
84d0: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
84e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
84f0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
8500: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
8510: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
8520: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
8530: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
8540: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
8550: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
8560: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
8570: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
8580: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
8590: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
85a0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
85b0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
85c0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
85d0: 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 20  te3_where_trace 
85e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
85f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
8600: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
8610: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
8620: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
8630: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
8640: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
8650: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
8660: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
8670: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
8680: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
8690: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
86a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
86b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
86c0: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
86d0: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
86e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
86f0: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
8700: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
8710: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
8720: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
8730: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
8740: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
8750: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
8760: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
8770: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
8780: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23  imatedCost);.}.#
8790: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
87a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
87b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
87c0: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
87d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
87e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
87f0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LTABLE./*.** Com
8800: 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69 6e  pute the best in
8810: 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75 61  dex for a virtua
8820: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
8830: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69 73  he best index is
8840: 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
8850: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
8860: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
8870: 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c  l.** table modul
8880: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
8890: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
88a0: 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20 73  a wrapper that s
88b0: 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71  ets up.** the sq
88c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
88d0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
88e0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75  is used to commu
88f0: 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78  nicate with.** x
8900: 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  BestIndex..**.**
8910: 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73   In a join, this
8920: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62   routine might b
8930: 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c  e called multipl
8940: 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a  e times for the.
8950: 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20  ** same virtual 
8960: 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69  table.  The sqli
8970: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8980: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
8990: 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ted.** and initi
89a0: 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69  alized on the fi
89b0: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
89c0: 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c  nd reused on all
89d0: 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
89e0: 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65  nvocations.  The
89f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8a00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
8a10: 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a   also used when.
8a20: 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  ** code is gener
8a30: 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  ated to access t
8a40: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8a50: 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f  .  The whereInfo
8a60: 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75  Delete() .** rou
8a70: 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20  tine takes care 
8a80: 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20 73  of freeing the s
8a90: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8aa0: 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65  o structure afte
8ab0: 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68  r.** everybody h
8ac0: 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  as finished with
8ad0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64   it..*/.static d
8ae0: 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75 61  ouble bestVirtua
8af0: 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  lIndex(.  Parse 
8b00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8b20: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
8b30: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
8b40: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
8b50: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
8b60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
8b70: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
8b80: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
8b90: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
8ba0: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
8bb0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
8bc0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  ady,            
8bd0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
8be0: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
8bf0: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
8c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8c10: 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  rBy,            
8c20: 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20  /* The order by 
8c30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
8c40: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20 20  orderByUsable,  
8c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8c60: 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f 74  ue if we can pot
8c70: 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a 20  ential sort */. 
8c80: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8c90: 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
8ca0: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
8cb0: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
8cc0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a  BestIndex */.){.
8cd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8ce0: 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
8cf0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8d00: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
8d10: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8d20: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
8d30: 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
8d40: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
8d50: 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
8d60: 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
8d70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8d80: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
8d90: 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
8da0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
8db0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72   i, j;.  int nOr
8dc0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 72 63 3b  derBy;.  int rc;
8dd0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71  ..  /* If the sq
8de0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8df0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e   structure has n
8e00: 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ot been previous
8e10: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
8e20: 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  d and initialize
8e30: 64 20 66 6f 72 20 74 68 69 73 20 76 69 72 74 75  d for this virtu
8e40: 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61  al table, then a
8e50: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64  llocate.  ** and
8e60: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e   initialize it n
8e70: 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  ow.  */.  pIdxIn
8e80: 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  fo = *ppIdxInfo;
8e90: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
8ea0: 3d 30 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54  =0 ){.    WhereT
8eb0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
8ec0: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 54  int nTerm;.    T
8ed0: 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
8ee0: 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
8ef0: 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62  r %s...\n", pTab
8f00: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
8f10: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
8f20: 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
8f30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
8f40: 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
8f50: 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  ng.    ** to thi
8f60: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
8f70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65  */.    for(i=nTe
8f80: 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
8f90: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
8fa0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
8fb0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
8fc0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
8fd0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
8fe0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8ff0: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
9000: 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f  ator==WO_IN ) co
9010: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54  ntinue;.      nT
9020: 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  erm++;.    }..  
9030: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
9040: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
9050: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
9060: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
9070: 20 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c   .    ** virtual
9080: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
9090: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
90a0: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
90b0: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   of.    ** the s
90c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
90d0: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20  o structure..   
90e0: 20 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   */.    nOrderBy
90f0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f   = 0;.    if( pO
9100: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
9110: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
9120: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
9130: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
9140: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
9150: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9160: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9170: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
9180: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
9190: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
91a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
91b0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72        if( i==pOr
91c0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
91d0: 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79          nOrderBy
91e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
91f0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
9200: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  }..    /* Alloca
9210: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
9220: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
9230: 75 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ure.    */.    p
9240: 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
9250: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
9260: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
9290: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
92a0: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
92b0: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
92e0: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
92f0: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  y );.    if( pId
9300: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
9310: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9320: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
9330: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
9340: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
9350: 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e    }.    *ppIdxIn
9360: 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a  fo = pIdxInfo;..
9370: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
9380: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
9390: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
93a0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
93b0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  re contains.    
93c0: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
93d0: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
93e0: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
93f0: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
9400: 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67  rom.    ** chang
9410: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
9420: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
9430: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
9440: 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69  rder to.    ** i
9450: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
9460: 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  fields..    */. 
9470: 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73     pIdxCons = (s
9480: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
9490: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
94a0: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
94b0: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
94c0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
94d0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
94e0: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
94f0: 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73  .    pUsage = (s
9500: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
9510: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
9520: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
9530: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
9540: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
9550: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
9560: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69  = nTerm;.    *(i
9570: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
9580: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
9590: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
95a0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
95b0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
95c0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
95d0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
95e0: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
95f0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
9600: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
9610: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
9620: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
9630: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
9640: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
9650: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
9660: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9670: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
96c0: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  .    for(i=j=0, 
96d0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
96e0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
96f0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
9700: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
9710: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
9720: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
9730: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
9740: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9750: 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65  WO_IN ) continue
9760: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
9770: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
9780: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  erm->leftColumn;
9790: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
97a0: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
97b0: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f   i;.      pIdxCo
97c0: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d  ns[j].op = pTerm
97d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20  ->eOperator;.   
97e0: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
97f0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
9800: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
9810: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
9820: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  y because.      
9830: 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
9840: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9850: 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
9860: 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
9870: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
9880: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
9890: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
98a0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
98b0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
98c0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
98d0: 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Q );.      asser
98e0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
98f0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
9900: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LT );.      as
9910: 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
9920: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
9930: 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20  AINT_LE );.     
9940: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
9950: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
9960: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
9970: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
9980: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
9990: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
99a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
99b0: 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
99c0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
99d0: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20  _MATCH );.      
99e0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
99f0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
9a00: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
9a10: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
9a20: 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b  CH) );.      j++
9a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9a40: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
9a50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
9a60: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
9a70: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
9a80: 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72  .      pIdxOrder
9a90: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
9aa0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
9ab0: 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42        pIdxOrderB
9ac0: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
9ad0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
9ae0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
9af0: 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
9b00: 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
9b10: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
9b20: 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
9b30: 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
9b40: 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
9b50: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
9b60: 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
9b70: 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
9b80: 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
9b90: 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
9ba0: 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
9bb0: 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
9bc0: 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
9bd0: 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
9be0: 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
9bf0: 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
9c00: 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
9c10: 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
9c20: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
9c30: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
9c40: 20 62 65 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20   be defined */. 
9c50: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
9c60: 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54  zModuleArg && pT
9c70: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
9c80: 30 5d 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  0] );.  if( pTab
9c90: 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20  ->pVtab==0 ){.  
9ca0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9cb0: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66  g(pParse, "undef
9cc0: 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66  ined module %s f
9cd0: 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20  or table %s",.  
9ce0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f        pTab->azMo
9cf0: 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62  duleArg[0], pTab
9d00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
9d10: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20  turn 0.0;.  }.. 
9d20: 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
9d30: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
9d40: 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
9d50: 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
9d60: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
9d70: 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
9d80: 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
9d90: 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
9da0: 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
9db0: 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
9dc0: 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
9dd0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
9de0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
9df0: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
9e00: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
9e10: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
9e20: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
9e30: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
9e40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
9e50: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
9e60: 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
9e70: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
9e80: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
9e90: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
9ea0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
9eb0: 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
9ec0: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
9ed0: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
9ee0: 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
9ef0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
9f00: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9f10: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
9f20: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
9f30: 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
9f40: 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
9f50: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
9f60: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
9f70: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
9f80: 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
9f90: 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
9fa0: 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
9fb0: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
9fc0: 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
9fd0: 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
9fe0: 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
9ff0: 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
a000: 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
a010: 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
a020: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
a030: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
a040: 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
a050: 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
a060: 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
a070: 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
a080: 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
a090: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
a0a0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
a0b0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
a0c0: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
a0d0: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
a0e0: 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
a0f0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
a100: 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
a110: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
a120: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
a130: 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
a140: 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
a150: 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
a160: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
a170: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
a180: 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d  sable =  (pTerm-
a190: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
a1a0: 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d  otReady)==0;.  }
a1b0: 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
a1c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
a1d0: 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
a1e0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
a1f0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
a200: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
a210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
a220: 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
a230: 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
a240: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
a250: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
a260: 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
a270: 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
a280: 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
a290: 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
a2a0: 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
a2b0: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
a2c0: 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
a2d0: 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a  _BIG_DBL / 2.0;.
a2e0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
a2f0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
a300: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
a310: 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72  >nOrderBy && !or
a320: 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20  derByUsable ){. 
a330: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
a340: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
a350: 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  0;.  }..  sqlite
a360: 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72 73  3SafetyOff(pPars
a370: 65 2d 3e 64 62 29 3b 0a 20 20 54 52 41 43 45 28  e->db);.  TRACE(
a380: 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
a390: 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
a3a0: 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49  ame));.  TRACE_I
a3b0: 44 58 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e  DX_INPUTS(pIdxIn
a3c0: 66 6f 29 3b 0a 20 20 72 63 20 3d 20 70 54 61 62  fo);.  rc = pTab
a3d0: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
a3e0: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 54 61  ->xBestIndex(pTa
a3f0: 62 2d 3e 70 56 74 61 62 2c 20 70 49 64 78 49 6e  b->pVtab, pIdxIn
a400: 66 6f 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  fo);.  TRACE_IDX
a410: 5f 4f 55 54 50 55 54 53 28 70 49 64 78 49 6e 66  _OUTPUTS(pIdxInf
a420: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
a430: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
a440: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
a450: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
a460: 69 74 65 33 46 61 69 6c 65 64 4d 61 6c 6c 6f 63  ite3FailedMalloc
a470: 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a  ();.    }else {.
a480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a490: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
a4a0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
a4b0: 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20  r(rc));.    }.  
a4c0: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
a4d0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  n(pParse->db);. 
a4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
a4f0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
a500: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
a510: 7d 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  }.  *(int*)&pIdx
a520: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
a530: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74   nOrderBy;.  ret
a540: 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  urn pIdxInfo->es
a550: 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23  timatedCost;.}.#
a560: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a570: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
a580: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  E */../*.** Find
a590: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
a5a0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
a5b0: 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
a5c0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
a5d0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e  ter.** to the in
a5e0: 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20  dex, flags that 
a5f0: 64 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65  describe how the
a600: 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
a610: 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75   used, the.** nu
a620: 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
a630: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e   constraints, an
a640: 64 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72  d the "cost" for
a650: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a   this index..**.
a660: 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f  ** The lowest co
a670: 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20  st index wins.  
a680: 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65  The cost is an e
a690: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61  stimate of the a
a6a0: 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20  mount of.** CPU 
a6b0: 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65  and disk I/O nee
a6c0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
a6d0: 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74   request using t
a6e0: 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65  he selected inde
a6f0: 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  x..** Factors th
a700: 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
a710: 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
a720: 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
a730: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
a740: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
a750: 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
a760: 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
a770: 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
a780: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
a790: 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
a7a0: 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
a7b0: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
a7c0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
a7d0: 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
a7e0: 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
a7f0: 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
a800: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
a810: 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
a820: 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65   double bestInde
a830: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
a840: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a850: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
a860: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
a870: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
a880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a890: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
a8a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a8b0: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
a8c0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
a8d0: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
a8e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
a8f0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
a900: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
a910: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
a920: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
a930: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
a940: 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
a950: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
a960: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a  se */.  Index **
a970: 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  ppIndex,        
a980: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49      /* Make *ppI
a990: 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  ndex point to th
a9a0: 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a  e best index */.
a9b0: 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20    int *pFlags,  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9d0: 20 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72   Put flags descr
a9e0: 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63  ibing this choic
a9f0: 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a  e in *pFlags */.
aa00: 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20    int *pnEq     
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa20: 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Put the number 
aa30: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
aa40: 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a  traints here */.
aa50: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
aa60: 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a  pTerm;.  Index *
aa70: 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20  bestIdx = 0;    
aa80: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
aa90: 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77  at gives the low
aaa0: 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f  est cost */.  do
aab0: 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b  uble lowestCost;
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aad0: 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62   cost of using b
aae0: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
aaf0: 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20  bestFlags = 0;  
ab00: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
ab10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ab20: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
ab30: 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20  t bestNEq = 0;  
ab40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
ab50: 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20  t value for nEq 
ab60: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
ab70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20  pSrc->iCursor;  
ab80: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
ab90: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
aba0: 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20  e accessed */.  
abb0: 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
abd0: 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
abe0: 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69  valuating */.  i
abf0: 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  nt rev;         
ac00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
ac10: 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ue to scan in re
ac20: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
ac30: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac50: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
ac60: 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a   with pProbe */.
ac70: 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac90: 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
aca0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
acb0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  */.  double cost
acc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
acd0: 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
ace0: 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54  g pProbe */..  T
acf0: 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65 78  RACE(("bestIndex
ad00: 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64  : tbl=%s notRead
ad10: 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  y=%x\n", pSrc->p
ad20: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52  Tab->zName, notR
ad30: 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74  eady));.  lowest
ad40: 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
ad50: 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20  G_DBL;.  pProbe 
ad60: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
ad70: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ndex;..  /* If t
ad80: 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20  he table has no 
ad90: 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
ada0: 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69  e are no terms i
adb0: 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a  n the where.  **
adc0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
add0: 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c  er to the ROWID,
ade0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
adf0: 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64  ver be able to d
ae00: 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20  o.  ** anything 
ae10: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c  other than a ful
ae20: 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20  l table scan on 
ae30: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20  this table.  We 
ae40: 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65  might as.  ** we
ae50: 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73 74 20  ll put it first 
ae60: 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65  in the join orde
ae70: 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20 70 65  r.  That way, pe
ae80: 72 68 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a  rhaps it can be.
ae90: 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20    ** referenced 
aea0: 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  by other tables 
aeb0: 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  in the join..  *
aec0: 2f 0a 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d  /.  if( pProbe==
aed0: 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65  0 &&.     findTe
aee0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
aef0: 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  , 0, WO_EQ|WO_IN
af00: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
af10: 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26  GT|WO_GE,0)==0 &
af20: 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72 42 79  &.     (pOrderBy
af30: 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65  ==0 || !sortable
af40: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
af50: 72 64 65 72 42 79 2c 20 26 72 65 76 29 29 20 29  rderBy, &rev)) )
af60: 7b 0a 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20  {.    *pFlags = 
af70: 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20  0;.    *ppIndex 
af80: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20 3d  = 0;.    *pnEq =
af90: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
afa0: 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  .0;.  }..  /* Ch
afb0: 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d  eck for a rowid=
afc0: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
afd0: 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
afe0: 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20  ts.  */.  pTerm 
aff0: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
b000: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
b010: 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
b020: 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
b030: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
b040: 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65  xpr;.    *ppInde
b050: 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46  x = 0;.    bestF
b060: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
b070: 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70  ID_EQ;.    if( p
b080: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b090: 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  & WO_EQ ){.     
b0a0: 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61   /* Rowid== is a
b0b0: 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70  lways the best p
b0c0: 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75  ick.  Look no fu
b0d0: 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20  rther.  Because 
b0e0: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20  only.      ** a 
b0f0: 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65  single row is ge
b100: 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20  nerated, output 
b110: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72  is always in sor
b120: 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
b130: 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45     *pFlags = WHE
b140: 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48  RE_ROWID_EQ | WH
b150: 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
b160: 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20    *pnEq = 1;.   
b170: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62     TRACE(("... b
b180: 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29  est is rowid\n")
b190: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b1a0: 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0.0;.    }else i
b1b0: 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65 72  f( (pExpr = pTer
b1c0: 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74  m->pExpr)->pList
b1d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
b1e0: 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a  Rowid IN (LIST):
b1f0: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
b200: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
b210: 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20  mber of list.   
b220: 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20     ** elements. 
b230: 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74   */.      lowest
b240: 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Cost = pExpr->pL
b250: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
b260: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20    lowestCost *= 
b270: 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73  estLog(lowestCos
b280: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
b290: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e       /* Rowid IN
b2a0: 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20   (SELECT): cost 
b2b0: 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e  is NlogN where N
b2c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b2d0: 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
b2e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  in the result of
b2f0: 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63   the inner selec
b300: 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77  t.  We have no w
b310: 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20  ay to estimate. 
b320: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c       ** that val
b330: 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c  ue so make a wil
b340: 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20  d guess. */.    
b350: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32    lowestCost = 2
b360: 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  00;.    }.    TR
b370: 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
b380: 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  IN cost: %.9g\n"
b390: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a  , lowestCost));.
b3a0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61    }..  /* Estima
b3b0: 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  te the cost of a
b3c0: 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66   table scan.  If
b3d0: 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
b3e0: 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e  how many.  ** en
b3f0: 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65  tries are in the
b400: 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69   table, use 1 mi
b410: 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73  llion as a guess
b420: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d 20  ..  */.  cost = 
b430: 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d  pProbe ? pProbe-
b440: 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31  >aiRowEst[0] : 1
b450: 30 30 30 30 30 30 3b 0a 20 20 54 52 41 43 45 28  000000;.  TRACE(
b460: 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e  ("... table scan
b470: 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67   base cost: %.9g
b480: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66  \n", cost));.  f
b490: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
b4a0: 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20  ID_RANGE;..  /* 
b4b0: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72  Check for constr
b4c0: 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65  aints on a range
b4d0: 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20   of rowids in a 
b4e0: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f  table scan..  */
b4f0: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
b500: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
b510: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
b520: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
b530: 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_GE, 0);.  if( 
b540: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
b550: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
b560: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
b570: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
b580: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
b590: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
b5a0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
b5b0: 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
b5c0: 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52   that rowid<EXPR
b5d0: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
b5e0: 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a  thirds or rows *
b5f0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
b600: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
b610: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
b620: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
b630: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
b640: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
b650: 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  MIT;.      cost 
b660: 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20  /= 3;  /* Guess 
b670: 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20  that rowid>EXPR 
b680: 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74  eliminates two-t
b690: 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f  hirds of rows */
b6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
b6b0: 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e  (("... rowid ran
b6c0: 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ge reduces cost 
b6d0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
b6e0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
b6f0: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a   flags = 0;.  }.
b700: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
b710: 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74  le scan does not
b720: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
b730: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
b740: 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20  crease.  ** the 
b750: 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f  cost by NlogN to
b760: 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e   cover the expen
b770: 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a  se of sorting. *
b780: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
b790: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74   ){.    if( sort
b7a0: 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72  ableByRowid(iCur
b7b0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65 76  , pOrderBy, &rev
b7c0: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
b7d0: 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
b7e0: 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Y|WHERE_ROWID_RA
b7f0: 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72  NGE;.      if( r
b800: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  ev ){.        fl
b810: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
b820: 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
b830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
b840: 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
b850: 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
b860: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
b870: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f  ing increases co
b880: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
b890: 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ost));.    }.  }
b8a0: 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65  .  if( cost<lowe
b8b0: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f  stCost ){.    lo
b8c0: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
b8d0: 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d  .    bestFlags =
b8e0: 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f   flags;.  }..  /
b8f0: 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69  * Look at each i
b900: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ndex..  */.  for
b910: 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  (; pProbe; pProb
b920: 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  e=pProbe->pNext)
b930: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
b960: 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  er */.    double
b970: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20   inMultiplier = 
b980: 31 3b 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22  1;..    TRACE(("
b990: 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22  ... index %s:\n"
b9a0: 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29  , pProbe->zName)
b9b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74  );..    /* Count
b9c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
b9d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
b9e0: 64 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74  dex that are sat
b9f0: 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79  isfied.    ** by
ba00: 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69   x=EXPR constrai
ba10: 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  nts or x IN (...
ba20: 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  ) constraints.. 
ba30: 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20     */.    flags 
ba40: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
ba50: 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  ; i<pProbe->nCol
ba60: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
ba70: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
ba80: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ba90: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
baa0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
bab0: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
bac0: 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
bad0: 4c 4c 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  LL, pProbe);.   
bae0: 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
baf0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
bb00: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
bb10: 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
bb20: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
bb30: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
bb40: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
bb50: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
bb60: 72 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  r;.        flags
bb70: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
bb80: 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
bb90: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21   pExpr->pSelect!
bba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bbb0: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20  inMultiplier *= 
bbc0: 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  25;.        }els
bbd0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
bbe0: 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st!=0 ){.       
bbf0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
bc00: 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  *= pExpr->pList-
bc10: 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20  >nExpr + 1;.    
bc20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bc30: 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 70    }.    cost = p
bc40: 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
bc50: 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65  i] * inMultiplie
bc60: 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c  r * estLog(inMul
bc70: 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45  tiplier);.    nE
bc80: 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 70  q = i;.    if( p
bc90: 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
bca0: 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67  OE_None && (flag
bcb0: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
bcc0: 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  _IN)==0.        
bcd0: 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d   && nEq==pProbe-
bce0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
bcf0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
bd00: 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
bd10: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
bd20: 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d  . nEq=%d inMult=
bd30: 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e  %.9g cost=%.9g\n
bd40: 22 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70  ", nEq, inMultip
bd50: 6c 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20  lier, cost));.. 
bd60: 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
bd70: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
bd80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bd90: 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
bda0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  umn ){.      int
bdb0: 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
bdc0: 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
bdd0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
bde0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
bdf0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
be00: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
be10: 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  GE, pProbe);.   
be20: 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a     if( pTerm ){.
be30: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
be40: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
be50: 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NGE;.        if(
be60: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
be70: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
be80: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
be90: 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
bea0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
beb0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
bec0: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
bed0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
bee0: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
bef0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
bf00: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
bf10: 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_GE, pProbe) )
bf20: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
bf30: 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
bf40: 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
bf50: 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20  cost /= 3;.     
bf60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
bf70: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
bf80: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
bf90: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
bfa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bfb0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
bfc0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
bfd0: 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
bfe0: 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
bff0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c000: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c010: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
c020: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
c030: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
c040: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
c050: 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 69 43  pParse,pProbe,iC
c060: 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c  ur,pOrderBy,nEq,
c070: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  &rev) ){.       
c080: 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b   if( flags==0 ){
c090: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
c0a0: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
c0b0: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d  RANGE;.        }
c0c0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
c0d0: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  = WHERE_ORDERBY;
c0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76  .        if( rev
c0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
c100: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
c110: 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
c120: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c130: 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
c140: 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
c150: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
c160: 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69  ...... orderby i
c170: 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f  ncreases cost to
c180: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
c190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1a0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
c1b0: 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67   see if we can g
c1c0: 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69  et away with usi
c1d0: 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
c1e0: 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  x without.    **
c1f0: 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68   ever reading th
c200: 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61  e table.  If tha
c210: 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
c220: 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20  hen halve the.  
c230: 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69    ** cost of thi
c240: 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  s index..    */.
c250: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26      if( flags &&
c260: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c   pSrc->colUsed <
c270: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
c280: 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
c290: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
c2a0: 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
c2b0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c2c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62  for(j=0; j<pProb
c2d0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  e->nColumn; j++)
c2e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
c2f0: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
c300: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
c310: 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
c320: 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
c330: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
c340: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c350: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
c360: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
c370: 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
c380: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f  ONLY;.        co
c390: 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20  st /= 2;.       
c3a0: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
c3b0: 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73  idx-only reduces
c3c0: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
c3d0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
c3e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c3f0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  If this index ha
c400: 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c  s achieved the l
c410: 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61  owest cost so fa
c420: 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a  r, then use it..
c430: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
c440: 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74  ost < lowestCost
c450: 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64   ){.      bestId
c460: 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
c470: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
c480: 6f 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ost;.      asser
c490: 74 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20  t( flags!=0 );. 
c4a0: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
c4b0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65   flags;.      be
c4c0: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
c4d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
c4e0: 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
c4f0: 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e  ult.  */.  *ppIn
c500: 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20  dex = bestIdx;. 
c510: 20 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e   TRACE(("best in
c520: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
c530: 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20  %.9g, flags=%x, 
c540: 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
c550: 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73     bestIdx ? bes
c560: 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28  tIdx->zName : "(
c570: 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f  none)", lowestCo
c580: 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62  st, bestFlags, b
c590: 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c  estNEq));.  *pFl
c5a0: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
c5b0: 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e  .  *pnEq = bestN
c5c0: 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77  Eq;.  return low
c5d0: 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  estCost;.}.../*.
c5e0: 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
c5f0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
c600: 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
c610: 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
c620: 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
c630: 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
c640: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
c650: 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
c660: 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
c670: 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
c680: 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
c690: 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
c6a0: 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
c6b0: 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
c6c0: 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
c6d0: 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
c6e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
c6f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
c700: 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
c710: 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
c720: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
c730: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
c740: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
c750: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
c760: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c770: 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
c780: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
c790: 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
c7a0: 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
c7b0: 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
c7c0: 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
c7d0: 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
c7e0: 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
c7f0: 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
c800: 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
c810: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
c820: 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
c830: 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
c840: 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
c850: 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
c860: 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
c870: 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
c880: 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
c890: 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
c8a0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
c8b0: 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
c8c0: 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
c8d0: 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
c8e0: 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
c8f0: 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
c900: 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
c910: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
c920: 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
c930: 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
c940: 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
c950: 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
c960: 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
c970: 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
c980: 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
c990: 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
c9a0: 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
c9b0: 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
c9c0: 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
c9d0: 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
c9e0: 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
c9f0: 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
ca00: 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
ca10: 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
ca20: 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
ca30: 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
ca40: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
ca50: 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
ca60: 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
ca70: 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
ca80: 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
ca90: 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  && (pTerm->flags
caa0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
cab0: 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
cac0: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
cad0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
cae0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
caf0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
cb00: 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
cb10: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
cb20: 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
cb30: 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
cb40: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
cb50: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
cb60: 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
cb70: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
cb80: 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
cb90: 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
cba0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
cbb0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
cbc0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
cbd0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
cbe0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cbf0: 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65  t builds a probe
cc00: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
cc10: 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c  *.** There shoul
cc20: 64 20 62 65 20 6e 43 6f 6c 75 6d 6e 20 76 61 6c  d be nColumn val
cc30: 75 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ues on the stack
cc40: 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 2a 2a 20  .  The index.** 
cc50: 74 6f 20 62 65 20 70 72 6f 62 65 64 20 69 73 20  to be probed is 
cc60: 70 49 64 78 2e 20 20 50 6f 70 20 74 68 65 20 76  pIdx.  Pop the v
cc70: 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73  alues from the s
cc80: 74 61 63 6b 20 61 6e 64 0a 2a 2a 20 72 65 70 6c  tack and.** repl
cc90: 61 63 65 20 74 68 65 6d 20 61 6c 6c 20 77 69 74  ace them all wit
cca0: 68 20 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72  h a single recor
ccb0: 64 20 74 68 61 74 20 69 73 20 74 68 65 20 69 6e  d that is the in
ccc0: 64 65 78 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2e 0a  dex.** problem..
ccd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
cce0: 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 0a  uildIndexProbe(.
ccf0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
cd00: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
cd10: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
cd20: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
cd30: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  ,    /* The numb
cd40: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  er of columns to
cd50: 20 63 68 65 63 6b 20 66 6f 72 20 4e 55 4c 4c 20   check for NULL 
cd60: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
cd70: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
cd80: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 73 65  at we will be se
cd90: 61 72 63 68 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  arching */.){.  
cda0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdb0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
cdc0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
cdd0: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
cde0: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
cdf0: 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  x);.}.../*.** Ge
ce00: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
ce10: 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
ce20: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
ce30: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
ce40: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
ce50: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
ce60: 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
ce70: 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
ce80: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
ce90: 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
cea0: 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
ceb0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
cec0: 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  aint is left on 
ced0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
cee0: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
cef0: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
cf00: 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
cf10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
cf20: 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
cf30: 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
cf40: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
cf50: 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
cf60: 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
cf70: 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
cf80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
cf90: 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
cfa0: 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
cfb0: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
cfc0: 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   X..*/.static vo
cfd0: 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  id codeEqualityT
cfe0: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
cff0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
d000: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
d010: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
d020: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
d030: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
d040: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
d050: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
d060: 62 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  brk,            
d070: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
d080: 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70  abandon the loop
d090: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
d0a0: 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65   *pLevel  /* Whe
d0b0: 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  n level of the F
d0c0: 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
d0d0: 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
d0e0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
d0f0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
d100: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d110: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
d120: 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
d130: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d140: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
d150: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
d160: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
d170: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  ISNULL ){.    sq
d180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d190: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
d1a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d1b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
d1c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
d1d0: 69 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61  iTab;.    int *a
d1e0: 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  In;..    assert(
d1f0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
d200: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
d210: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
d220: 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62  e, pX);.    iTab
d230: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
d240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d250: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
d260: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
d270: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d280: 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70  "# %.*s", pX->sp
d290: 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a  an.n, pX->span.z
d2a0: 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
d2b0: 6e 49 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  nIn++;.    sqlit
d2c0: 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  eReallocOrFree((
d2d0: 76 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e  void**)&pLevel->
d2e0: 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
d310: 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
d320: 5b 30 5d 29 2a 32 2a 70 4c 65 76 65 6c 2d 3e 6e  [0])*2*pLevel->n
d330: 49 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70  In);.    aIn = p
d340: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a  Level->aInLoop;.
d350: 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20      if( aIn ){. 
d360: 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76       aIn += pLev
d370: 65 6c 2d 3e 6e 49 6e 2a 32 20 2d 20 32 3b 0a 20  el->nIn*2 - 2;. 
d380: 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 69 54       aIn[0] = iT
d390: 61 62 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d  ab;.      aIn[1]
d3a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d3b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
d3c0: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
d3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
d3e0: 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20  vel->nIn = 0;.  
d3f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
d400: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
d410: 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a  vel, pTerm);.}..
d420: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d430: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
d440: 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
d450: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
d460: 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
d470: 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f  .  The values fo
d480: 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  r all constraint
d490: 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68  s are left on th
d4a0: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
d4b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
d4c0: 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
d4d0: 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
d4e0: 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
d4f0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
d500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
d510: 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
d520: 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
d530: 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
d540: 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
d550: 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
d560: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
d570: 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
d580: 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
d590: 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
d5a0: 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
d5b0: 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
d5c0: 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
d5d0: 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
d5e0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
d5f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d600: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
d610: 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
d620: 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
d630: 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
d640: 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a   b will be left.
d650: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  ** on the stack 
d660: 2d 20 61 20 69 73 20 74 68 65 20 64 65 65 70 65  - a is the deepe
d670: 73 74 20 61 6e 64 20 62 20 74 68 65 20 73 68 61  st and b the sha
d680: 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  llowest..**.** I
d690: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
d6a0: 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74  ove nEq==2.  But
d6b0: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
d6c0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76   works for any v
d6d0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69  alue.** of nEq i
d6e0: 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20  ncluding 0.  If 
d6f0: 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75  nEq==0, this rou
d700: 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61  tine is nearly a
d710: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f   no-op..** The o
d720: 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65  nly thing it doe
d730: 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68  s is allocate th
d740: 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d  e pLevel->iMem m
d750: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
d760: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
d770: 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
d780: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
d790: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74  ory cell and put
d7a0: 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  s.** the address
d7b0: 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
d7c0: 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e  cell in pLevel->
d7d0: 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20  iMem.  The code 
d7e0: 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
d7f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
d800: 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  use pLevel->iMem
d810: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
d820: 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
d830: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
d840: 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
d850: 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
d860: 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
d870: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
d880: 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
d890: 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
d8a0: 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
d8b0: 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73  nal.** use..*/.s
d8c0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
d8d0: 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
d8e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d8f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
d900: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d910: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
d920: 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
d930: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
d940: 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
d950: 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
d960: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
d970: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
d980: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
d990: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
d9a0: 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
d9b0: 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
d9c0: 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
d9d0: 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20 20 20 20  /.  int brk     
d9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
d9f0: 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68  p here to end th
da00: 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69  e loop */.){.  i
da10: 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
da20: 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20  >nEq;        /* 
da30: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
da40: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
da50: 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
da60: 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d  int termsInMem =
da70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
da80: 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65 20   If true, store 
da90: 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63  value in mem[] c
daa0: 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ells */.  Vdbe *
dab0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dac0: 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
dad0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
dae0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
daf0: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
db00: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
db10: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
db20: 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
db30: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
db40: 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
db50: 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
db60: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
db70: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
db80: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
dba0: 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
dbb0: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
dbc0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dbe0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dbf0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
dc00: 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
dc10: 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
dc20: 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
dc30: 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c  them..  ** We al
dc40: 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61  ways need at lea
dc50: 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73  st one used to s
dc60: 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65  tore the loop te
dc70: 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61  rminator.  ** va
dc80: 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  lue.  If there a
dc90: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
dca0: 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66  we'll need one f
dcb0: 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20  or each == or.  
dcc0: 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  ** IN constraint
dcd0: 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d  ..  */.  pLevel-
dce0: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
dcf0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c  nMem++;.  if( pL
dd00: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
dd10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b  ERE_COLUMN_IN ){
dd20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
dd30: 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  m += pLevel->nEq
dd40: 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d  ;.    termsInMem
dd50: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
dd60: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
dd70: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
dd80: 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  s.  */.  for(j=0
dd90: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
dda0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; j++){.    int
ddb0: 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
ddc0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72  umn[j];.    pTer
ddd0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
dde0: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
ddf0: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
de00: 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 70 49 64 78  |WO_ISNULL, pIdx
de10: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
de20: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
de30: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
de40: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
de50: 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63  DED)==0 );.    c
de60: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
de70: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62  pParse, pTerm, b
de80: 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  rk, pLevel);.   
de90: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
dea0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
deb0: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
dec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ded0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74  (v, OP_IsNull, t
dee0: 65 72 6d 73 49 6e 4d 65 6d 20 3f 20 2d 31 20 3a  ermsInMem ? -1 :
def0: 20 2d 28 6a 2b 31 29 2c 20 62 72 6b 29 3b 0a 20   -(j+1), brk);. 
df00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
df10: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20  msInMem ){.     
df20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df30: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
df40: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a  , pLevel->iMem+j
df50: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  +1, 1);.    }.  
df60: 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
df70: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  Eq );..  /* Make
df80: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 63 6f   sure all the co
df90: 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
dfa0: 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  are on the top o
dfb0: 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f  f the stack.  */
dfc0: 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65  .  if( termsInMe
dfd0: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  m ){.    for(j=0
dfe0: 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
dff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
e010: 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
e020: 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d  m+j+1, 0);.    }
e030: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
e040: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
e050: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e060: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
e070: 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
e080: 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
e090: 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
e0a0: 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
e0b0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
e0c0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
e0d0: 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
e0e0: 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
e0f0: 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
e100: 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
e110: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
e120: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
e130: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
e140: 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
e150: 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
e160: 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
e170: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
e180: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
e190: 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
e1a0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
e1b0: 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
e1c0: 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
e1d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
e1e0: 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  T */.../*.** Fre
e1f0: 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
e200: 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
e210: 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
e220: 46 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a  Free(WhereInfo *
e230: 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70  pWInfo){.  if( p
e240: 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74  WInfo ){.    int
e250: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
e260: 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
e270: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
e280: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e290: 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
e2a0: 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
e2b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
e2c0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
e2d0: 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
e2e0: 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
e2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e300: 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
e310: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
e330: 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  pInfo);.      }.
e340: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e350: 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
e360: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
e370: 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
e380: 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
e390: 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
e3a0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
e3b0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
e3c0: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
e3d0: 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
e3e0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
e3f0: 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
e400: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
e410: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
e420: 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
e430: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
e440: 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
e450: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
e460: 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
e470: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
e480: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
e490: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
e4a0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
e4b0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
e4c0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
e4d0: 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
e4e0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
e4f0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
e500: 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
e510: 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
e520: 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
e530: 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
e540: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
e550: 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
e560: 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
e570: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
e580: 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
e590: 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
e5a0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
e5b0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
e5c0: 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
e5d0: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
e5e0: 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
e5f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
e600: 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
e610: 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
e620: 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
e630: 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
e640: 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
e650: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
e660: 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
e670: 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
e680: 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
e690: 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
e6a0: 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
e6b0: 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
e6c0: 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
e6d0: 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
e6e0: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
e6f0: 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
e700: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
e710: 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
e740: 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
e750: 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
e760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
e770: 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
e780: 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
e7b0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
e7c0: 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
e7d0: 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
e7e0: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
e7f0: 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
e800: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e810: 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
e820: 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
e830: 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
e840: 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
e850: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
e860: 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
e870: 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
e880: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
e890: 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
e8a0: 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
e8b0: 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
e8c0: 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
e8d0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
e8e0: 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
e8f0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
e900: 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
e910: 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
e920: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
e930: 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
e940: 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
e950: 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
e960: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
e970: 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
e980: 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
e990: 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
e9a0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
e9b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
e9c0: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
e9d0: 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
e9e0: 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
e9f0: 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
ea00: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
ea10: 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
ea20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
ea30: 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
ea40: 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
ea50: 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
ea60: 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
ea70: 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
ea80: 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
ea90: 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
eaa0: 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
eab0: 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
eac0: 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
ead0: 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
eae0: 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
eaf0: 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
eb00: 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
eb10: 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
eb20: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
eb30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
eb40: 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
eb50: 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
eb60: 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
eb70: 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
eb80: 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
eb90: 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
eba0: 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
ebb0: 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
ebc0: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
ebd0: 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
ebe0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
ebf0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
ec00: 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
ec10: 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
ec20: 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
ec30: 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
ec40: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
ec50: 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
ec60: 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
ec70: 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
ec80: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
ec90: 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
eca0: 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
ecb0: 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
ecc0: 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
ecd0: 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
ece0: 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
ecf0: 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
ed00: 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
ed10: 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
ed20: 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
ed30: 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
ed40: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
ed50: 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
ed60: 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
ed70: 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
ed80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
ed90: 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
eda0: 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
edb0: 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
edc0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
edd0: 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
ede0: 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
edf0: 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
ee00: 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
ee10: 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
ee20: 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
ee30: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
ee40: 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
ee50: 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
ee60: 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
ee70: 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
ee80: 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
ee90: 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
eea0: 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
eeb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
eec0: 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
eed0: 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
eee0: 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
eef0: 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
ef00: 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
ef10: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
ef20: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
ef30: 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
ef40: 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
ef50: 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
ef60: 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
ef70: 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
ef80: 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
ef90: 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
efa0: 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
efb0: 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
efc0: 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
efd0: 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
efe0: 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
eff0: 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
f000: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
f010: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
f020: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
f030: 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
f040: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
f050: 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
f060: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
f070: 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
f080: 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
f090: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
f0a0: 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
f0b0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
f0c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
f0d0: 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
f0e0: 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
f0f0: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
f100: 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
f110: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
f120: 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
f130: 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
f140: 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
f150: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
f160: 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
f170: 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
f180: 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
f190: 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
f1a0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
f1b0: 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
f1c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
f1d0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
f1e0: 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
f1f0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
f200: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
f210: 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
f220: 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
f230: 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
f240: 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
f250: 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
f260: 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
f270: 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
f280: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
f290: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f2a0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
f2b0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
f2c0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
f2d0: 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
f2e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
f2f0: 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
f300: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
f310: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
f320: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f330: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
f340: 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e  ppOrderBy  /* An
f350: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f360: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
f370: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f390: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f3a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
f3b0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
f3c0: 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
f3d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
f3e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
f3f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f400: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
f410: 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
f420: 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
f430: 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20    int brk, cont 
f440: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
f450: 41 64 64 72 65 73 73 65 73 20 75 73 65 64 20 64  Addresses used d
f460: 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72  uring code gener
f470: 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
f480: 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
f490: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
f4a0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
f4b0: 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
f4c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f4d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
f4e0: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  A single term in
f4f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f500: 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  e */.  ExprMaskS
f510: 65 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20  et maskSet;     
f520: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
f530: 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
f540: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63    WhereClause wc
f550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f560: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
f570: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
f580: 20 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a   these terms */.
f590: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f5a0: 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
f5b0: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e    /* A single en
f5c0: 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73  try from pTabLis
f5d0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
f5e0: 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
f5f0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
f600: 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  le level in the 
f610: 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20  pWInfo list */. 
f620: 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20   int iFrom;     
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
f650: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
f660: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e  ment */.  int an
f670: 64 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  dFlags;         
f680: 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63       /* AND-ed c
f690: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c  ombination of al
f6a0: 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a  l wc.a[].flags *
f6b0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  /..  /* The numb
f6c0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
f6d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
f6e0: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
f6f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
f700: 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
f710: 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk .  */.  if( p
f720: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
f730: 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
f740: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f750: 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
f760: 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
f770: 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
f780: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70   0;.  }..  /* Sp
f790: 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
f7a0: 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
f7b0: 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
f7c0: 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
f7d0: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
f7e0: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
f7f0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
f800: 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
f810: 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20  Set(&maskSet);. 
f820: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
f830: 28 26 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20  (&wc, pParse);. 
f840: 20 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c   whereSplit(&wc,
f850: 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
f860: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.    .  /* Allo
f870: 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
f880: 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
f890: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
f8a0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
f8b0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
f8c0: 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  ue..  */.  pWInf
f8d0: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
f8e0: 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  ( sizeof(WhereIn
f8f0: 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e  fo) + pTabList->
f900: 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72  nSrc*sizeof(Wher
f910: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20  eLevel));.  if( 
f920: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
f930: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74  led() ){.    got
f940: 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
f950: 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  m;.  }.  pWInfo-
f960: 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69  >nLevel = pTabLi
f970: 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e  st->nSrc;.  pWIn
f980: 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
f990: 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
f9a0: 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
f9b0: 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
f9c0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
f9d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f9e0: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
f9f0: 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
fa00: 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
fa10: 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
fa20: 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
fa30: 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
fa40: 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
fa50: 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
fa60: 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
fa70: 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62   pWhere && (pTab
fa80: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c  List->nSrc==0 ||
fa90: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
faa0: 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29 29 20  nstant(pWhere)) 
fab0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
fac0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
fad0: 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
fae0: 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20  ->iBreak, 1);.  
faf0: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
fb00: 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
fb10: 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
fb20: 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
fb30: 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
fb40: 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
fb50: 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
fb60: 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
fb70: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
fb80: 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
fb90: 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
fba0: 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
fbb0: 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
fbc0: 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
fbd0: 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
fbe0: 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
fbf0: 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
fc00: 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
fc10: 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
fc20: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  sed..  */.  for(
fc30: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
fc40: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
fc50: 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73   createMask(&mas
fc60: 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
fc70: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
fc80: 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65   }.  exprAnalyze
fc90: 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 6d  All(pTabList, &m
fca0: 61 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20 20  askSet, &wc);.  
fcb0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
fcc0: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
fcd0: 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
fce0: 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NoMem;.  }..  /*
fcf0: 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
fd00: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
fd10: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
fd20: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
fd30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
fd40: 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
fd50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
fd60: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
fd70: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
fd80: 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
fd90: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
fda0: 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
fdb0: 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
fdc0: 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57  >a[].flags     W
fdd0: 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
fde0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
fdf0: 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
fe00: 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
fe10: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
fe20: 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
fe30: 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
fe40: 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
fe50: 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74    When term of t
fe60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
fe70: 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
fe80: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
fe90: 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
fea0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
feb0: 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
fec0: 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
fed0: 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
fee0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
fef0: 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
ff00: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
ff10: 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
ff20: 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
ff30: 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
ff40: 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
ff50: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
ff60: 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
ff70: 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
ff80: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
ff90: 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
ffa0: 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
ffb0: 20 3d 20 7e 30 3b 0a 20 20 54 52 41 43 45 28 28   = ~0;.  TRACE((
ffc0: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
ffd0: 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
ffe0: 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
fff0: 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
10000 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
10010 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
10020 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  +){.    Index *p
10030 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
10040 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
10050 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70   FROM table at p
10060 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69  TabItem */.    i
10070 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
10080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
10090 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20  ags asssociated 
100a0 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20  with pIdx */.   
100b0 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100d0 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
100e0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
100f0 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73  /.    double cos
10100 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10110 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f    /* The cost fo
10120 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e  r pIdx */.    in
10130 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
10140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
10150 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52   looping over FR
10160 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  OM tables */.   
10170 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
10180 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
10190 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73  The best index s
101a0 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
101b0 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20    int bestFlags 
101c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
101d0 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
101e0 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a  d with pBest */.
101f0 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20      int bestNEq 
10200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10210 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65  /* nEq associate
10220 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a  d with pBest */.
10230 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73      double lowes
10240 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  tCost;          
10250 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70  /* Cost of the p
10260 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
10270 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20  bestJ = 0;      
10280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
10290 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
102a0 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102c0 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
102d0 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
102e0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30      int once = 0
102f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10300 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72  /* True when fir
10310 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e  st table is seen
10320 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
10330 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 64  index_info *pInd
10340 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  ex; /* Current v
10350 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  irtual index */.
10360 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20  .    lowestCost 
10370 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
10380 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f  ;.    for(j=iFro
10390 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61  m, pTabItem=&pTa
103a0 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70  bList->a[j]; j<p
103b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a  TabList->nSrc; j
103c0 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b  ++, pTabItem++){
103d0 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74  .      int doNot
103e0 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75  Reorder;  /* Tru
103f0 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  e if this table 
10400 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65  should not be re
10410 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20  ordered */..    
10420 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d    doNotReorder =
10430 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69    (pTabItem->joi
10440 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
10450 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a  |JT_CROSS))!=0;.
10460 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26        if( once &
10470 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  & doNotReorder )
10480 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20   break;.      m 
10490 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53  = getMask(&maskS
104a0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
104b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
104c0 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29  ( (m & notReady)
104d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
104e0 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
104f0 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  rom++;.        c
10500 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
10510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10520 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b  TabItem->pTab );
10530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10540 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10550 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  E.      if( IsVi
10560 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e  rtual(pTabItem->
10570 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
10580 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10590 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
105a0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  = &pWInfo->a[j].
105b0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
105c0 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72    cost = bestVir
105d0 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
105e0 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
105f0 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64             ppOrd
10620 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42  erBy ? *ppOrderB
10630 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20  y : 0, i==0,.   
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70 49               ppI
10660 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  dxInfo);.       
10670 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56   flags = WHERE_V
10680 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20  IRTUALTABLE;.   
10690 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a 70       pIndex = *p
106a0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
106b0 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
106c0 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79 43  pIndex->orderByC
106d0 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20  onsumed ){.     
106e0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45       flags = WHE
106f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
10700 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  | WHERE_ORDERBY;
10710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10720 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20     pIdx = 0;.   
10730 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20       nEq = 0;.  
10740 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
10750 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
10760 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64    cost = bestInd
10770 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20  ex(pParse, &wc, 
10780 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61  pTabItem, notRea
10790 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d               (i=
107b0 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29  =0 && ppOrderBy)
107c0 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
107d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
107e0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 49 64              &pId
107f0 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29  x, &flags, &nEq)
10800 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
10810 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10820 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77      if( cost<low
10830 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  estCost ){.     
10840 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20     once = 1;.   
10850 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
10860 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  = cost;.        
10870 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
10880 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
10890 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
108a0 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
108b0 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
108c0 6a 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  j;.        pLeve
108d0 6c 2d 3e 70 42 65 73 74 49 64 78 20 3d 20 70 49  l->pBestIdx = pI
108e0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
108f0 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f      if( doNotReo
10900 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
10910 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
10920 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68  *** Optimizer ch
10930 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f  oose table %d fo
10940 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
10950 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
10960 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
10970 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
10980 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  tFlags & WHERE_O
10990 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
109a0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
109b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
109c0 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c  dFlags &= bestFl
109d0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
109e0 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  >flags = bestFla
109f0 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
10a00 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20  pIdx = pBest;.  
10a10 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20    pLevel->nEq = 
10a20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65  bestNEq;.    pLe
10a30 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30  vel->aInLoop = 0
10a40 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
10a50 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
10a60 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c  Best ){.      pL
10a70 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
10a80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10aa0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
10ab0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
10ac0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
10ad0 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
10ae0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
10af0 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
10b00 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
10b10 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52   bestJ;.  }.  TR
10b20 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
10b30 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
10b40 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  \n"));..  /* If 
10b50 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
10b60 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73  only selects a s
10b70 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20  ingle row, then 
10b80 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
10b90 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65  * clause is irre
10ba0 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  levant..  */.  i
10bb0 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  f( (andFlags & W
10bc0 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
10bd0 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a  && ppOrderBy ){.
10be0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
10bf0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70   0;.  }..  /* Op
10c00 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
10c10 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
10c20 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
10c30 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
10c40 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
10c50 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73  tables..  */.  s
10c60 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
10c70 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
10c80 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
10c90 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
10ca0 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28  r Goto */.  for(
10cb0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
10cc0 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
10cd0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
10ce0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
10cf0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
10d00 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
10d10 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78  /.    Index *pIx
10d20 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ;      /* Index 
10d30 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70  used to access p
10d40 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  Tab (if any) */.
10d50 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
10d60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10d70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
10d80 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
10d90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
10da0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
10db0 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20  dxCur;..#ifndef 
10dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
10dd0 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72  AIN.    if( pPar
10de0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
10df0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d  {.      char *zM
10e00 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  sg;.      struct
10e10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
10e20 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
10e30 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
10e40 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  m];.      zMsg =
10e50 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
10e60 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65  "TABLE %s", pIte
10e70 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
10e80 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
10e90 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  as ){.        zM
10ea0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
10eb0 6e 74 66 28 22 25 7a 20 41 53 20 25 73 22 2c 20  ntf("%z AS %s", 
10ec0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
10ed0 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
10ee0 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70      if( (pIx = p
10ef0 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20  Level->pIdx)!=0 
10f00 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
10f10 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10f20 28 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58 20  ("%z WITH INDEX 
10f30 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e  %s", zMsg, pIx->
10f40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
10f50 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
10f60 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
10f70 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
10f80 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
10f90 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
10fa0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20  ite3MPrintf("%z 
10fb0 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45  USING PRIMARY KE
10fc0 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
10fd0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10fe0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10ff0 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69  BLE.      else i
11000 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74  f( pLevel->pBest
11010 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
11020 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
11030 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c  o *pBestIdx = pL
11040 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a  evel->pBestIdx;.
11050 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
11060 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
11070 7a 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  z VIRTUAL TABLE 
11080 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
11090 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
110a0 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
110b0 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65 73 74 49  ->idxNum, pBestI
110c0 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  dx->idxStr);.   
110d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
110e0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
110f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
11100 52 42 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  RBY ){.        z
11110 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
11120 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20 42  intf("%z ORDER B
11130 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
11140 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11150 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 45 78  VdbeOp3(v, OP_Ex
11160 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c  plain, i, pLevel
11170 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  ->iFrom, zMsg, P
11180 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
11190 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
111a0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
111b0 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  */.    pTabItem 
111c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
111d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
111e0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
111f0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
11200 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11210 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
11220 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
11230 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ma);.    if( pTa
11240 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54  b->isEphem || pT
11250 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
11260 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
11270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11280 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
11290 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
112a0 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
112b0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
112c0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
112d0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
112e0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
112f0 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a   0, (const char*
11300 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 33  )pTab->pVtab, P3
11310 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
11320 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
11330 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
11340 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
11350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11360 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
11370 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
11380 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
11390 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
113a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
113b0 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28  b->nCol<(sizeof(
113c0 42 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20  Bitmask)*8) ){. 
113d0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
113e0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
113f0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
11400 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
11410 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
11420 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
11430 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11440 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33 56  geP2(v, sqlite3V
11450 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11460 29 2d 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  )-1, n);.       
11470 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
11480 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
11490 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
114a0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
114b0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
114c0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
114d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
114e0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
114f0 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74  iTabCur = pTabIt
11500 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
11510 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76   if( (pIx = pLev
11520 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a  el->pIdx)!=0 ){.
11530 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
11540 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
11550 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
11560 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73  , pIx);.      as
11570 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
11580 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
11590 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a );.      sqlit
115a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
115b0 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
115c0 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
115d0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73 22  mment((v, "# %s"
115e0 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
115f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11600 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
11610 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49  ead, iIdxCur, pI
11620 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x->tnum,.       
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11640 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  har*)pKey, P3_KE
11650 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
11660 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
11670 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
11680 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
11690 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
116a0 45 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  E))!=0 ){.      
116b0 2f 2a 20 4f 6e 6c 79 20 63 61 6c 6c 20 4f 50 5f  /* Only call OP_
116c0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 6e  SetNumColumns on
116d0 20 74 68 65 20 69 6e 64 65 78 20 69 66 20 77 65   the index if we
116e0 20 6d 69 67 68 74 20 6c 61 74 65 72 20 75 73 65   might later use
116f0 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 6c  .      ** OP_Col
11700 75 6d 6e 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  umn on the index
11710 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
11720 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11730 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
11740 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e   iIdxCur, pIx->n
11750 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d  Column+1);.    }
11760 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
11770 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
11780 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
11790 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
117a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
117b0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
117c0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
117d0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
117e0 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
117f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
11800 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
11810 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
11820 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
11830 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
11840 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
11850 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
11860 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
11870 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
11880 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
11890 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
118a0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
118b0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74    int j;.    int
118c0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
118d0 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54  ->iCursor;  /* T
118e0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
118f0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
11900 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
11910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
11920 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
11930 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
11940 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f  iIdxCur;       /
11950 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
11960 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
11970 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54  */.    int omitT
11980 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75  able;     /* Tru
11990 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
119a0 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
119b0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
119c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
119d0 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
119e0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
119f0 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65   */..    pTabIte
11a00 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
11a10 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
11a20 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62  .    iCur = pTab
11a30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
11a40 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
11a50 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78  ->pIdx;.    iIdx
11a60 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
11a70 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20  dxCur;.    bRev 
11a80 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
11a90 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
11aa0 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61  )!=0;.    omitTa
11ab0 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  ble = (pLevel->f
11ac0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
11ad0 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20  _ONLY)!=0;..    
11ae0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
11af0 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
11b00 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
11b10 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
11b20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
11b30 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
11b40 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20  to brk to break 
11b50 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
11b60 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f     ** Jump to co
11b70 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
11b80 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
11b90 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
11ba0 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  e.    ** loop.. 
11bb0 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20     */.    brk = 
11bc0 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71  pLevel->brk = sq
11bd0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11be0 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20  el(v);.    cont 
11bf0 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
11c00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11c10 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
11c20 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
11c30 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
11c40 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
11c50 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
11c60 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
11c70 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
11c80 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
11c90 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
11ca0 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
11cb0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
11cc0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
11cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11ce0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
11cf0 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
11d00 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
11d10 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
11d20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65  if( !pParse->nMe
11d30 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
11d40 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ++;.      pLevel
11d50 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50  ->iLeftJoin = pP
11d60 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
11d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d80 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
11d90 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  t, 0, pLevel->iL
11da0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
11db0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11dc0 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  "# init LEFT JOI
11dd0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
11de0 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ));.    }..#ifnd
11df0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11e00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
11e10 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
11e20 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
11e30 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
11e40 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
11e50 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
11e60 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
11e70 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  xt.      **     
11e80 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
11e90 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20 20 2a  he data..      *
11ea0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
11eb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
11ec0 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64  ex_info *pBestId
11ed0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  x = pLevel->pBes
11ee0 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  tIdx;.      int 
11ef0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 42  nConstraint = pB
11f00 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  estIdx->nConstra
11f10 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  int;.      struc
11f20 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
11f30 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
11f40 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
11f80 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  stIdx->aConstrai
11f90 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20 20 63  ntUsage;.      c
11fa0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
11fb0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
11fc0 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e  aint *aConstrain
11fd0 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
12010 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
12020 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
12030 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
12040 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  ){.        int k
12050 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
12060 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; k<nConstraint
12070 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
12080 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e    if( aUsage[k].
12090 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a  argvIndex==j ){.
120a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
120b0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
120c0 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73  int[k].iTermOffs
120d0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  et;.            
120e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
120f0 70 50 61 72 73 65 2c 20 77 63 2e 61 5b 69 54 65  pParse, wc.a[iTe
12100 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm].pExpr->pRigh
12110 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
12120 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12130 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12140 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e       if( k==nCon
12150 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
12160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12180 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
12190 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  -1, 0);.      sq
121a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
121b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42  , OP_Integer, pB
121c0 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
121d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
121e0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
121f0 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 62 72  Filter, iCur, br
12200 6b 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  k, pBestIdx->idx
12210 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
12220 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
12230 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
12240 64 78 53 74 72 20 3f 20 50 33 5f 4d 50 52 49 4e  dxStr ? P3_MPRIN
12250 54 46 20 3a 20 50 33 5f 53 54 41 54 49 43 29 3b  TF : P3_STATIC);
12260 0a 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d  .      pBestIdx-
12270 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
12280 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  r = 0;.      for
12290 28 6a 3d 30 3b 20 6a 3c 70 42 65 73 74 49 64 78  (j=0; j<pBestIdx
122a0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  ->nConstraint; j
122b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
122c0 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
122d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
122e0 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
122f0 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
12300 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64  set;.          d
12310 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
12320 6c 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29  l, &wc.a[iTerm])
12330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12340 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
12350 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
12360 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
12370 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
12380 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
12390 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
123a0 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  ddr(v);.    }els
123b0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
123c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
123d0 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ABLE */..    if(
123e0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
123f0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
12400 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
12410 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
12420 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
12430 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
12440 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  g an.      **   
12450 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
12460 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
12470 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
12480 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a  ld.  Or.      **
12490 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
124a0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
124b0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
124c0 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
124d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
124e0 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20  construct..     
124f0 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20   */.      pTerm 
12500 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
12510 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
12520 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
12530 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
12540 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
12550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
12560 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
12570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
12580 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
12590 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  =iCur );.      a
125a0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
125b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
125c0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
125d0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b  arse, pTerm, brk
125e0 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
125f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12600 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
12610 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20  t, 1, brk);.    
12620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12630 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  Op(v, OP_NotExis
12640 74 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  ts, iCur, brk);.
12650 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12660 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
12670 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
12680 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
12690 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
126a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
126b0 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
126c0 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
126d0 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
126e0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
126f0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
12700 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  D field..      *
12710 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74  /.      int test
12720 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
12730 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
12740 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
12750 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
12760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
12770 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
12780 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
12790 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
127a0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
127b0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
127c0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e        pEnd = fin
127d0 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
127e0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
127f0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
12800 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
12810 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
12820 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
12830 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
12840 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20  .        pEnd = 
12850 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
12860 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
12870 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
12880 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20  *pX;.        pX 
12890 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
128a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
128b0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
128c0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
128d0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
128e0 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
128f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
12900 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
12910 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12920 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12930 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e  P_ForceInt, pX->
12940 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d  op==TK_LE || pX-
12950 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29  >op==TK_GT, brk)
12960 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12970 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52  3VdbeAddOp(v, bR
12980 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a  ev ? OP_MoveLt :
12990 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
129a0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
129b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
129c0 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20  "pk"));.        
129d0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
129e0 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
129f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a10 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  Op(v, bRev ? OP_
12a20 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
12a30 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
12a40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12a50 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
12a60 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
12a70 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
12a80 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
12a90 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
12aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
12ab0 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  d->leftCursor==i
12ac0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Cur );.        s
12ad0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
12ae0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
12af0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  t);.        pLev
12b00 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
12b10 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
12b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12b30 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
12b40 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
12b50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
12b60 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
12b70 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
12b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
12b90 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
12ba0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
12bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12bc0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
12bd0 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
12be0 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _Gt;.        }. 
12bf0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
12c00 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
12c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
12c30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12c40 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
12c50 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
12c60 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
12c70 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
12c80 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
12c90 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
12ca0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  t;.      if( tes
12cb0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
12cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12cd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
12ce0 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a  owid, iCur, 0);.
12cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12d00 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
12d10 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
12d20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
12d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12d40 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51  Op(v, testOp, SQ
12d50 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
12d60 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
12d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
12d80 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
12d90 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
12da0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
12db0 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 3: The WHERE c
12dc0 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
12dd0 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
12de0 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
12df0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
12e00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
12e10 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
12e20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
12e30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
12e40 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
12e50 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
12e60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
12e70 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
12e80 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
12e90 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
12ea0 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
12eb0 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
12ec0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
12ed0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
12ee0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
12ef0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
12f00 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
12f10 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
12f20 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
12f30 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
12f40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
12f50 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
12f60 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
12f70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
12f80 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
12f90 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
12fa0 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
12fb0 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
12fc0 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
12fd0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
12fe0 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
12ff0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
13000 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
13010 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a  ER BY..      */.
13020 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
13030 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
13040 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
13050 20 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b      int topEq=0;
13060 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13070 69 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65  if top limit use
13080 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73  s ==. False is s
13090 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20  trictly < */.   
130a0 20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20     int btmEq=0; 
130b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
130c0 66 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73  f btm limit uses
130d0 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74   ==. False if st
130e0 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20  rictly > */.    
130f0 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d    int topOp, btm
13100 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f  Op;   /* Operato
13110 72 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61  rs for the top a
13120 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68  nd bottom search
13130 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20   bounds */.     
13140 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20   int testOp;.   
13150 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20     int topLimit 
13160 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
13170 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
13180 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e  IT)!=0;.      in
13190 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c  t btmLimit = (pL
131a0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
131b0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
131c0 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  0;..      /* Gen
131d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
131e0 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
131f0 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
13200 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20  g == or IN.     
13210 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68   ** and level th
13220 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
13230 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73  e terms on the s
13240 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tack..      */. 
13250 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61       codeAllEqua
13260 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
13270 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e  , pLevel, &wc, n
13280 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a  otReady, brk);..
13290 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61        /* Duplica
132a0 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
132b0 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61  term values beca
132c0 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  use they will al
132d0 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73  l be.      ** us
132e0 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74  ed twice: once t
132f0 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69  o make the termi
13300 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f  nation key and o
13310 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  nce to make the.
13320 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b        ** start k
13330 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
13340 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
13350 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; j++){.       
13360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13370 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71  p(v, OP_Dup, nEq
13380 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  -1, 0);.      }.
13390 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
133a0 20 6f 75 74 20 77 68 61 74 20 63 6f 6d 70 61 72   out what compar
133b0 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74  ison operators t
133c0 6f 20 75 73 65 20 66 6f 72 20 74 6f 70 20 61 6e  o use for top an
133d0 64 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20  d bottom .      
133e0 2a 2a 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73  ** search bounds
133f0 2e 20 46 6f 72 20 61 6e 20 61 73 63 65 6e 64 69  . For an ascendi
13400 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 20 62 6f  ng index, the bo
13410 74 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61 20  ttom bound is a 
13420 3e 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a  > or >=.      **
13430 20 6f 70 65 72 61 74 6f 72 20 61 6e 64 20 74 68   operator and th
13440 65 20 74 6f 70 20 62 6f 75 6e 64 20 69 73 20 61  e top bound is a
13450 20 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f   < or <= operato
13460 72 2e 20 20 46 6f 72 20 61 20 64 65 73 63 65 6e  r.  For a descen
13470 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ding.      ** in
13480 64 65 78 20 74 68 65 20 6f 70 65 72 61 74 6f 72  dex the operator
13490 73 20 61 72 65 20 72 65 76 65 72 73 65 64 2e 0a  s are reversed..
134a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
134b0 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  f( pIdx->aSortOr
134c0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
134d0 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
134e0 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54     topOp = WO_LT
134f0 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
13500 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f  btmOp = WO_GT|WO
13510 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _GE;.      }else
13520 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20  {.        topOp 
13530 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
13540 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57         btmOp = W
13550 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20  O_LT|WO_LE;.    
13560 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f      SWAP(int, to
13570 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74  pLimit, btmLimit
13580 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13590 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
135a0 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
135b0 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
135c0 6b 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20  key value that. 
135d0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64       ** will end
135e0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68   the search.  Th
135f0 65 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e  ere is no termin
13600 61 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65  ation key if the
13610 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20  re.      ** are 
13620 6e 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  no equality term
13630 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22  s and no "X<..."
13640 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a   term..      **.
13650 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65        ** 2002-De
13660 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72  c-04: On a rever
13670 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74  se-order scan, t
13680 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65  he so-called "te
13690 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20  rmination".     
136a0 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64   ** key computed
136b0 20 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64   here really end
136c0 73 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73  s up being the s
136d0 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20  tart key..      
136e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70  */.      if( top
136f0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
13700 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
13710 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
13720 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
13730 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
13740 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
13750 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74  , k, notReady, t
13760 6f 70 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20  opOp, pIdx);.   
13770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
13780 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  rm!=0 );.       
13790 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
137a0 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
137b0 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
137c0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
137d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
137e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
137f0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
13800 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13810 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13820 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28 6e 45 71 2b  P_IsNull, -(nEq+
13830 31 29 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  1), brk);.      
13840 20 20 74 6f 70 45 71 20 3d 20 70 54 65 72 6d 2d    topEq = pTerm-
13850 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
13860 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
13870 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
13880 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
13890 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
138a0 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20   OP_IdxGE;.     
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138c0 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f  testOp = nEq>0 ?
138d0 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e   OP_IdxGE : OP_N
138e0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 74 6f 70  oop;.        top
138f0 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Eq = 1;.      }.
13900 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
13910 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
13920 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
13930 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a  nEq + topLimit;.
13940 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
13950 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
13960 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Mem++;.        b
13970 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76  uildIndexProbe(v
13980 2c 20 6e 43 6f 6c 2c 20 70 49 64 78 29 3b 0a 20  , nCol, pIdx);. 
13990 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
139a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
139b0 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50   op = topEq ? OP
139c0 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveLe : OP_Mov
139d0 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eLt;.          s
139e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
139f0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
13a00 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  brk);.        }e
13a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
13a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13a30 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
13a40 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
13a50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13a60 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
13a70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13a80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13a90 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72  OP_Last, iIdxCur
13aa0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
13ab0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
13ac0 74 65 20 74 68 65 20 73 74 61 72 74 20 6b 65 79  te the start key
13ad0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
13ae0 65 79 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  ey that defines 
13af0 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20  the lower.      
13b00 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  ** bound on the 
13b10 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
13b20 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69  s no start key i
13b30 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
13b40 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
13b50 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68   terms and if th
13b60 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e  ere is no "X>...
13b70 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20  " term.  In.    
13b80 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20    ** that case, 
13b90 67 65 6e 65 72 61 74 65 20 61 20 22 52 65 77 69  generate a "Rewi
13ba0 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nd" instruction 
13bb0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a  in place of the.
13bc0 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b        ** start k
13bd0 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20  ey search..     
13be0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30   **.      ** 200
13bf0 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65  2-Dec-04: In the
13c00 20 63 61 73 65 20 6f 66 20 61 20 72 65 76 65 72   case of a rever
13c10 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c  se-order search,
13c20 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20   the so-called. 
13c30 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20       ** "start" 
13c40 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20  key really ends 
13c50 75 70 20 62 65 69 6e 67 20 75 73 65 64 20 61 73  up being used as
13c60 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
13c70 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
13c80 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69       if( btmLimi
13c90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
13ca0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69  r *pX;.        i
13cb0 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
13cc0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
13cd0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
13ce0 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c  rm(&wc, iCur, k,
13cf0 20 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70   notReady, btmOp
13d00 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
13d10 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
13d20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
13d30 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
13d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13d50 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
13d60 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
13d70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13d80 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13d90 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
13da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13db0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
13dc0 4e 75 6c 6c 2c 20 2d 28 6e 45 71 2b 31 29 2c 20  Null, -(nEq+1), 
13dd0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 74  brk);.        bt
13de0 6d 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  mEq = pTerm->eOp
13df0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
13e00 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20  WO_GE);.        
13e10 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
13e20 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  el, pTerm);.    
13e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e40 20 62 74 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20   btmEq = 1;.    
13e50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
13e60 71 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20  q>0 || btmLimit 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
13e80 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c  Col = nEq + btmL
13e90 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 62 75  imit;.        bu
13ea0 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c  ildIndexProbe(v,
13eb0 20 6e 43 6f 6c 2c 20 70 49 64 78 29 3b 0a 20 20   nCol, pIdx);.  
13ec0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
13ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76  {.          pLev
13ee0 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
13ef0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
13f00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13f10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
13f20 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
13f30 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
13f40 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64    testOp = OP_Id
13f50 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xLT;.        }el
13f60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
13f70 74 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f  t op = btmEq ? O
13f80 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f  P_MoveGe : OP_Mo
13f90 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veGt;.          
13fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13fb0 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
13fc0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d   brk);.        }
13fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13fe0 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
13ff0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
14000 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
14010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14020 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
14030 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20  ewind, iIdxCur, 
14040 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
14050 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
14060 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20   the the top of 
14070 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68  the loop.  If th
14080 65 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61  ere is a termina
14090 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65  tion.      ** ke
140a0 79 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73  y we have to tes
140b0 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61  t for that key a
140c0 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68 65 20  nd abort at the 
140d0 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20  top of the.     
140e0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20   ** loop..      
140f0 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d  */.      start =
14100 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14110 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14120 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
14130 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
14140 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14150 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
14160 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
14170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14180 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
14190 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20  estOp, iIdxCur, 
141a0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  brk);.        if
141b0 28 20 28 74 6f 70 45 71 20 26 26 20 21 62 52 65  ( (topEq && !bRe
141c0 76 29 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26  v) || (!btmEq &&
141d0 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20   bRev) ){.      
141e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
141f0 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
14200 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  +", P3_STATIC);.
14210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14220 7d 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c  }.      if( topL
14230 69 6d 69 74 20 7c 20 62 74 6d 4c 69 6d 69 74 20  imit | btmLimit 
14240 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14250 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14260 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
14270 72 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  r, nEq);.       
14280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14290 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  p(v, OP_IsNull, 
142a0 31 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20  1, cont);.      
142b0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  }.      if( !omi
142c0 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
142d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142e0 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  Op(v, OP_IdxRowi
142f0 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  d, iIdxCur, 0);.
14300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14310 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14320 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b  oveGe, iCur, 0);
14330 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14340 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
14350 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
14360 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
14370 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
14380 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
14390 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
143a0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
143b0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
143c0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  IdxCur;.      pL
143d0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
143e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
143f0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
14400 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
14410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
14420 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e   4:  There is an
14430 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74   index and all t
14440 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
14450 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20  E clause that.  
14460 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
14470 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64  refer to the ind
14480 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d  ex using the "==
14490 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
144a0 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ors..      */.  
144b0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
144c0 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
144d0 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20  Level->nEq;..   
144e0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
144f0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
14500 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
14510 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
14520 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
14530 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75 65   leave the value
14540 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
14550 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
14560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
14570 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
14580 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  ms(pParse, pLeve
14590 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79  l, &wc, notReady
145a0 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f  , brk);..      /
145b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e  * Generate a sin
145c0 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69 6c  gle key that wil
145d0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f 74  l be used to bot
145e0 68 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d  h start and term
145f0 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  inate.      ** t
14600 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20 20  he search.      
14610 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64 49 6e  */.      buildIn
14620 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c  dexProbe(v, nEq,
14630 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71   pIdx);.      sq
14640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14650 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
14660 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
14670 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
14680 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f 20  ate code (1) to 
14690 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72 73  move to the firs
146a0 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
146b0 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
146c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 67  .      ** Then g
146d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32 29  enerate code (2)
146e0 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 22   that jumps to "
146f0 62 72 6b 22 20 61 66 74 65 72 20 74 68 65 20 63  brk" after the c
14700 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20 20  ursor is past.  
14710 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
14720 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74  matching element
14730 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
14740 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73 20  The code (1) is 
14750 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20 2a  executed.      *
14760 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  * once to initia
14770 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68 2c  lize the search,
14780 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69 73   the code (2) is
14790 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72 65   executed before
147a0 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20 69   each.      ** i
147b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
147c0 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20 74  scan to see if t
147d0 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e 69  he scan has fini
147e0 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69  shed. */.      i
147f0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
14800 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65     /* Scan in re
14810 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
14820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14830 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
14840 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c 20 62  veLe, iIdxCur, b
14850 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  rk);.        sta
14860 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
14870 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
14880 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
14890 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
148a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
148b0 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64  v, OP_IdxLT, iId
148c0 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
148d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
148e0 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20   OP_Prev;.      
148f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
14900 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f  * Scan in the fo
14910 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rward order */. 
14920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14930 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
14940 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c 20 62  veGe, iIdxCur, b
14950 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  rk);.        sta
14960 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
14970 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
14980 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
14990 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
149a0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
149b0 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43   OP_IdxGE, iIdxC
149c0 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33  ur, brk, "+", P3
149d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
149e0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
149f0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  P_Next;.      }.
14a00 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
14a10 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
14a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a30 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
14a40 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
14a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14a60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
14a70 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
14a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
14a90 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
14aa0 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
14ab0 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
14ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14ad0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
14ae0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
14af0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
14b00 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
14b10 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
14b20 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
14b30 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  table..      */.
14b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
14b50 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
14b60 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
14b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
14b80 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
14b90 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
14ba0 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
14bb0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
14bc0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
14bd0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
14be0 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
14bf0 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
14c00 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
14c10 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
14c20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
14c30 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
14c40 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
14c50 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
14c60 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
14c70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
14c80 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
14c90 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
14ca0 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
14cb0 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
14cc0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
14cd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
14ce0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
14cf0 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
14d00 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
14d10 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
14d20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
14d30 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
14d40 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
14d50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
14d60 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
14d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14d80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
14d90 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
14da0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
14db0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
14dc0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
14dd0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14de0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14df0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
14e00 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20  arse, pE, cont, 
14e10 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  1);.      pTerm-
14e20 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
14e30 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ODED;.    }..   
14e40 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
14e50 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
14e60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
14e70 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
14e80 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ct that.    ** a
14e90 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
14ea0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
14eb0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
14ec0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
14ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14ee0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
14ef0 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  n ){.      pLeve
14f00 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  l->top = sqlite3
14f10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14f20 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
14f30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14f40 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76  _MemInt, 1, pLev
14f50 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
14f60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
14f70 74 28 28 76 2c 20 22 23 20 72 65 63 6f 72 64 20  t((v, "# record 
14f80 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
14f90 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
14fa0 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77  m=wc.a, j=0; j<w
14fb0 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  c.nTerm; j++, pT
14fc0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
14fd0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
14fe0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
14ff0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
15000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15010 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
15020 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
15030 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
15040 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15050 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
15060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15070 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
15080 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
15090 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  r, cont, 1);.   
150a0 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
150b0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
150c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
150d0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
150e0 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
150f0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
15100 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
15110 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
15120 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
15130 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
15140 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
15150 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
15160 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
15170 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
15180 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
15190 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
151a0 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
151b0 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
151c0 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
151d0 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
151e0 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
151f0 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
15200 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
15210 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
15220 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
15230 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
15240 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
15250 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
15260 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
15270 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
15280 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
15290 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
152a0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
152b0 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
152c0 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
152d0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
152e0 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
152f0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
15300 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
15310 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
15320 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
15330 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
15340 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
15350 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
15360 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
15370 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
15380 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
15390 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b  [nQPlan], "{}");
153a0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
153b0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
153c0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  e{.        strcp
153d0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
153e0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
153f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
15400 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
15410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
15420 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
15430 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
15440 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
15450 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52  flags & (WHERE_R
15460 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
15470 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20  WID_RANGE) ){.  
15480 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
15490 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
154a0 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20  QPlan], "* ");. 
154b0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
154c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
154d0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
154e0 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ){.      strcpy(
154f0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
15500 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
15510 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   ");.      nQPla
15520 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  n += 3;.    }els
15530 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  e{.      n = str
15540 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78  len(pLevel->pIdx
15550 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
15560 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
15570 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
15580 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
15590 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
155a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
155b0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
155c0 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
155d0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
155e0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71  += n;.        sq
155f0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
15600 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
15610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15620 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50    }.  while( nQP
15630 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33  lan>0 && sqlite3
15640 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
15650 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  an-1]==' ' ){.  
15660 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
15670 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d  plan[--nQPlan] =
15680 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
15690 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
156a0 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c  lan] = 0;.  nQPl
156b0 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f  an = 0;.#endif /
156c0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f  * SQLITE_TEST //
156d0 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   Testing and deb
156e0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
156f0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
15700 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
15710 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
15720 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
15730 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  ure.  Then.  ** 
15740 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  clean up and ret
15750 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  urn..  */.  pWIn
15760 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
15770 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61  cont;.  whereCla
15780 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20  useClear(&wc);. 
15790 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
157a0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
157b0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
157c0 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  */.whereBeginNoM
157d0 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73  em:.  whereClaus
157e0 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 77  eClear(&wc);.  w
157f0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49  hereInfoFree(pWI
15800 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  nfo);.  return 0
15810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
15820 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
15830 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
15840 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
15850 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
15860 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
15870 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
15880 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
15890 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
158a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
158b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e    Vdbe *v = pWIn
158c0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62  fo->pParse->pVdb
158d0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
158e0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
158f0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
15900 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
15910 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  pTabList;..  /* 
15920 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
15930 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
15940 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61    */.  for(i=pTa
15950 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69  bList->nSrc-1; i
15960 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
15970 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
15980 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
15990 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
159a0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f  el(v, pLevel->co
159b0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
159c0 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
159d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
159e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c  3VdbeAddOp(v, pL
159f0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
15a00 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
15a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15a20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15a30 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
15a40 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  brk);.    if( pL
15a50 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20  evel->nIn ){.   
15a60 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20 20 20 20     int *a;.     
15a70 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
15a80 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c  r(j=pLevel->nIn,
15a90 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c   a=&pLevel->aInL
15aa0 6f 6f 70 5b 6a 2a 32 2d 32 5d 3b 20 6a 3e 30 3b  oop[j*2-2]; j>0;
15ab0 20 6a 2d 2d 2c 20 61 2d 3d 32 29 7b 0a 20 20 20   j--, a-=2){.   
15ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ad0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
15ae0 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20  , a[0], a[1]);. 
15af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15b00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 5b  beJumpHere(v, a[
15b10 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1]-1);.      }. 
15b20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
15b30 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
15b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15b50 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15b60 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
15b70 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
15b80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15b90 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
15ba0 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
15bb0 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  Join, 0);.      
15bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15bd0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
15be0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
15bf0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
15c00 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
15c10 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
15c20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15c30 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  ddOp(v, OP_NullR
15c40 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
15c50 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
15c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15c70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
15c80 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74  to, 0, pLevel->t
15c90 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
15ca0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15cb0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
15cc0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
15cd0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
15ce0 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
15cf0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
15d00 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
15d10 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
15d20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15d30 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
15d40 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43  iBreak);..  /* C
15d50 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
15d60 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
15d70 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
15d80 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
15d90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
15da0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
15db0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
15dc0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
15dd0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
15de0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
15df0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
15e00 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
15e10 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
15e20 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
15e30 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
15e40 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
15e50 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68   if( pTab->isEph
15e60 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  em || pTab->pSel
15e70 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
15e80 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
15e90 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
15ea0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
15eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ec0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
15ed0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
15ee0 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rsor, 0);.    }.
15ef0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
15f00 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
15f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f20 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  p(v, OP_Close, p
15f30 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
15f40 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
15f50 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20 73 75  * Make cursor su
15f60 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f 72 20  bstitutions for 
15f70 63 61 73 65 73 20 77 68 65 72 65 20 77 65 20 77  cases where we w
15f80 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20 20 2a  ant to use.    *
15f90 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  * just the index
15fa0 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66 65 72   and never refer
15fb0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  ence the table..
15fc0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
15fd0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
15fe0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
15ff0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
16000 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
16010 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
16020 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
16030 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
16040 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
16050 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
16060 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
16070 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
16080 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
16090 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
160a0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
160b0 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
160c0 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
160d0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
160e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
160f0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
16100 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
16110 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
16120 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 69  _ONLY ){.      i
16130 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20  nt k, j, last;. 
16140 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
16150 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
16160 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
16170 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
16180 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
16190 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
161a0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
161b0 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
161c0 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
161d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
161e0 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
161f0 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
16200 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
16210 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16220 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
16230 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
16240 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
16250 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
16260 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
16270 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
16280 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
16290 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
162a0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
162b0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
162c0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
162d0 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
162e0 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
162f0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
16300 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
16310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16330 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
16340 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
16350 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
16360 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
16370 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
16380 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
16390 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
163a0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
163b0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
163c0 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77  code==OP_NullRow
163d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
163e0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
163f0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
16400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16410 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
16420 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
16430 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
16440 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.