System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact bcdf04d24e420e0a68f5eee5121ec890ef12a5df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 34 20   where.c,v 1.14 
0340: 32 30 30 36 2f 30 31 2f 31 30 20 32 31 3a 31 30  2006/01/10 21:10
0350: 3a 31 38 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :18 rmsimpson Ex
0360: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0370: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0380: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0390: 6f 66 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  of bits in a Bit
03a0: 6d 61 73 6b 2e 20 20 22 42 4d 53 22 20 6d 65 61  mask.  "BMS" mea
03b0: 6e 73 20 22 42 69 74 4d 61 73 6b 20 53 69 7a 65  ns "BitMask Size
03c0: 22 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 4d  "..*/.#define BM
03d0: 53 20 20 28 73 69 7a 65 6f 66 28 42 69 74 6d 61  S  (sizeof(Bitma
03e0: 73 6b 29 2a 38 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  sk)*8)../*.** De
03f0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
0400: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
0410: 6e 20 61 6e 20 61 72 72 61 79 2e 0a 2a 2f 0a 23  n an array..*/.#
0420: 64 65 66 69 6e 65 20 41 52 52 41 59 53 49 5a 45  define ARRAYSIZE
0430: 28 58 29 20 20 28 73 69 7a 65 6f 66 28 58 29 2f  (X)  (sizeof(X)/
0440: 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f  sizeof(X[0]))../
0450: 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70 75  *.** Trace outpu
0460: 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66 20  t macros.*/.#if 
0470: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
0480: 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
0490: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 69 6e  SQLITE_DEBUG).in
04a0: 74 20 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f  t sqlite3_where_
04b0: 74 72 61 63 65 20 3d 20 30 3b 0a 23 20 64 65 66  trace = 0;.# def
04c0: 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 69 66  ine TRACE(X)  if
04d0: 28 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  (sqlite3_where_t
04e0: 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65 62  race) sqlite3Deb
04f0: 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65  ugPrintf X.#else
0500: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0510: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
0520: 20 41 20 6c 61 72 67 65 20 76 61 6c 75 65 20 77   A large value w
0530: 68 69 63 68 20 69 73 20 74 68 65 20 6d 61 78 69  hich is the maxi
0540: 6d 75 6d 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  mum cost of usin
0550: 67 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 20 42  g an index..** B
0560: 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20 69  y default this i
0570: 73 20 61 20 6c 61 72 67 65 20 66 6c 6f 61 74 69  s a large floati
0580: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 20  ng point value. 
0590: 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 0a   When compiling.
05a0: 2a 2a 20 53 51 4c 69 74 65 20 66 6f 72 20 61 20  ** SQLite for a 
05b0: 70 72 6f 63 65 73 73 6f 72 20 74 68 61 74 20 6c  processor that l
05c0: 61 63 6b 73 20 66 6c 6f 61 74 69 6e 67 20 70 6f  acks floating po
05d0: 69 6e 74 20 73 75 70 70 6f 72 74 2c 20 73 69 6d  int support, sim
05e0: 70 6c 79 0a 2a 2a 20 72 65 64 65 66 69 6e 65 20  ply.** redefine 
05f0: 74 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 74 6f  this constant to
0600: 20 61 20 6c 61 72 67 65 20 69 6e 74 65 67 65 72   a large integer
0610: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0620: 49 54 45 5f 42 49 47 5f 44 42 4c 0a 23 20 64 65  ITE_BIG_DBL.# de
0630: 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 49 47 5f  fine SQLITE_BIG_
0640: 44 42 4c 20 28 31 2e 30 65 2b 39 39 29 0a 23 65  DBL (1.0e+99).#e
0650: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
0660: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
0670: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0680: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
0690: 61 75 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ause;../*.** The
06a0: 20 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72   query generator
06b0: 20 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f   uses an array o
06c0: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
06d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f  his structure to
06e0: 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c  .** help it anal
06f0: 79 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65  yze the subexpre
0700: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48  ssions of the WH
0710: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63  ERE clause.  Eac
0720: 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  h WHERE.** claus
0730: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  e subexpression 
0740: 69 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  is separated fro
0750: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20  m the others by 
0760: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
0770: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65  .**.** All Where
0780: 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63  Terms are collec
0790: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
07a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
07b0: 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68  ructure.  .** Th
07c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
07d0: 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a  tity holds:.**.*
07e0: 2a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  *        WhereTe
07f0: 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54  rm.pWC->a[WhereT
0800: 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72  erm.idx] == Wher
0810: 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  eTerm.**.** When
0820: 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68   a term is of th
0830: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70             X <op
0850: 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77  > <expr>.**.** w
0860: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75  here X is a colu
0870: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e  mn name and <op>
0880: 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61   is one of certa
0890: 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a  in operators,.**
08a0: 20 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e   then WhereTerm.
08b0: 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57  leftCursor and W
08c0: 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c  hereTerm.leftCol
08d0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
08e0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
08f0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
0900: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
0910: 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63  erm.operator rec
0920: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e  ords.** the <op>
0930: 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b   using a bitmask
0940: 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65   encoding define
0950: 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f  d by WO_xxx belo
0960: 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f  w.  The.** use o
0970: 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  f a bitmask enco
0980: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65  ding for the ope
0990: 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20  rator allows us 
09a0: 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69  to search.** qui
09b0: 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74  ckly for terms t
09c0: 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66  hat match any of
09d0: 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
09e0: 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  nt operators..**
09f0: 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20  .** prereqRight 
0a00: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0a10: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0a20: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0a30: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0a40: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0a50: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0a60: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0a70: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0a80: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0a90: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0aa0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0ab0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0ac0: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0ad0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0ae0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0af0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0b00: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0b10: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0b20: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0b30: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0b40: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0b50: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0b60: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0b70: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0b80: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0b90: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ba0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0bb0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0bc0: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
0bd0: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
0be0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
0bf0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0c00: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0c10: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0c20: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0c30: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0c40: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0c50: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0c60: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0c70: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0c80: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0c90: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
0ca0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
0cb0: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
0cc0: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
0cd0: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f   0 through 7..*/
0ce0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0cf0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
0d00: 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72  erm;.struct Wher
0d10: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
0d20: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
0d30: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0d40: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0d50: 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65  n */.  i16 iPare
0d60: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
0d70: 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61  * Disable pWC->a
0d80: 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74  [iParent] when t
0d90: 68 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65  his term disable
0da0: 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43  d */.  i16 leftC
0db0: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0dc0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0dd0: 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20  of X in "X <op> 
0de0: 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36  <expr>" */.  i16
0df0: 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20   leftColumn;    
0e00: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0e10: 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58  umber of X in "X
0e20: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f   <op> <expr>" */
0e30: 0a 20 20 75 31 36 20 6f 70 65 72 61 74 6f 72 3b  .  u16 operator;
0e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0e50: 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63  WO_xx value desc
0e60: 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20  ribing <op> */. 
0e70: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
0e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20           /* Bit 
0e90: 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f  flags.  See belo
0ea0: 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64  w */.  u8 nChild
0eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  * Number of chil
0ed0: 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64  dren that must d
0ee0: 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57  isable us */.  W
0ef0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
0f00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c         /* The cl
0f10: 61 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69  ause this term i
0f20: 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42  s part of */.  B
0f30: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67  itmask prereqRig
0f40: 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ht;    /* Bitmas
0f50: 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  k of tables used
0f60: 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20   by pRight */.  
0f70: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
0f80: 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  l;      /* Bitma
0f90: 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66  sk of tables ref
0fa0: 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a  erenced by p */.
0fb0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
0fc0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
0fd0: 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23  eTerm.flags.*/.#
0fe0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
0ff0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
1000: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
1010: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1020: 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e  pExpr) */.#defin
1030: 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20  e TERM_VIRTUAL  
1040: 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65    0x02   /* Adde
1050: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
1060: 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65  er.  Do not code
1070: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
1080: 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34  _CODED      0x04
1090: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
10a0: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64  is already coded
10b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
10c0: 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38  _COPIED     0x08
10d0: 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c     /* Has a chil
10e0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  d */.#define TER
10f0: 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31  M_OR_OK      0x1
1100: 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69  0   /* Used duri
1110: 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f  ng OR-clause pro
1120: 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  cessing */../*.*
1130: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1140: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1150: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1160: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1170: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1180: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1190: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
11a0: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
11b0: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
11c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
11d0: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
11e0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
11f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1200: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1210: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1220: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1230: 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   of terms */.  i
1240: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
1250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1260: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1270: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
1280: 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  rm *a;          
1290: 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65    /* Each a[] de
12a0: 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f  scribes a term o
12b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61  f the WHERE clua
12c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
12d0: 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20  m aStatic[10];  
12e0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
12f0: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d  ic space for a[]
1300: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1310: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1330: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1340: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1350: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1360: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1370: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1380: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1390: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
13a0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
13b0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
13c0: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
13d0: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
13e0: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
13f0: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
1400: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
1410: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
1420: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
1430: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1440: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1450: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1460: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1470: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1480: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1490: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
14a0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
14b0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
14c0: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
14d0: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
14e0: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
14f0: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
1500: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1510: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
1520: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
1530: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1540: 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65  ** If ExprMaskSe
1550: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
1560: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
1570: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
1580: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
1590: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
15a0: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
15b0: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
15c0: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
15d0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
15e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
15f0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
1600: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
1610: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
1620: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
1630: 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d   Then the  ExprM
1640: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
1650: 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68  .** would map th
1660: 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ose cursor numbe
1670: 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74  rs into bits 0 t
1680: 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20  hrough 5..**.** 
1690: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  Note that the ma
16a0: 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  pping is not nec
16b0: 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64  essarily ordered
16c0: 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  .  In the exampl
16d0: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20  e.** above, the 
16e0: 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f  mapping might go
16f0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e   like this:  4->
1700: 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32  3, 5->1, 8->2, 2
1710: 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20  9->0,.** 57->5, 
1720: 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f  73->4.  Or one o
1730: 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62  f 719 other comb
1740: 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62  inations might b
1750: 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f  e used. It.** do
1760: 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61  es not really ma
1770: 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69  tter.  What is i
1780: 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74  mportant is that
1790: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a   sparse cursor.*
17a0: 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65  * numbers all ge
17b0: 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69  t mapped into bi
17c0: 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62  t numbers that b
17d0: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
17e0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61  contain.** no ga
17f0: 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ps..*/.typedef s
1800: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
1810: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73  t ExprMaskSet;.s
1820: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
1830: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1860: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1870: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1880: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
1890: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
18a0: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
18b0: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
18c0: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
18d0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
18e0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
18f0: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
1900: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
1910: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
1920: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
1930: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1940: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1950: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1960: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1970: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1980: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
1990: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
19a0: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
19b0: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
19c0: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
19d0: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
19e0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
19f0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
1a00: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
1a10: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
1a20: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
1a30: 45 2d 54 4b 5f 45 51 29 29 0a 0a 2f 2a 0a 2a 2a  E-TK_EQ))../*.**
1a40: 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73   Value for flags
1a50: 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73   returned by bes
1a60: 74 49 6e 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66  tIndex().*/.#def
1a70: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1a80: 45 51 20 20 20 20 20 20 20 30 78 30 30 30 31 20  EQ       0x0001 
1a90: 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20    /* rowid=EXPR 
1aa0: 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  or rowid IN (...
1ab0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
1ac0: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20  RE_ROWID_RANGE  
1ad0: 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 72 6f    0x0002   /* ro
1ae0: 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  wid<EXPR and/or 
1af0: 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64  rowid>EXPR */.#d
1b00: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
1b10: 4d 4e 5f 45 51 20 20 20 20 20 20 30 78 30 30 31  MN_EQ      0x001
1b20: 30 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72  0   /* x=EXPR or
1b30: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
1b40: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1b50: 55 4d 4e 5f 52 41 4e 47 45 20 20 20 30 78 30 30  UMN_RANGE   0x00
1b60: 32 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  20   /* x<EXPR a
1b70: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
1b80: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
1b90: 4c 55 4d 4e 5f 49 4e 20 20 20 20 20 20 30 78 30  LUMN_IN      0x0
1ba0: 30 34 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e  040   /* x IN (.
1bb0: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
1bc0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20  HERE_TOP_LIMIT  
1bd0: 20 20 20 20 30 78 30 31 30 30 20 20 20 2f 2a 20      0x0100   /* 
1be0: 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50  x<EXPR or x<=EXP
1bf0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1c00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54  #define WHERE_BT
1c10: 4d 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30  M_LIMIT      0x0
1c20: 32 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20  200   /* x>EXPR 
1c30: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
1c40: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
1c50: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1c60: 20 20 20 20 20 20 30 78 30 38 30 30 20 20 20 2f        0x0800   /
1c70: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
1c80: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
1c90: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f  .#define WHERE_O
1ca0: 52 44 45 52 42 59 20 20 20 20 20 20 20 20 30 78  RDERBY        0x
1cb0: 31 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74  1000   /* Output
1cc0: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
1cd0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
1ce0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1cf0: 45 56 45 52 53 45 20 20 20 20 20 20 20 20 30 78  EVERSE        0x
1d00: 32 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69  2000   /* Scan i
1d10: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1d20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1d30: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20  _UNIQUE         
1d40: 30 78 34 30 30 30 20 20 20 2f 2a 20 53 65 6c 65  0x4000   /* Sele
1d50: 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  cts no more than
1d60: 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 0a 2f 2a 0a   one row */../*.
1d70: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1d80: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1d90: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1da0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1db0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1dc0: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
1dd0: 70 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61 72  pWC, Parse *pPar
1de0: 73 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  se){.  pWC->pPar
1df0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
1e00: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
1e10: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52   pWC->nSlot = AR
1e20: 52 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53 74  RAYSIZE(pWC->aSt
1e30: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
1e40: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
1e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
1e60: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1e70: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1e80: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1e90: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1ea0: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1eb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ec0: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1ed0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1ee0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1ef0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1f00: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
1f10: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
1f20: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
1f30: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
1f40: 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69  m-1, a=pWC->a; i
1f50: 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a  >=0; i--, a++){.
1f60: 20 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73      if( a->flags
1f70: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
1f80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f90: 45 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45  ExprDelete(a->pE
1fa0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
1fb0: 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57    if( pWC->a!=pW
1fc0: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
1fd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 43    sqliteFree(pWC
1fe0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
1ff0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
2000: 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72  ries to the Wher
2010: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2020: 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65  e.  Increase the
2030: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70   allocated.** sp
2040: 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  ace as necessary
2050: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
2060: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
2070: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
2080: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
2090: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
20a0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
20b0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
20c0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
20d0: 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a 2a 20  alided after.** 
20e0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
20f0: 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e  tine.  Such poin
2100: 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e  ters may be rein
2110: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66  itialized by ref
2120: 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20  erencing.** the 
2130: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a  pWC->a[] array..
2140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2150: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
2160: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2170: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
2180: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
2190: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
21a0: 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43 2d   idx;.  if( pWC-
21b0: 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c  >nTerm>=pWC->nSl
21c0: 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54  ot ){.    WhereT
21d0: 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d  erm *pOld = pWC-
21e0: 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  >a;.    pWC->a =
21f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
2200: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
2210: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
2220: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
2230: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2240: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
2250: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
2260: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
2270: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
2280: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
2290: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
22a0: 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20  eFree(pOld);.   
22b0: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
22c0: 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54  t *= 2;.  }.  pT
22d0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
22e0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  x = pWC->nTerm];
22f0: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b  .  pWC->nTerm++;
2300: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
2310: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c  = p;.  pTerm->fl
2320: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
2330: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
2340: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
2350: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2360: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
2370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
2380: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
2390: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
23a0: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
23b0: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
23c0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
23d0: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
23e0: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
23f0: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
2400: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2410: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
2420: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
2430: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
2440: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
2450: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
2460: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
2470: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2480: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
2490: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
24a0: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
24b0: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
24c0: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
24d0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
24e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
24f0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
2500: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
2510: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
2520: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
2530: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2540: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
2550: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
2560: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
2570: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
2580: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
2590: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
25a0: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
25b0: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
25c0: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
25d0: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
25e0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
25f0: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
2600: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
2610: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
2620: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
2630: 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67  y.  This array g
2640: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
2650: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2660: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2670: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2680: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2690: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
26a0: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
26b0: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
26c0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
26d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
26e0: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
26f0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
2700: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
2710: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
2720: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2730: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
2740: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
2750: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2760: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
2770: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2780: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
2790: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
27a0: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
27b0: 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20  t(P)  memset(P, 
27c0: 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a  0, sizeof(*P))..
27d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
27f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
2800: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
2810: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
2820: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
2830: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2840: 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d  sk getMask(ExprM
2850: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2860: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
2870: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2880: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
2890: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
28a0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
28b0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
28c0: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
28d0: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
28e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2900: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
2910: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
2920: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
2930: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
2940: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2950: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
2960: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
2970: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2980: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2990: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
29a0: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
29b0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
29c0: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
29d0: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
29e0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
29f0: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
2a00: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
2a10: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
2a20: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
2a30: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2a40: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
2a50: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
2a60: 52 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53 65  RRAYSIZE(pMaskSe
2a70: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
2a80: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
2a90: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
2aa0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2ab0: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
2ac0: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
2ad0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2ae0: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
2af0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
2b00: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
2b10: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
2b20: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
2b30: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
2b40: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
2b50: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
2b60: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2b70: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
2b80: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
2b90: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70  voked sqlite3Exp
2ba0: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2bb0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2bc0: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
2bd0: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
2be0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
2bf0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2c00: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
2c10: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2c20: 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  lveNames() routi
2c30: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
2c40: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
2c50: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
2c60: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
2c70: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
2c80: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
2c90: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
2ca0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
2cb0: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
2cc0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
2cd0: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
2ce0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2cf0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
2d00: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
2d10: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
2d20: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
2d30: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2d40: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2d50: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
2d60: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
2d70: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
2d80: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
2d90: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65  ExprMaskSet*, Se
2da0: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
2db0: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
2dc0: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2dd0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2de0: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
2df0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
2e00: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
2e10: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
2e20: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
2e30: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
2e40: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
2e50: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
2e60: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
2e70: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
2e80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
2e90: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
2ea0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2eb0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2ec0: 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  eft);.  mask |= 
2ed0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2ee0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
2ef0: 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pList);.  mask |
2f00: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
2f10: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2f20: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
2f30: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
2f40: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2f50: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2f60: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2f70: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
2f80: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2f90: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
2fa0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
2fb0: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
2fc0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2fd0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
2fe0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2ff0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3000: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3010: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
3020: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
3030: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3040: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
3050: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
3060: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
3070: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
3080: 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d   mask;.  if( pS=
3090: 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  =0 ){.    mask =
30a0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
30b0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74   mask = exprList
30c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
30d0: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
30e0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
30f0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3100: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
3110: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
3120: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
3130: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3140: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
3150: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3160: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3170: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
3180: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
3190: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
31a0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
31b0: 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ving);.  }.  ret
31c0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
31d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
31e0: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
31f0: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
3200: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
3210: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
3220: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
3230: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3240: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
3250: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
3260: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
3270: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64   "<=", ">=", and
3280: 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "IN"..*/.static
3290: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
32a0: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
32b0: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
32c0: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
32d0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
32e0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
32f0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
3300: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
3310: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
3320: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
3330: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
3340: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
3350: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
3360: 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f  op<=TK_GE);.}../
3370: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
3380: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 2e  jects of type T.
3390: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
33a0: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
33b0: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
33c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
33d0: 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f 70  a comparision op
33e0: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
33f0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
3400: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
3410: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
3420: 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74 61  "Y op X"..*/.sta
3430: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
3440: 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78 70 72  mute(Expr *pExpr
3450: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  ){.  assert( all
3460: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
3470: 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ) && pExpr->op!=
3480: 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28  TK_IN );.  SWAP(
3490: 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e  CollSeq*,pExpr->
34a0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45  pRight->pColl,pE
34b0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
34c0: 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  l);.  SWAP(Expr*
34d0: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
34e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
34f0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
3500: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
3510: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
3520: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
3530: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
3540: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3550: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
3560: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3570: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
3580: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
3590: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
35a0: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
35b0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
35c0: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
35d0: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
35e0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
35f0: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
3600: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
3610: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
3620: 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61  c int operatorMa
3630: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  sk(int op){.  in
3640: 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t c;.  assert( a
3650: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
3660: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
3670: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
3680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3690: 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b   = WO_EQ<<(op-TK
36a0: 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _EQ);.  }.  asse
36b0: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
36c0: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
36d0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
36e0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
36f0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3700: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
3710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3720: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
3730: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
3740: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
3750: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3760: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3770: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3780: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3790: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
37a0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
37b0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
37c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
37d0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
37e0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
37f0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
3800: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
3810: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
3820: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
3830: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
3840: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
3850: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
3860: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3870: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
3880: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
3890: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
38a0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
38b0: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
38c0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
38d0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
38e0: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
38f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3910: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
3920: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
3930: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3940: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3950: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
3960: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3970: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3980: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3990: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
39a0: 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u16 op,         
39b0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
39c0: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
39d0: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
39e0: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
39f0: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
3a00: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
3a10: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
3a20: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
3a30: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
3a40: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
3a50: 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  k;.  for(pTerm=p
3a60: 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
3a70: 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65  erm; k; k--, pTe
3a80: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
3a90: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
3aa0: 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26  ==iCur.       &&
3ab0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
3ac0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
3ad0: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
3ae0: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  erm->leftColumn=
3af0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3b00: 26 26 20 28 70 54 65 72 6d 2d 3e 6f 70 65 72 61  && (pTerm->opera
3b10: 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20  tor & op)!=0.   
3b20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
3b30: 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20 29 7b  ur>=0 && pIdx ){
3b40: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
3b50: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3b60: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
3b70: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
3b80: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20    char idxaff;. 
3b90: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
3ba0: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
3bb0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
3bc0: 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61  e;..        idxa
3bd0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
3be0: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
3bf0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
3c00: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
3c10: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
3c20: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
3c30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
3c40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
3c50: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
3c60: 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  , pX->pLeft);.  
3c70: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
3c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3c90: 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29 7b 0a  ( pX->pRight ){.
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3cb0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3cc0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
3cd0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
3ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3cf0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3d10: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
3d20: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
3d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3d40: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
3d50: 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
3d60: 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  n && pIdx->aiCol
3d70: 75 6d 6e 5b 6b 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[k]!=iColumn;
3d80: 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   k++){}.        
3d90: 61 73 73 65 72 74 28 20 6b 3c 70 49 64 78 2d 3e  assert( k<pIdx->
3da0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
3db0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3dc0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
3dd0: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
3de0: 5b 6b 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [k]) ) continue;
3df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
3e00: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
3e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3e20: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
3e30: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3e40: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
3e50: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
3e60: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 57 68  ExprMaskSet*, Wh
3e70: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
3e80: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
3e90: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
3ea0: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
3eb0: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a  E clause.  .**.*
3ec0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
3ed0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
3ee0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
3ef0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
3f00: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3f10: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
3f20: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20  *pMaskSet,   /* 
3f30: 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  table masks */. 
3f40: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3f50: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
3f60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
3f70: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
3f80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
3f90: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
3fa0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3fb0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
3fc0: 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53 65 74  abList, pMaskSet
3fd0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
3fe0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3ff0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
4000: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
4010: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
4020: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
4030: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
4040: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
4050: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
4060: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
4070: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
4080: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
4090: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
40a0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
40b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
40c0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
40d0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
40e0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
40f0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
4100: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
4110: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
4120: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
4130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4140: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73  sLikeOrGlob(.  s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
4160: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
4170: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4180: 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  r,      /* Test 
4190: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
41a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74  */.  int *pnPatt
41b0: 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ern,   /* Number
41c0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
41d0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
41e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  rs */.  int *pis
41f0: 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75  Complete  /* Tru
4200: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
4210: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
4220: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
4230: 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  r */.){.  const 
4240: 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20  char *z;.  Expr 
4250: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
4260: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4270: 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74  st;.  int c, cnt
4280: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
4290: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20    char wc[3];.  
42a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
42b0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
42c0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
42d0: 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65  , pExpr, &noCase
42e0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
42f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
4300: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
4310: 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  t;.  pRight = pL
4320: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
4330: 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f  .  if( pRight->o
4340: 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
4350: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4360: 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  }.  pLeft = pLis
4370: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
4380: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
4390: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
43a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
43b0: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
43c0: 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f  pColl;.  if( pCo
43d0: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  ll==0 ){.    pCo
43e0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
43f0: 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ll;.  }.  if( (p
4400: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
4410: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c  TE_COLL_BINARY |
4420: 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20  | noCase) &&.   
4430: 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21     (pColl->type!
4440: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43  =SQLITE_COLL_NOC
4450: 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20  ASE || !noCase) 
4460: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
4480: 71 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74  quoteExpr(pRight
4490: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
44a0: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
44b0: 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 28  ;.  for(cnt=0; (
44c0: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
44d0: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
44e0: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
44f0: 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66 28  ; cnt++){}.  if(
4500: 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d   cnt==0 || 255==
4510: 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20  (u8)z[cnt] ){.  
4520: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4530: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
4540: 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26   z[cnt]==wc[0] &
4550: 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20  & z[cnt+1]==0;. 
4560: 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e   *pnPattern = cn
4570: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
4580: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4590: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
45a0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  MIZATION */../*.
45b0: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
45c0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
45d0: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
45e0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
45f0: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
4600: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
4610: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
4620: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
4630: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
4640: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
4650: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
4660: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
4670: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
4680: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
4690: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
46a0: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
46b0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
46c0: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
46d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
46e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  .../*.** The inp
46f0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
4700: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
4710: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
4720: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
4730: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
4740: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
4750: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
4760: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
4770: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
4780: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
4790: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
47a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
47b0: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
47c0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
47d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
47e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
47f0: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
4800: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
4810: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
4820: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
4830: 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68 65 20  expr>".  If the 
4840: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
4850: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
4860: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
4870: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 20 63  th X and Y are c
4880: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
4890: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70   original.** exp
48a0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
48b0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
48c0: 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 69 6f  irtual expressio
48d0: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  n of the form.**
48e0: 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61   "Y <op> X" is a
48f0: 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  dded to the WHER
4900: 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61 6e 61  E clause and ana
4910: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
4920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4930: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
4940: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
4950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
4960: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
4970: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70    ExprMaskSet *p
4980: 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20 74  MaskSet,    /* t
4990: 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  able masks */.  
49a0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
49b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
49c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
49d0: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49f0: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
4a00: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
4a10: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4a20: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
4a30: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
4a40: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
4a50: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 42 69  erm->pExpr;.  Bi
4a60: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
4a70: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  ;.  Bitmask prer
4a80: 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 6e 50 61  eqAll;.  int nPa
4a90: 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43  ttern;.  int isC
4aa0: 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20 69 66 28 20  omplete;..  if( 
4ab0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
4ac0: 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  a()->mallocFaile
4ad0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72  d ) return;.  pr
4ae0: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
4af0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4b00: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
4b10: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
4b20: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
4b30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4b40: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
4b50: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
4b60: 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ght = exprListTa
4b70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4b80: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  t, pExpr->pList)
4b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ba0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70             | exp
4bb0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4bc0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
4bd0: 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  r->pSelect);.  }
4be0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
4bf0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
4c00: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4c10: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
4c20: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
4c30: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
4c40: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4c50: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
4c60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4c70: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
4c80: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 72 65 72  oin) ){.    prer
4c90: 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73 6b  eqAll |= getMask
4ca0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4cb0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
4cc0: 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d  e);.  }.  pTerm-
4cd0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
4ce0: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
4cf0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
4d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
4d10: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
4d20: 2d 3e 6f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  ->operator = 0;.
4d30: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
4d40: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70  pExpr->op) && (p
4d50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
4d60: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
4d70: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
4d80: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
4d90: 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  Left;.    Expr *
4da0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
4db0: 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
4dc0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
4dd0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
4de0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
4df0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
4e00: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
4e10: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
4e20: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4e30: 20 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72   pTerm->operator
4e40: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
4e50: 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20  pExpr->op);.    
4e60: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
4e70: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
4e80: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
4e90: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
4ea0: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
4eb0: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
4ec0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4ed0: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
4ee0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
4ef0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
4f00: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
4f10: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
4f20: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
4f30: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
4f40: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
4f50: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
4f60: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
4f70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4f80: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
4f90: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
4fa0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
4fb0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
4fc0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
4fd0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
4fe0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
4ff0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
5000: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
5010: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
5020: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5030: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
5040: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
5050: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
5060: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
5070: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  e(pDup);.      p
5080: 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65  Left = pDup->pLe
5090: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
50a0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
50b0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
50c0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75    pNew->leftColu
50d0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
50e0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  umn;.      pNew-
50f0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
5100: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20  rereqLeft;.     
5110: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
5120: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
5130: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 65 72 61 74      pNew->operat
5140: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
5150: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
5160: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
5170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
5180: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
5190: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
51a0: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
51b0: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
51c0: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
51d0: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
51e0: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
51f0: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
5200: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20  N implements..  
5210: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
5220: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
5230: 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  EEN ){.    ExprL
5240: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
5250: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
5260: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
5270: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
5280: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
5290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
52a0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
52b0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
52c0: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
52d0: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
52e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
52f0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
5300: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
5310: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
5320: 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71  3Expr(ops[i], sq
5330: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
5340: 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20  pr->pLeft),.    
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5370: 45 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e 61  ExprDup(pList->a
5380: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
5390: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
53a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
53b0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
53c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
53d0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
53e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
53f0: 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  rc, pMaskSet, pW
5400: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
5410: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
5420: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
5430: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
5440: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
5450: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
5460: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
5470: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
5480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
5490: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
54a0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
54b0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
54c0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 74 74  IZATION.  /* Att
54d0: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
54e0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
54f0: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
5500: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
5510: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
5520: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
5530: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  .  Example:.  **
5540: 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  .  **      x = e
5550: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
5560: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
5570: 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  r3.  **.  ** is 
5580: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20  converted into. 
5590: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
55a0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
55b0: 65 78 70 72 33 29 0a 20 20 2a 2f 0a 20 20 65 6c  expr3).  */.  el
55c0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
55d0: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69  ==TK_OR ){.    i
55e0: 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69  nt ok;.    int i
55f0: 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  , j;.    int iCo
5600: 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20  lumn, iCursor;. 
5610: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73     WhereClause s
5620: 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  Or;.    WhereTer
5630: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20  m *pOrTerm;..   
5640: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
5650: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
5660: 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20  NAMIC)==0 );.   
5670: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
5680: 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72  (&sOr, pWC->pPar
5690: 73 65 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  se);.    whereSp
56a0: 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72 2c  lit(&sOr, pExpr,
56b0: 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70   TK_OR);.    exp
56c0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
56d0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72  , pMaskSet, &sOr
56e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
56f0: 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20  Or.nTerm>0 );.  
5700: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b    j = 0;.    do{
5710: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
5720: 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f   sOr.a[j].leftCo
5730: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72  lumn;.      iCur
5740: 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c  sor = sOr.a[j].l
5750: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
5760: 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30   ok = iCursor>=0
5770: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f  ;.      for(i=sO
5780: 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  r.nTerm-1, pOrTe
5790: 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26  rm=sOr.a; i>=0 &
57a0: 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  & ok; i--, pOrTe
57b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
57c0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6f 70 65 72  f( pOrTerm->oper
57d0: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
57e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
57f0: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
5800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5810: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
5820: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
5830: 72 20 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  r && pOrTerm->le
5840: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
5850: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
5860: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d  OrTerm->flags |=
5870: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
5880: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
5890: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
58a0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30   TERM_COPIED)!=0
58b0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
58c0: 20 20 20 20 20 20 20 20 28 28 70 4f 72 54 65 72          ((pOrTer
58d0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
58e0: 56 49 52 54 55 41 4c 29 21 3d 30 20 26 26 0a 20  VIRTUAL)!=0 &&. 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65      (sOr.a[pOrTe
5910: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61  rm->iParent].fla
5920: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
5930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
5940: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
5950: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
5960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5970: 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30            ok = 0
5980: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5990: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
59a0: 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b  !ok && (sOr.a[j+
59b0: 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  +].flags & TERM_
59c0: 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c  COPIED)!=0 && j<
59d0: 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  sOr.nTerm );.   
59e0: 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20   if( ok ){.     
59f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5a00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
5a10: 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20   *pNew, *pDup;. 
5a20: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
5a30: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
5a40: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
5a50: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
5a60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5a70: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
5a80: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
5a90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5aa0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
5ab0: 74 65 33 45 78 70 72 44 75 70 28 70 4f 72 54 65  te3ExprDup(pOrTe
5ac0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
5ad0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  t);.        pLis
5ae0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
5af0: 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c  istAppend(pList,
5b00: 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20 20   pDup, 0);.     
5b10: 20 7d 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20   }.      pDup = 
5b20: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43  sqlite3Expr(TK_C
5b30: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  OLUMN, 0, 0, 0);
5b40: 0a 20 20 20 20 20 20 69 66 28 20 70 44 75 70 20  .      if( pDup 
5b50: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d  ){.        pDup-
5b60: 3e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  >iTable = iCurso
5b70: 72 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d  r;.        pDup-
5b80: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75  >iColumn = iColu
5b90: 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  mn;.      }.    
5ba0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
5bb0: 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70  Expr(TK_IN, pDup
5bc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
5bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
5be0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
5bf0: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
5c00: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
5c10: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
5c20: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
5c30: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
5c40: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
5c50: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
5c60: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
5c70: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
5c80: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
5c90: 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b  lyze(pSrc, pMask
5ca0: 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Set, pWC, idxNew
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
5cc0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
5cd0: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43  rm];.        pWC
5ce0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
5cf0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
5d00: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
5d10: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5d30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5d40: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
5d50: 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f     }.    }.or_no
5d60: 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20  t_possible:.    
5d70: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
5d80: 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  (&sOr);.  }.#end
5d90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5da0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
5db0: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
5dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5dd0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
5de0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
5df0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
5e00: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
5e10: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
5e20: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
5e30: 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72  /.  if( isLikeOr
5e40: 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61 72 73 65  Glob(pWC->pParse
5e50: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50  ->db, pExpr, &nP
5e60: 61 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c  attern, &isCompl
5e70: 65 74 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72  ete) ){.    Expr
5e80: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
5e90: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  ;.    Expr *pStr
5ea0: 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45  1, *pStr2;.    E
5eb0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20  xpr *pNewExpr1, 
5ec0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
5ed0: 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78  int idxNew1, idx
5ee0: 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74  New2;..    pLeft
5ef0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5f00: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
5f10: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
5f20: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
5f30: 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20  pr;.    pStr1 = 
5f40: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 53  sqlite3Expr(TK_S
5f50: 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b  TRING, 0, 0, 0);
5f60: 0a 20 20 20 20 69 66 28 20 70 53 74 72 31 20 29  .    if( pStr1 )
5f70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
5f80: 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74 72 31 2d  okenCopy(&pStr1-
5f90: 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d  >token, &pRight-
5fa0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70  >token);.      p
5fb0: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Str1->token.n = 
5fc0: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 7d 0a  nPattern;.    }.
5fd0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
5fe0: 74 65 33 45 78 70 72 44 75 70 28 70 53 74 72 31  te3ExprDup(pStr1
5ff0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 32  );.    if( pStr2
6000: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
6010: 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64  ( pStr2->token.d
6020: 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b 2b 2a 28  yn );.      ++*(
6030: 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65  u8*)&pStr2->toke
6040: 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b  n.z[nPattern-1];
6050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45  .    }.    pNewE
6060: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  xpr1 = sqlite3Ex
6070: 70 72 28 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65  pr(TK_GE, sqlite
6080: 33 45 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c  3ExprDup(pLeft),
6090: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
60a0: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
60b0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
60c0: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
60d0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
60e0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
60f0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d  Analyze(pSrc, pM
6100: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78  askSet, pWC, idx
6110: 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45  New1);.    pNewE
6120: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  xpr2 = sqlite3Ex
6130: 70 72 28 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65  pr(TK_LT, sqlite
6140: 33 45 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c  3ExprDup(pLeft),
6150: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
6160: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
6170: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
6180: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
6190: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
61a0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
61b0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d  Analyze(pSrc, pM
61c0: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78  askSet, pWC, idx
61d0: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
61e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
61f0: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
6200: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
6210: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
6220: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
6230: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
6240: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
6250: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
6260: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
6270: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
6280: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6290: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
62a0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 0a 2f  IZATION */.}.../
62b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
62c0: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
62d0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
62e0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
62f0: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
6300: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
6310: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
6320: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
6330: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
6340: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
6350: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6360: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
6370: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
6380: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
6390: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
63a0: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
63b0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
63c0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
63d0: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
63e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
63f0: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
6400: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
6410: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
6420: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
6430: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
6440: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
6450: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
6460: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
6470: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
6480: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
6490: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
64a0: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
64b0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
64c0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
64d0: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
64e0: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
64f0: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
6500: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
6510: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
6520: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
6530: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
6540: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
6550: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
6560: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
6570: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
6580: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
6590: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
65a0: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
65b0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
65c0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
65d0: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
65e0: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
65f0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
6600: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
6610: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
6620: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
6630: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
6640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
6650: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
6660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6670: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6680: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
6690: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
66a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
66b0: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
66c0: 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ng */.  Table *p
66d0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
66e0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
66f0: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69  be sorted */.  i
6700: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
6710: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
6720: 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62   number for pTab
6730: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6740: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
6750: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
6760: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
6770: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
6780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
6790: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
67a0: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
67b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67d0: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
67e0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
67f0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6820: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
6830: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
6840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
6850: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
6860: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
6870: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
6880: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68a0: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
68b0: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
68c0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
68d0: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
68e0: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
68f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
6900: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
6910: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
6920: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
6930: 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20  y!=0 );.  nTerm 
6940: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
6950: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  r;.  assert( nTe
6960: 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  rm>0 );..  /* Ma
6970: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
6980: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6990: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
69a0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
69b0: 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ex..  */.  for(i
69c0: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64  =j=0, pTerm=pOrd
69d0: 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d  erBy->a; j<nTerm
69e0: 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && i<pIdx->nCol
69f0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  umn; i++){.    E
6a00: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
6a10: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
6a20: 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ion of the ORDER
6a30: 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20   BY pTerm */.   
6a40: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6a50: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
6a60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  ting sequence of
6a70: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e   pExpr */.    in
6a80: 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  t termSortOrder;
6a90: 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66   /* Sort order f
6aa0: 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
6ab0: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65  .    pExpr = pTe
6ac0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  rm->pExpr;.    i
6ad0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
6ae0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
6af0: 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29  ->iTable!=base )
6b00: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e  {.      /* Can n
6b10: 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
6b20: 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67  sort on anything
6b30: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63   that is not a c
6b40: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20  olumn in the.   
6b50: 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20     ** left-most 
6b60: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f  table of the FRO
6b70: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
6b80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6b90: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  }.    pColl = sq
6ba0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
6bb0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6bc0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
6bd0: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
6be0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28  fltColl;.    if(
6bf0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
6c00: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
6c10: 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 73  i] || .        s
6c20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
6c30: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
6c40: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a  ->azColl[i]) ){.
6c50: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20        /* Term j 
6c60: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
6c70: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
6c80: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f  match column i o
6c90: 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
6ca0: 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f       if( i<nEqCo
6cb0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  l ){.        /* 
6cc0: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
6cd0: 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  mn that is const
6ce0: 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69  rained by == fai
6cf0: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20  ls to match an. 
6d00: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
6d10: 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73  BY term, that is
6d20: 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72   OK.  Just ignor
6d30: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66  e that column of
6d40: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
6d50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
6d60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
6d70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6d80: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
6d90: 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  mn fails to matc
6da0: 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e  h and is not con
6db0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20  strained by ==. 
6dc0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
6dd0: 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
6de0: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
6df0: 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e  R BY constraint.
6e00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6e10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6e20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6e30: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
6e40: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
6e50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
6e60: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c  ->sortOrder==0 |
6e70: 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  | pTerm->sortOrd
6e80: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
6e90: 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74  ert( pIdx->aSort
6ea0: 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c 7c 20 70  Order[i]==0 || p
6eb0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
6ec0: 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  i]==1 );.    ter
6ed0: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64  mSortOrder = pId
6ee0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
6ef0: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
6f00: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
6f10: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
6f20: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
6f30: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
6f40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
6f50: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
6f60: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
6f70: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
6f80: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
6f90: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
6fa0: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
6fb0: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
6fc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6fd0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
6ff0: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
7000: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
7010: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
7020: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  +;.  }..  /* The
7030: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
7040: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  ed for sorting i
7050: 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  f all terms of t
7060: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7070: 73 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f 76 65  se.  ** are cove
7080: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
7090: 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  j>=nTerm ){.    
70a0: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
70b0: 65 72 21 3d 30 3b 0a 20 20 20 20 72 65 74 75 72  er!=0;.    retur
70c0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
70d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 0;.}../*.** Ch
70e0: 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65  eck table to see
70f0: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
7100: 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65   clause in pOrde
7110: 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69 73  rBy can be satis
7120: 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69  fied.** by sorti
7130: 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52  ng in order of R
7140: 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72  OWID.  Return tr
7150: 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74  ue if so and set
7160: 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a   *pbRev to be.**
7170: 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72 73   true for revers
7180: 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73  e ROWID and fals
7190: 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f  e for forward RO
71a0: 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  WID order..*/.st
71b0: 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c  atic int sortabl
71c0: 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20  eByRowid(.  int 
71d0: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
71e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
71f0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74  mber for table t
7200: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
7210: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7220: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
7230: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7240: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7260: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
7270: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
7280: 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20  ){.  Expr *p;.. 
7290: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
72a0: 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
72b0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
72c0: 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72  r>0 );.  p = pOr
72d0: 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
72e0: 72 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  r;.  if( pOrderB
72f0: 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  y->nExpr==1 && p
7300: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
7310: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61  && p->iTable==ba
7320: 73 65 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  se.          && 
7330: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  p->iColumn==-1 )
7340: 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70  {.    *pbRev = p
7350: 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f  OrderBy->a[0].so
7360: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74  rtOrder;.    ret
7370: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7380: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7390: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
73a0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
73b0: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
73c0: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
73d0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
73e0: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
73f0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
7400: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
7410: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
7420: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
7430: 67 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69 74  g operatings wit
7440: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
7450: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
7460: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
7470: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
7480: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
7490: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
74a0: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
74b0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
74c0: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
74d0: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
74e0: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
74f0: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
7500: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
7510: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
7520: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
7530: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
7540: 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
7550: 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73   index for acces
7560: 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
7570: 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  r table.  Return
7580: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
7590: 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67   the index, flag
75a0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
75b0: 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68  how the index sh
75c0: 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68  ould be used, th
75d0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65  e.** number of e
75e0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
75f0: 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f  nts, and the "co
7600: 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64  st" for this ind
7610: 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  ex..**.** The lo
7620: 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20  west cost index 
7630: 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
7640: 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
7650: 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
7660: 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
7670: 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63  I/O need to proc
7680: 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20  ess the request 
7690: 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74  using the select
76a0: 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63  ed index..** Fac
76b0: 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
76c0: 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
76d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
76e0: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
76f0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
7700: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
7710: 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
7720: 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
7730: 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
7740: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
7750: 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
7760: 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
7770: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
7780: 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
7790: 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
77a0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
77b0: 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
77c0: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f  ain table..**.*/
77d0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
77e0: 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  estIndex(.  Pars
77f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7800: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
7810: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7820: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7830: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
7840: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
7850: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
7860: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
7870: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
7880: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
7890: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
78a0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
78b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
78c0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
78d0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
78e0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
78f0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
7900: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
7910: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  by clause */.  I
7920: 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20  ndex **ppIndex, 
7930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7940: 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e  ke *ppIndex poin
7950: 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e  t to the best in
7960: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  dex */.  int *pF
7970: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
7980: 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67       /* Put flag
7990: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69  s describing thi
79a0: 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c  s choice in *pFl
79b0: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ags */.  int *pn
79c0: 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq              
79d0: 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20       /* Put the 
79e0: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
79f0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  IN constraints h
7a00: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ere */.){.  Wher
7a10: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
7a20: 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d  Index *bestIdx =
7a30: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
7a40: 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20  ndex that gives 
7a50: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
7a60: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  */.  double lowe
7a70: 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
7a80: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
7a90: 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f  using bestIdx */
7aa0: 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73  .  int bestFlags
7ab0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
7ac0: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
7ad0: 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20  ed with bestIdx 
7ae0: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71  */.  int bestNEq
7af0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7b00: 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66   /* Best value f
7b10: 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20  or nEq */.  int 
7b20: 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
7b30: 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
7b40: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
7b50: 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
7b60: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
7b70: 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
7b80: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
7b90: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
7ba0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20   */.  int rev;  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
7bd0: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
7be0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
7bf0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
7c00: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
7c10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
7c20: 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  obe */.  int nEq
7c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c50: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
7c60: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75 62  raints */.  doub
7c70: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
7c80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
7c90: 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
7ca0: 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62 65  */..  TRACE(("be
7cb0: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
7cc0: 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20  notReady=%x\n", 
7cd0: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
7ce0: 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20  e, notReady));. 
7cf0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51   lowestCost = SQ
7d00: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
7d10: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
7d20: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
7d30: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
7d40: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
7d50: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
7d60: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
7d70: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
7d80: 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IN, 0);.  if(
7d90: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45 78   pTerm ){.    Ex
7da0: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a  pr *pExpr;.    *
7db0: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
7dc0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48 45   bestFlags = WHE
7dd0: 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
7de0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6f 70 65 72   if( pTerm->oper
7df0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a  ator & WO_EQ ){.
7e00: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d        /* Rowid==
7e10: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 62   is always the b
7e20: 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20  est pick.  Look 
7e30: 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65 63  no further.  Bec
7e40: 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20  ause only.      
7e50: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ** a single row 
7e60: 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75  is generated, ou
7e70: 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20 69  tput is always i
7e80: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
7e90: 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73 20  /.      *pFlags 
7ea0: 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  = WHERE_ROWID_EQ
7eb0: 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b   | WHERE_UNIQUE;
7ec0: 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20 31  .      *pnEq = 1
7ed0: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
7ee0: 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77 69  ... best is rowi
7ef0: 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  d\n"));.      re
7f00: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65  turn 0.0;.    }e
7f10: 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20 3d  lse if( (pExpr =
7f20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e   pTerm->pExpr)->
7f30: 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  pList!=0 ){.    
7f40: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c    /* Rowid IN (L
7f50: 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c  IST): cost is Nl
7f60: 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  ogN where N is t
7f70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73  he number of lis
7f80: 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  t.      ** eleme
7f90: 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c  nts.  */.      l
7fa0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78 70  owestCost = pExp
7fb0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
7fc0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
7fd0: 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65  t *= estLog(lowe
7fe0: 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c  stCost);.    }el
7ff0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77  se{.      /* Row
8000: 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20  id IN (SELECT): 
8010: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
8020: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
8030: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
8040: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
8050: 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  lt of the inner 
8060: 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76 65  select.  We have
8070: 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69 6d   no way to estim
8080: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ate.      ** tha
8090: 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20  t value so make 
80a0: 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f  a wild guess. */
80b0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
80c0: 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a 20  t = 200;.    }. 
80d0: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72     TRACE(("... r
80e0: 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e  owid IN cost: %.
80f0: 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73  9g\n", lowestCos
8100: 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  t));.  }..  /* E
8110: 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74  stimate the cost
8120: 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e   of a table scan
8130: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
8140: 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20  know how many.  
8150: 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 69  ** entries are i
8160: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65  n the table, use
8170: 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20   1 million as a 
8180: 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50  guess..  */.  pP
8190: 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  robe = pSrc->pTa
81a0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 63 6f 73  b->pIndex;.  cos
81b0: 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72  t = pProbe ? pPr
81c0: 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
81d0: 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 54 52   : 1000000;.  TR
81e0: 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20  ACE(("... table 
81f0: 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a 20  scan base cost: 
8200: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
8210: 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  .  flags = WHERE
8220: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20  _ROWID_RANGE;.. 
8230: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
8240: 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72  nstraints on a r
8250: 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69  ange of rowids i
8260: 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  n a table scan..
8270: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66    */.  pTerm = f
8280: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
8290: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
82a0: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
82b0: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
82c0: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
82d0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
82e0: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
82f0: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
8300: 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  LE, 0) ){.      
8310: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  flags |= WHERE_T
8320: 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
8330: 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
8340: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3c  uess that rowid<
8350: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
8360: 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72 6f  two-thirds or ro
8370: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
8380: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
8390: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
83a0: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
83b0: 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66  E, 0) ){.      f
83c0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
83d0: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63  M_LIMIT;.      c
83e0: 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75  ost /= 3;  /* Gu
83f0: 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e 45  ess that rowid>E
8400: 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74  XPR eliminates t
8410: 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77  wo-thirds of row
8420: 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  s */.    }.    T
8430: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
8440: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
8450: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
8460: 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  cost));.  }else{
8470: 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a  .    flags = 0;.
8480: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
8490: 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73   table scan does
84a0: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
84b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
84c0: 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20  , increase.  ** 
84d0: 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67  the cost by Nlog
84e0: 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65  N to cover the e
84f0: 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e  xpense of sortin
8500: 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  g. */.  if( pOrd
8510: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
8520: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
8530: 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
8540: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66  &rev) ){.      f
8550: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
8560: 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
8570: 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69  D_RANGE;.      i
8580: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
8590: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
85a0: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
85b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
85c0: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
85d0: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
85e0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
85f0: 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
8600: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
8610: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ", cost));.    }
8620: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c  .  }.  if( cost<
8630: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
8640: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
8650: 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  ost;.    bestFla
8660: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
8670: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61  .  /* Look at ea
8680: 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ch index..  */. 
8690: 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70   for(; pProbe; p
86a0: 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
86b0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
86e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f  ounter */.    do
86f0: 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65  uble inMultiplie
8700: 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54 52 41 43  r = 1;..    TRAC
8710: 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73  E(("... index %s
8720: 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e  :\n", pProbe->zN
8730: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
8740: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
8750: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
8760: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
8770: 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a   satisfied.    *
8780: 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73  * by x=EXPR cons
8790: 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20  traints or x IN 
87a0: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
87b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c  s..    */.    fl
87c0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
87d0: 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e  (i=0; i<pProbe->
87e0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
87f0: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
8800: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  obe->aiColumn[i]
8810: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
8820: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
8830: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
8840: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50   WO_EQ|WO_IN, pP
8850: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
8860: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
8870: 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  k;.      flags |
8880: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
8890: 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
88a0: 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20 26 20 57  rm->operator & W
88b0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
88c0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
88d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
88e0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
88f0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
8900: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8910: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20  >pSelect!=0 ){. 
8920: 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
8930: 70 6c 69 65 72 20 2a 3d 20 31 30 30 3b 0a 20 20  plier *= 100;.  
8940: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8950: 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20  pExpr->pList!=0 
8960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
8970: 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78  ultiplier *= pEx
8980: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8990: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
89a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
89b0: 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d    cost = pProbe-
89c0: 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69  >aiRowEst[i] * i
89d0: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73  nMultiplier * es
89e0: 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65  tLog(inMultiplie
89f0: 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b  r);.    nEq = i;
8a00: 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
8a10: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
8a20: 65 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  e && (flags & WH
8a30: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
8a40: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45  0.         && nE
8a50: 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
8a60: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  mn ){.      flag
8a70: 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55  s |= WHERE_UNIQU
8a80: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  E;.    }.    TRA
8a90: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d  CE(("...... nEq=
8aa0: 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63  %d inMult=%.9g c
8ab0: 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71  ost=%.9g\n", nEq
8ac0: 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20  , inMultiplier, 
8ad0: 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cost));..    /* 
8ae0: 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63  Look for range c
8af0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
8b00: 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
8b10: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
8b20: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
8b30: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
8b40: 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
8b50: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
8b60: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
8b70: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
8b80: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50  |WO_GT|WO_GE, pP
8b90: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
8ba0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
8bb0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8bc0: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
8bd0: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
8be0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
8bf0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
8c00: 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29  T|WO_LE, pProbe)
8c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
8c20: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
8c30: 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
8c40: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20    cost /= 3;.   
8c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8c60: 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
8c70: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
8c80: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
8c90: 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
8ca0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
8cb0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
8cc0: 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
8cd0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
8ce0: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
8cf0: 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75  ..... range redu
8d00: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
8d10: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
8d20: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8d30: 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69 74  /* Add the addit
8d40: 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f  ional cost of so
8d50: 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69 73  rting if that is
8d60: 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a   a factor..    *
8d70: 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
8d80: 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
8d90: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
8da0: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a  OLUMN_IN)==0 &&.
8db0: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72             isSor
8dc0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
8dd0: 2c 70 50 72 6f 62 65 2c 70 53 72 63 2d 3e 70 54  ,pProbe,pSrc->pT
8de0: 61 62 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79  ab,iCur,pOrderBy
8df0: 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20  ,nEq,&rev) ){.  
8e00: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d        if( flags=
8e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8e20: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  flags = WHERE_CO
8e30: 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
8e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c      }.        fl
8e50: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
8e60: 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66  ERBY;.        if
8e70: 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  ( rev ){.       
8e80: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8e90: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
8ea0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8eb0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  {.        cost +
8ec0: 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
8ed0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  st);.        TRA
8ee0: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65  CE(("...... orde
8ef0: 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f  rby increases co
8f00: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
8f10: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
8f20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
8f30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
8f40: 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74  can get away wit
8f50: 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  h using just the
8f60: 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20   index without. 
8f70: 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69     ** ever readi
8f80: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  ng the table.  I
8f90: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
8fa0: 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74  se, then halve t
8fb0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
8fc0: 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
8fd0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
8fe0: 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55  gs && pSrc->colU
8ff0: 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b  sed < (((Bitmask
9000: 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
9010: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
9020: 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
9030: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
9040: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
9050: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
9060: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
9070: 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt x = pProbe->a
9080: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
9090: 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
90a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26  ){.          m &
90b0: 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29  = ~(((Bitmask)1)
90c0: 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<x);.        }.
90d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
90e0: 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
90f0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
9100: 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
9110: 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20     cost /= 2;.  
9120: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e        TRACE(("..
9130: 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65  .... idx-only re
9140: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
9150: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
9160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9170: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
9180: 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20  ex has achieved 
9190: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
91a0: 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65  so far, then use
91b0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
91c0: 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73  if( cost < lowes
91d0: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62  tCost ){.      b
91e0: 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  estIdx = pProbe;
91f0: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
9200: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
9210: 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d 30  assert( flags!=0
9220: 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c   );.      bestFl
9230: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
9240: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
9250: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9260: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
9270: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
9280: 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49  *ppIndex = bestI
9290: 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62 65  dx;.  TRACE(("be
92a0: 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20  st index is %s, 
92b0: 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73  cost=%.9g, flags
92c0: 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a  =%x, nEq=%d\n",.
92d0: 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20          bestIdx 
92e0: 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65  ? bestIdx->zName
92f0: 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77   : "(none)", low
9300: 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61  estCost, bestFla
9310: 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20  gs, bestNEq));. 
9320: 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46   *pFlags = bestF
9330: 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d 20  lags;.  *pnEq = 
9340: 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72  bestNEq;.  retur
9350: 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a  n lowestCost;.}.
9360: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
9370: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9380: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
9390: 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
93a0: 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
93b0: 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
93c0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
93d0: 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
93e0: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
93f0: 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
9400: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
9410: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
9420: 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
9430: 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
9440: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
9450: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
9460: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
9470: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
9480: 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
9490: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
94a0: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
94b0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
94c0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
94d0: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
94e0: 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
94f0: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
9500: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
9510: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
9520: 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
9530: 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
9540: 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
9550: 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
9560: 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
9570: 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
9580: 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
9590: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
95a0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
95b0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
95c0: 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
95d0: 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
95e0: 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
95f0: 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
9600: 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
9610: 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
9620: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
9630: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
9640: 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
9650: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
9660: 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
9670: 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
9680: 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
9690: 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
96a0: 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
96b0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
96c0: 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
96d0: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
96e0: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
96f0: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
9700: 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
9710: 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
9720: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
9730: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
9740: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
9750: 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
9760: 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
9770: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
9780: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
9790: 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
97a0: 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
97b0: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
97c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
97d0: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
97e0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
97f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
9800: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
9810: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
9820: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
9830: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
9840: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
9850: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
9860: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
9870: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9880: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
9890: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
98a0: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
98b0: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
98c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
98d0: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
98e0: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
98f0: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
9900: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
9910: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
9920: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
9930: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
9940: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
9950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9960: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9970: 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20  e that builds a 
9980: 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64  probe for an ind
9990: 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a  ex.  Details:.**
99a0: 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20  .**    *  Check 
99b0: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
99c0: 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73  entries on the s
99d0: 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a  tack.  If any.**
99e0: 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20         of those 
99f0: 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c  entries are NULL
9a00: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
9a10: 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20  ly to brk,.**   
9a20: 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65      which is the
9a30: 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63   loop exit, sinc
9a40: 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79  e no index entry
9a50: 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20   will match.**  
9a60: 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74       if any part
9a70: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e   of the key is N
9a80: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ULL..**.**    * 
9a90: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f   Construct a pro
9aa0: 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  be entry from th
9ab0: 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e  e top nColumn en
9ac0: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20  tries in.**     
9ad0: 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68    the stack with
9ae0: 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70 72   affinities appr
9af0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
9b00: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
9b10: 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65  c void buildInde
9b20: 78 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c 20  xProbe(Vdbe *v, 
9b30: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e 74  int nColumn, int
9b40: 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49 64   brk, Index *pId
9b50: 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x){.  sqlite3Vdb
9b60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
9b70: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20  Null, -nColumn, 
9b80: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9b90: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
9ba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bb0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
9bc0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  umn, 0);.  sqlit
9bd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9be0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b  P_Goto, 0, brk);
9bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9c00: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
9c10: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
9c20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65  );.  sqlite3Inde
9c30: 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
9c40: 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pIdx);.}.../*.**
9c50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
9c60: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
9c70: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
9c80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
9c90: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
9ca0: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
9cb0: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
9cc0: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
9cd0: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
9ce0: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
9cf0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
9d00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
9d10: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
9d20: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
9d30: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
9d40: 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
9d50: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
9d60: 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
9d70: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
9d80: 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
9d90: 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
9da0: 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
9db0: 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
9dc0: 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
9dd0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9de0: 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
9df0: 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
9e00: 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
9e10: 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
9e20: 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69   void codeEquali
9e30: 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
9e40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
9e50: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
9e60: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
9e70: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
9e80: 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
9e90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9ea0: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
9eb0: 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20 20  nt brk,         
9ec0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
9ed0: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c  to abandon the l
9ee0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  oop */.  WhereLe
9ef0: 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20  vel *pLevel  /* 
9f00: 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68  When level of th
9f10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
9f20: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
9f30: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
9f40: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9f50: 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54  .  if( pX->op!=T
9f60: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
9f70: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  rt( pX->op==TK_E
9f80: 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Q );.    sqlite3
9f90: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9fa0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69   pX->pRight);.#i
9fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9fc0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
9fd0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  se{.    int iTab
9fe0: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a  ;.    int *aIn;.
9ff0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
a000: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
a010: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
a020: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
a030: 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  X);.    iTab = p
a040: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
a050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a060: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
a070: 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64  ab, brk);.    Vd
a080: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
a090: 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e   %.*s", pX->span
a0a0: 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
a0b0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
a0c0: 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n++;.    sqlite3
a0d0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76  ReallocOrFree((v
a0e0: 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e 61  oid**)&pLevel->a
a0f0: 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
a120: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
a130: 30 5d 29 2a 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49  0])*3*pLevel->nI
a140: 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70 4c  n);.    aIn = pL
a150: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20  evel->aInLoop;. 
a160: 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20     if( aIn ){.  
a170: 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65      aIn += pLeve
a180: 6c 2d 3e 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20 20  l->nIn*3 - 3;.  
a190: 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f      aIn[0] = OP_
a1a0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 49 6e 5b  Next;.      aIn[
a1b0: 31 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  1] = iTab;.     
a1c0: 20 61 49 6e 5b 32 5d 20 3d 20 73 71 6c 69 74 65   aIn[2] = sqlite
a1d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a1e0: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
a1f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a200: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20      pLevel->nIn 
a210: 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
a220: 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
a230: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
a240: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
a250: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
a260: 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
a270: 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
a280: 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
a290: 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61  * index.  The va
a2a0: 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  lues for all con
a2b0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66  straints are lef
a2c0: 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  t on the stack..
a2d0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
a2e0: 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
a2f0: 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
a300: 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
a310: 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
a320: 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
a330: 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
a340: 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
a350: 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
a360: 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
a370: 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
a380: 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
a390: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
a3a0: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
a3b0: 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
a3c0: 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
a3d0: 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
a3e0: 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
a3f0: 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
a400: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
a410: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
a420: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
a430: 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
a440: 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
a450: 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
a460: 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
a470: 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65  e left.** on the
a480: 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68   stack - a is th
a490: 65 20 64 65 65 70 65 73 74 20 61 6e 64 20 62 20  e deepest and b 
a4a0: 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a  the shallowest..
a4b0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
a4c0: 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
a4d0: 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
a4e0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
a4f0: 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
a500: 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
a510: 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
a520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
a530: 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
a540: 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
a550: 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
a560: 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
a570: 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
a580: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  l..**.** This ro
a590: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
a5a0: 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
a5b0: 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
a5c0: 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20  and puts.** the 
a5d0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 61 74 20  address of that 
a5e0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70  memory cell in p
a5f0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68  Level->iMem.  Th
a600: 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
a610: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
a620: 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65  e will use pLeve
a630: 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65  l->iMem to store
a640: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
a650: 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
a660: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
a670: 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
a680: 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
a690: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
a6a0: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
a6b0: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
a6c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
a6d0: 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
a6e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a6f0: 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  d codeAllEqualit
a700: 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
a710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a720: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a730: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
a740: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
a750: 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
a760: 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
a770: 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
a780: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a790: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
a7a0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
a7b0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
a7c0: 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
a7d0: 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
a7e0: 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
a7f0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  coded */.  int b
a800: 72 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rk              
a810: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a820: 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f   end the loop */
a830: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
a840: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20  pLevel->nEq;    
a850: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
a860: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
a870: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
a880: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73  e */.  int terms
a890: 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  InMem = 0;      
a8a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
a8b0: 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20   store value in 
a8c0: 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20  mem[] cells */. 
a8d0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a8e0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
a8f0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
a900: 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
a910: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
a920: 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
a930: 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54  el->pIdx;   /* T
a940: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
a950: 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
a960: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
a970: 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
a980: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
a990: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
a9a0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
a9b0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
a9c0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
a9d0: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
a9e0: 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aa10: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r */..  /* Figur
aa20: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
aa30: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
aa40: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
aa50: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
aa60: 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
aa70: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
aa80: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
aa90: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
aaa0: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
aab0: 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
aac0: 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
aad0: 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
aae0: 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
aaf0: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
ab00: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
ab10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
ab20: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
ab30: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
ab40: 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72  N_IN ){.    pPar
ab50: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76  se->nMem += pLev
ab60: 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72  el->nEq;.    ter
ab70: 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d  msInMem = 1;.  }
ab80: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
ab90: 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
aba0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
abb0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
abc0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
abd0: 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
abe0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
abf0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
ac00: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
ac10: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
ac20: 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a  Q|WO_IN, pIdx);.
ac30: 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
ac40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
ac50: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
ac60: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
ac70: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  )==0 );.    code
ac80: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
ac90: 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c  rse, pTerm, brk,
aca0: 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66   pLevel);.    if
acb0: 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a  ( termsInMem ){.
acc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
acd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ace0: 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
acf0: 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20  Mem+j+1, 1);.   
ad00: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
ad10: 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a   j==nEq );..  /*
ad20: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   Make sure all t
ad30: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  he constraint va
ad40: 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20  lues are on the 
ad50: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
ad60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d  .  */.  if( term
ad70: 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  sInMem ){.    fo
ad80: 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
ad90: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
ada0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
adb0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
adc0: 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a  ->iMem+j+1, 0);.
add0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
ade0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
adf0: 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
ae00: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
ae10: 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
ae20: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
ae30: 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
ae40: 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
ae50: 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
ae60: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
ae70: 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
ae80: 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
ae90: 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
aea0: 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
aeb0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
aec0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
aed0: 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
aee0: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
aef0: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
af00: 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
af10: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
af20: 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
af30: 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
af40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
af50: 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
af60: 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
af70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
af80: 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  E_TEST */..../*.
af90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
afa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
afb0: 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
afc0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
afd0: 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
afe0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
aff0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
b000: 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
b010: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
b020: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
b030: 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
b040: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
b050: 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
b060: 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
b070: 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
b080: 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
b090: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
b0a0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
b0b0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
b0c0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
b0d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
b0e0: 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
b0f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
b100: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
b110: 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
b120: 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
b130: 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
b140: 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
b150: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
b160: 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
b170: 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
b180: 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
b190: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
b1a0: 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
b1b0: 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
b1c0: 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
b1d0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
b1e0: 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
b1f0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
b200: 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
b210: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
b220: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
b230: 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
b240: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
b250: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
b260: 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
b270: 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
b280: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
b290: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
b2a0: 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
b2b0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
b2c0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
b2d0: 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
b2e0: 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
b2f0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
b300: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
b310: 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
b320: 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
b330: 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
b340: 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
b350: 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
b360: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
b370: 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
b3a0: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
b3b0: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
b3e0: 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
b3f0: 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
b400: 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
b410: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
b420: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
b430: 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
b440: 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
b450: 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
b460: 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
b470: 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
b480: 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
b490: 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
b4a0: 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
b4b0: 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
b4c0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
b4d0: 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
b4e0: 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
b4f0: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
b500: 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
b510: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b520: 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
b530: 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
b540: 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
b550: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
b560: 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
b570: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
b580: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
b590: 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
b5a0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
b5b0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
b5c0: 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
b5d0: 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
b5e0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
b5f0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
b600: 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
b610: 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
b620: 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
b630: 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
b640: 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
b650: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
b660: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
b670: 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
b680: 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
b690: 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
b6a0: 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
b6b0: 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
b6c0: 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
b6d0: 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
b6e0: 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
b6f0: 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
b700: 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
b710: 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
b720: 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
b730: 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
b740: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
b750: 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
b760: 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
b770: 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
b780: 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
b790: 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
b7a0: 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
b7b0: 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
b7c0: 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
b7d0: 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
b7e0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
b7f0: 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
b800: 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
b810: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
b820: 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
b830: 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
b840: 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
b850: 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
b860: 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
b870: 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
b880: 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
b890: 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
b8a0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
b8b0: 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
b8c0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
b8d0: 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
b8e0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
b8f0: 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
b900: 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
b910: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b920: 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
b930: 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
b940: 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
b950: 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
b960: 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
b970: 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
b980: 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
b990: 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
b9a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
b9b0: 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
b9c0: 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
b9d0: 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
b9e0: 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
b9f0: 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
ba00: 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
ba10: 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
ba20: 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
ba30: 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
ba40: 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
ba50: 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
ba60: 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
ba70: 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
ba80: 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
ba90: 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
baa0: 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
bab0: 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
bac0: 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
bad0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bae0: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
baf0: 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
bb00: 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
bb10: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
bb20: 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
bb30: 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
bb40: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
bb50: 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
bb60: 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
bb70: 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
bb80: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
bb90: 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
bba0: 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
bbb0: 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
bbc0: 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
bbd0: 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
bbe0: 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
bbf0: 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
bc00: 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
bc10: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
bc20: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
bc30: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
bc40: 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
bc50: 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
bc60: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
bc70: 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
bc80: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
bc90: 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
bca0: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
bcb0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
bcc0: 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
bcd0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
bce0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
bcf0: 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
bd00: 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
bd10: 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
bd20: 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
bd30: 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
bd40: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
bd50: 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
bd60: 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
bd70: 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
bd80: 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
bd90: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
bda0: 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
bdb0: 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
bdc0: 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
bdd0: 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
bde0: 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
bdf0: 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
be00: 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
be10: 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
be20: 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
be30: 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
be40: 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
be50: 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
be60: 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
be70: 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
be80: 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
be90: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
bea0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
beb0: 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
bec0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bed0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
bee0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
bef0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
bf00: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
bf10: 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
bf20: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
bf30: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
bf40: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
bf50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
bf60: 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
bf70: 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
bf80: 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
bf90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bfc0: 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
bfd0: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
bfe0: 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
bff0: 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
c000: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
c010: 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
c020: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
c030: 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
c040: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
c050: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
c060: 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
c070: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
c080: 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
c090: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
c0a0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
c0b0: 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
c0c0: 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
c0d0: 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
c0e0: 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
c0f0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
c100: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
c110: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
c120: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
c130: 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
c140: 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
c150: 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
c160: 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
c170: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
c180: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
c190: 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
c1a0: 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
c1b0: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
c1c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
c1d0: 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
c1e0: 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
c1f0: 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
c200: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
c210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c220: 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
c230: 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
c240: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
c250: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
c260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
c270: 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
c280: 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
c290: 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c2b0: 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
c2c0: 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
c2d0: 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  flags */..  /* T
c2e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
c2f0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
c300: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
c310: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
c320: 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
c330: 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
c340: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
c350: 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
c360: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c370: 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
c380: 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
c390: 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
c3a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
c3b0: 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
c3c0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
c3d0: 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
c3e0: 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
c3f0: 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
c400: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
c410: 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
c420: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
c430: 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b  nitMaskSet(&mask
c440: 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
c450: 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50 61  useInit(&wc, pPa
c460: 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  rse);.  whereSpl
c470: 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20  it(&wc, pWhere, 
c480: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
c490: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
c4a0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
c4b0: 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
c4c0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
c4d0: 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
c4e0: 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  urn value..  */.
c4f0: 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
c500: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c510: 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
c520: 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
c530: 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
c540: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 68  .  if( sqlite3Th
c550: 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c  readData()->mall
c560: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c570: 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
c580: 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  oMem;.  }.  pWIn
c590: 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
c5a0: 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
c5b0: 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
c5c0: 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
c5d0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
c5e0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
c5f0: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
c600: 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
c610: 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
c620: 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
c630: 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
c640: 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
c650: 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
c660: 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
c670: 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
c680: 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62   pWhere && (pTab
c690: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c  List->nSrc==0 ||
c6a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
c6b0: 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29 29 20  nstant(pWhere)) 
c6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
c6d0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
c6e0: 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
c6f0: 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20  ->iBreak, 1);.  
c700: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
c710: 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
c720: 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
c730: 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65  pressions.  Note
c740: 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a   that exprAnalyz
c750: 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61  e() might.  ** a
c760: 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  dd new virtual t
c770: 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  erms onto the en
c780: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
c790: 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
c7a0: 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61  t.  ** want to a
c7b0: 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72  nalyze these vir
c7c0: 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73  tual terms, so s
c7d0: 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61  tart analyzing a
c7e0: 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61  t the end.  ** a
c7f0: 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20  nd work forward 
c800: 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
c810: 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
c820: 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
c830: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  sed..  */.  for(
c840: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
c850: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
c860: 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73   createMask(&mas
c870: 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
c880: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
c890: 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65   }.  exprAnalyze
c8a0: 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 6d  All(pTabList, &m
c8b0: 61 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20 20  askSet, &wc);.  
c8c0: 69 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  if( sqlite3Threa
c8d0: 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46  dData()->mallocF
c8e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
c8f0: 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
c900: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
c910: 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
c920: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
c930: 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
c940: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
c950: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
c960: 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
c970: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
c980: 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
c990: 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
c9a0: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
c9b0: 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
c9c0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
c9d0: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
c9e0: 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
c9f0: 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
ca00: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
ca10: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
ca20: 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
ca30: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
ca40: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
ca50: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
ca60: 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
ca70: 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
ca80: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
ca90: 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
caa0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
cab0: 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
cac0: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
cad0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
cae0: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
caf0: 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
cb00: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
cb10: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
cb20: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
cb30: 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
cb40: 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
cb50: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
cb60: 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
cb70: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
cb80: 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
cb90: 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
cba0: 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
cbb0: 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
cbc0: 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
cbd0: 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2a 2a 2a  0;.  TRACE(("***
cbe0: 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
cbf0: 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72   ***\n"));.  for
cc00: 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76  (i=iFrom=0, pLev
cc10: 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
cc20: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
cc30: 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
cc40: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f  /* Index for FRO
cc70: 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49  M table at pTabI
cc80: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66  tem */.    int f
cc90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
cca0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
ccb0: 61 73 73 73 6f 63 69 61 74 65 64 20 77 69 74 68  asssociated with
ccc0: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
ccd0: 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
cce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ccf0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
cd00: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
cd10: 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20    double cost;  
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd30: 20 54 68 65 20 63 6f 73 74 20 66 6f 72 20 70 49   The cost for pI
cd40: 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  dx */.    int j;
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
cd70: 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74  ping over FROM t
cd80: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64  ables */.    Ind
cd90: 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
cda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cdb0: 62 65 73 74 20 69 6e 64 65 78 20 73 65 65 6e 20  best index seen 
cdc0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e  so far */.    in
cdd0: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
cde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
cdf0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
ce00: 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  th pBest */.    
ce10: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
ce30: 45 71 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Eq associated wi
ce40: 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  th pBest */.    
ce50: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
ce60: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  t;          /* C
ce70: 6f 73 74 20 6f 66 20 74 68 65 20 70 42 65 73 74  ost of the pBest
ce80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
ce90: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cea0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
ceb0: 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74   of j */.    Bit
cec0: 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20  mask m;         
ced0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
cee0: 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20  ask value for j 
cef0: 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 0a 20 20 20  or bestJ */..   
cf00: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51   lowestCost = SQ
cf10: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20  LITE_BIG_DBL;.  
cf20: 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70    for(j=iFrom, p
cf30: 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73  TabItem=&pTabLis
cf40: 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c  t->a[j]; j<pTabL
cf50: 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20  ist->nSrc; j++, 
cf60: 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pTabItem++){.   
cf70: 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26     m = getMask(&
cf80: 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  maskSet, pTabIte
cf90: 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
cfa0: 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
cfb0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
cfc0: 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
cfd0: 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
cfe0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
cff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 73 74      }.      cost
d000: 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50 61   = bestIndex(pPa
d010: 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74  rse, &wc, pTabIt
d020: 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  em, notReady,.  
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70       (i==0 && pp
d050: 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72  OrderBy) ? *ppOr
d060: 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20  derBy : 0,.     
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c    &pIdx, &flags,
d090: 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66   &nEq);.      if
d0a0: 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73  ( cost<lowestCos
d0b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 6f 77  t ){.        low
d0c0: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
d0d0: 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
d0e0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65  pIdx;.        be
d0f0: 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
d100: 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71  .        bestNEq
d110: 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20   = nEq;.        
d120: 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
d130: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
d140: 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  abItem->jointype
d150: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
d160: 52 4f 53 53 29 29 21 3d 30 0a 20 20 20 20 20 20  ROSS))!=0.      
d170: 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28 70     || (j>0 && (p
d180: 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e  TabItem[-1].join
d190: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
d1a0: 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20  JT_CROSS))!=0). 
d1b0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
d1c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d1d0: 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
d1e0: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63  "*** Optimizer c
d1f0: 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66  hoose table %d f
d200: 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62  or loop %d\n", b
d210: 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20  estJ,.          
d220: 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
d230: 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65  a));.    if( (be
d240: 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  stFlags & WHERE_
d250: 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20  ORDERBY)!=0 ){. 
d260: 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
d270: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
d280: 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46  ndFlags &= bestF
d290: 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
d2a0: 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  ->flags = bestFl
d2b0: 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
d2c0: 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20  >pIdx = pBest;. 
d2d0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d     pLevel->nEq =
d2e0: 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c   bestNEq;.    pL
d2f0: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20  evel->aInLoop = 
d300: 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  0;.    pLevel->n
d310: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  In = 0;.    if( 
d320: 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70  pBest ){.      p
d330: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
d340: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d350: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d360: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
d370: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
d380: 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
d390: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
d3a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
d3b0: 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
d3c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
d3d0: 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54  = bestJ;.  }.  T
d3e0: 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
d3f0: 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
d400: 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  *\n"));..  /* If
d410: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
d420: 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
d430: 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
d440: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d450: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
d460: 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
d470: 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
d480: 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
d490: 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
d4a0: 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
d4b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
d4c0: 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
d4d0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
d4e0: 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
d4f0: 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
d500: 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
d510: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
d520: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
d530: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
d540: 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
d550: 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
d560: 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65  er Goto */.  pLe
d570: 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
d580: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
d590: 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
d5a0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
d5b0: 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
d5c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d5d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
d5e0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64   open */.    Ind
d5f0: 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a  ex *pIx;      /*
d600: 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   Index used to a
d610: 63 63 65 73 73 20 70 54 61 62 20 28 69 66 20 61  ccess pTab (if a
d620: 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ny) */.    int i
d630: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
d640: 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
d650: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
d660: 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e/index */.    i
d670: 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
d680: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23  vel->iIdxCur;..#
d690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d6a0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
d6b0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
d6c0: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63  in==2 ){.      c
d6d0: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20  har *zMsg;.     
d6e0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d6f0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
d700: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
d710: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20  l->iFrom];.     
d720: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
d730: 50 72 69 6e 74 66 28 22 54 41 42 4c 45 20 25 73  Printf("TABLE %s
d740: 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
d750: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
d760: 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
d770: 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
d780: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 41  te3MPrintf("%z A
d790: 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
d7a0: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
d7b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
d7c0: 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
d7d0: 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
d7e0: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
d7f0: 4d 50 72 69 6e 74 66 28 22 25 7a 20 57 49 54 48  MPrintf("%z WITH
d800: 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d 73 67   INDEX %s", zMsg
d810: 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pIx->zName);. 
d820: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d830: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
d840: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
d850: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
d860: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
d870: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
d880: 74 66 28 22 25 7a 20 55 53 49 4e 47 20 50 52 49  tf("%z USING PRI
d890: 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
d8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d8c0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c  , OP_Explain, i,
d8d0: 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
d8e0: 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43  zMsg, P3_DYNAMIC
d8f0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
d900: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
d910: 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54  XPLAIN */.    pT
d920: 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
d930: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
d940: 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
d950: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
d960: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
d970: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
d980: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
d990: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
d9a0: 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e  if( pTab->isTran
d9b0: 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70  sient || pTab->p
d9c0: 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
d9d0: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  e;.    if( (pLev
d9e0: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
d9f0: 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
da00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
da10: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
da20: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
da30: 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  or, iDb, pTab, O
da40: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
da50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
da60: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
da70: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
da80: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
da90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
daa0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
dab0: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
dac0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
dad0: 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
dae0: 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
daf0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
db00: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
db10: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
db20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db30: 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
db40: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
db70: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
db80: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
db90: 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78  ((v, "# %s", pIx
dba0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
dbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
dbc0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
dbd0: 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  iIdxCur, pIx->tn
dbe0: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
dbf0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
dc00: 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
dc10: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
dc20: 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
dc30: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
dc40: 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  IDX_ONLY)!=0 ){.
dc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
dc70: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78  NumColumns, iIdx
dc80: 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d  Cur, pIx->nColum
dc90: 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n+1);.    }.    
dca0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
dcb0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
dcc0: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
dcd0: 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
dce0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
dcf0: 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  r(v);..  /* Gene
dd00: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
dd10: 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
dd20: 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
dd30: 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
dd40: 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
dd50: 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
dd60: 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
dd70: 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
dd80: 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
dd90: 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
dda0: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
ddb0: 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
ddc0: 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
ddd0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
dde0: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
ddf0: 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72   j;.    int iCur
de00: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
de10: 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44  rsor;  /* The VD
de20: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
de30: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49  e table */.    I
de40: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
de50: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
de60: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
de70: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
de80: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
de90: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
dea0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
deb0: 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
dec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ded0: 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
dee0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74   only */.    int
def0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
df00: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
df10: 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
df20: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a  verse order */..
df30: 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
df40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
df50: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
df60: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
df70: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49  >iCursor;.    pI
df80: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
df90: 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
dfa0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
dfb0: 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c  ;.    bRev = (pL
dfc0: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
dfd0: 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
dfe0: 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  .    omitTable =
dff0: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
e000: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
e010: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  )!=0;..    /* Cr
e020: 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
e030: 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
e040: 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
e050: 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66  uctions.    ** f
e060: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
e070: 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72  oop.  Jump to br
e080: 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
e090: 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a  f a loop..    **
e0a0: 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
e0b0: 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
e0c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
e0d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20  ation of the.   
e0e0: 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f   ** loop..    */
e0f0: 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65  .    brk = pLeve
e100: 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  l->brk = sqlite3
e110: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e120: 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65  ;.    cont = pLe
e130: 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69  vel->cont = sqli
e140: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e150: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  (v);..    /* If 
e160: 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
e170: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
e180: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
e190: 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a  locate and.    *
e1a0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
e1b0: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
e1c0: 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
e1d0: 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
e1e0: 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20  y.    ** row of 
e1f0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
e200: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20  f the join..    
e210: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
e220: 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
e230: 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e  TabItem[-1].join
e240: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
e250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
e260: 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  !pParse->nMem ) 
e270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
e280: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
e290: 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65  eftJoin = pParse
e2a0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
e2b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e2c0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
e2d0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
e2e0: 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oin);.      Vdbe
e2f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
e300: 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
e310: 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
e320: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
e330: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e340: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
e350: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
e360: 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
e370: 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
e380: 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
e390: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
e3a0: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
e3b0: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
e3c0: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
e3d0: 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
e3e0: 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
e3f0: 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
e400: 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
e410: 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
e420: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
e430: 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
e440: 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  /.      pTerm = 
e450: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
e460: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
e470: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
e480: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e490: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
e4a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
e4b0: 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e4d0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
e4e0: 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
e4f0: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
e500: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  0 );.      codeE
e510: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
e520: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
e530: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  pLevel);.      s
e540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e550: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e560: 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   1, brk);.      
e570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e580: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
e590: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
e5a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e5b0: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
e5c0: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
e5d0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
e5e0: 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
e5f0: 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
e600: 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  D_RANGE ){.     
e610: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
e620: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
e630: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
e640: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
e650: 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
e660: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
e670: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
e680: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
e690: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
e6a0: 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
e6b0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
e6c0: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
e6d0: 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
e6e0: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
e6f0: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
e700: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
e710: 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
e720: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
e730: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
e740: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
e750: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
e760: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e770: 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  pStart;.        
e780: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
e790: 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54         pEnd = pT
e7a0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
e7b0: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
e7c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
e7d0: 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
e7e0: 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
e7f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e800: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
e810: 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
e820: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
e830: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
e840: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e850: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
e860: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e870: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e880: 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70  ForceInt, pX->op
e890: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LE || pX->o
e8a0: 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a  p==TK_GT, brk);.
e8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e8c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
e8d0: 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f   ? OP_MoveLt : O
e8e0: 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20  P_MoveGe, iCur, 
e8f0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64  brk);.        Vd
e900: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
e910: 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69  k"));.        di
e920: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
e930: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
e940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e960: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
e970: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
e980: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
e990: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
e9a0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
e9b0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
e9c0: 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
e9d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e9e0: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
e9f0: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
ea00: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
ea10: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
ea20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ea30: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
ea40: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
ea50: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
ea60: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
ea70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea80: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
ea90: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
eaa0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
eab0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
eac0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
ead0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
eae0: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
eaf0: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
eb00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb10: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
eb20: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
eb30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
eb40: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
eb50: 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
eb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
eb70: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
eb80: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
eb90: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
eba0: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
ebb0: 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
ebc0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
ebd0: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
ebe0: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
ebf0: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
ec00: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
ec10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
ec30: 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  id, iCur, 0);.  
ec40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ec60: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
ec70: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
ec80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec90: 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49  (v, testOp, SQLI
eca0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
ecb0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
ecc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
ecd0: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
ece0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
ecf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
ed00: 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  3: The WHERE cla
ed10: 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72 65  use term that re
ed20: 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67 68  fers to the righ
ed30: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
ed40: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f          column o
ed50: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
ed60: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46  n inequality.  F
ed70: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20  or example, if. 
ed80: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
ed90: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20  the index is on 
eda0: 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20  (x,y,z) and the 
edb0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
edc0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
edd0: 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d          form "x=
ede0: 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e  5 AND y<10" then
edf0: 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75 73   this case is us
ee00: 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20  ed.  Only the.  
ee10: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72      **         r
ee20: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
ee30: 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
ee40: 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
ee50: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20   must.      **  
ee60: 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
ee70: 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
ee80: 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a  rators..      **
ee90: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
eea0: 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
eeb0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
eec0: 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
eed0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a   clause.      **
eee0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
eef0: 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
ef00: 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
ef10: 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
ef20: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
ef30: 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
ef40: 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
ef50: 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
ef60: 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   BY..      */.  
ef70: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
ef80: 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
ef90: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20  Level->nEq;.    
efa0: 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20    int topEq=0;  
efb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
efc0: 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20   top limit uses 
efd0: 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72  ==. False is str
efe0: 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20  ictly < */.     
eff0: 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20   int btmEq=0;   
f000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f010: 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d  btm limit uses =
f020: 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72 69  =. False if stri
f030: 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20  ctly > */.      
f040: 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70  int topOp, btmOp
f050: 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73  ;   /* Operators
f060: 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64   for the top and
f070: 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62   bottom search b
f080: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounds */.      i
f090: 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20  nt testOp;.     
f0a0: 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20   int nNotNull;  
f0b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f0c0: 66 20 72 6f 77 73 20 6f 66 20 69 6e 64 65 78 20  f rows of index 
f0d0: 74 68 61 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e  that must be non
f0e0: 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69  -NULL */.      i
f0f0: 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70  nt topLimit = (p
f100: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
f110: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21  HERE_TOP_LIMIT)!
f120: 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74  =0;.      int bt
f130: 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c  mLimit = (pLevel
f140: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
f150: 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a  BTM_LIMIT)!=0;..
f160: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
f170: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f180: 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
f190: 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
f1a0: 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20   or IN.      ** 
f1b0: 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61  and level the va
f1c0: 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
f1d0: 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  rms on the stack
f1e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f1f0: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
f200: 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c  Terms(pParse, pL
f210: 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65  evel, &wc, notRe
f220: 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20  ady, brk);..    
f230: 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74    /* Duplicate t
f240: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
f250: 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65 20   values because 
f260: 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65  they will all be
f270: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74  .      ** used t
f280: 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61  wice: once to ma
f290: 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ke the terminati
f2a0: 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20  on key and once 
f2b0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  to make the.    
f2c0: 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a    ** start key..
f2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
f2e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
f2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
f300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f310: 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20   OP_Dup, nEq-1, 
f320: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
f330: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
f340: 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e   what comparison
f350: 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73   operators to us
f360: 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f  e for top and bo
f370: 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73  ttom .      ** s
f380: 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f  earch bounds. Fo
f390: 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  r an ascending i
f3a0: 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d  ndex, the bottom
f3b0: 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72   bound is a > or
f3c0: 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65   >=.      ** ope
f3d0: 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f  rator and the to
f3e0: 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f  p bound is a < o
f3f0: 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20  r <= operator.  
f400: 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67  For a descending
f410: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  .      ** index 
f420: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
f430: 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20  e reversed..    
f440: 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e    */.      nNotN
f450: 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c  ull = nEq + topL
f460: 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  imit;.      if( 
f470: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
f480: 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
f490: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  _ASC ){.        
f4a0: 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f  topOp = WO_LT|WO
f4b0: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d  _LE;.        btm
f4c0: 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  Op = WO_GT|WO_GE
f4d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f4e0: 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57         topOp = W
f4f0: 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20  O_GT|WO_GE;.    
f500: 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c      btmOp = WO_L
f510: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
f520: 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69   SWAP(int, topLi
f530: 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a  mit, btmLimit);.
f540: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f550: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
f560: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20  ermination key. 
f570: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
f580: 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20   value that.    
f590: 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68    ** will end th
f5a0: 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
f5b0: 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69   is no terminati
f5c0: 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a  on key if there.
f5d0: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20        ** are no 
f5e0: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
f5f0: 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65  nd no "X<..." te
f600: 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm..      **.   
f610: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
f620: 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d  4: On a reverse-
f630: 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20  order scan, the 
f640: 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69  so-called "termi
f650: 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a  nation".      **
f660: 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65   key computed he
f670: 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  re really ends u
f680: 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72  p being the star
f690: 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
f6a0: 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d        if( topLim
f6b0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
f6c0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
f6d0: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
f6e0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
f6f0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
f700: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
f710: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f  , notReady, topO
f720: 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  p, pIdx);.      
f730: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
f740: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58  =0 );.        pX
f750: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
f760: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f770: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
f780: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
f790: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f7a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f7b0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
f7c0: 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20          topEq = 
f7d0: 70 54 65 72 6d 2d 3e 6f 70 65 72 61 74 6f 72 20  pTerm->operator 
f7e0: 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
f7f0: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
f800: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
f810: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  rm);.        tes
f820: 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a  tOp = OP_IdxGE;.
f830: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f840: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45       testOp = nE
f850: 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a  q>0 ? OP_IdxGE :
f860: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
f870: 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20    topEq = 1;.   
f880: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
f890: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
f8a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
f8b0: 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69  ol = nEq + topLi
f8c0: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  mit;.        pLe
f8d0: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
f8e0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
f8f0: 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
f900: 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b  obe(v, nCol, brk
f910: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
f920: 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
f930: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
f940: 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c  topEq ? OP_MoveL
f950: 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  e : OP_MoveLt;. 
f960: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f970: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
f980: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
f990: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f9a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f9b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f9c0: 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
f9d0: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
f9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f9f0: 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fa10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73  eAddOp(v, OP_Las
fa20: 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  t, iIdxCur, brk)
fa30: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
fa40: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
fa50: 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69   start key.  Thi
fa60: 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61  s is the key tha
fa70: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f  t defines the lo
fa80: 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75  wer.      ** bou
fa90: 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  nd on the search
faa0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73  .  There is no s
fab0: 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72  tart key if ther
fac0: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a  e are no.      *
fad0: 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  * equality terms
fae0: 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73   and if there is
faf0: 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d   no "X>..." term
fb00: 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74  .  In.      ** t
fb10: 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61  hat case, genera
fb20: 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e  te a "Rewind" in
fb30: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61  struction in pla
fb40: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
fb50: 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61  ** start key sea
fb60: 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rch..      **.  
fb70: 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
fb80: 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20  04: In the case 
fb90: 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  of a reverse-ord
fba0: 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73  er search, the s
fbb0: 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a  o-called.      *
fbc0: 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65  * "start" key re
fbd0: 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69  ally ends up bei
fbe0: 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74  ng used as the t
fbf0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a  ermination key..
fc00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
fc10: 66 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20  f( btmLimit ){. 
fc20: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
fc30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
fc40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
fc50: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  j];.        pTer
fc60: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
fc70: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
fc80: 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78  ady, btmOp, pIdx
fc90: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
fca0: 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
fcb0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
fcc0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
fcd0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
fce0: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
fcf0: 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
fd00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fd10: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
fd20: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
fd30: 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d 2d 3e   btmEq = pTerm->
fd40: 6f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  operator & (WO_L
fd50: 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20  E|WO_GE);.      
fd60: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
fd70: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
fd80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd90: 20 20 20 62 74 6d 45 71 20 3d 20 31 3b 0a 20 20     btmEq = 1;.  
fda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fdb0: 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69  nEq>0 || btmLimi
fdc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
fdd0: 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74   nCol = nEq + bt
fde0: 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  mLimit;.        
fdf0: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
fe00: 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c 20 70 49  v, nCol, brk, pI
fe10: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
fe20: 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
fe30: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
fe40: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
fe50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fe60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe70: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
fe80: 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
fe90: 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
fea0: 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20  = OP_IdxLT;.    
feb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fec0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74       int op = bt
fed0: 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20  mEq ? OP_MoveGe 
fee0: 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  : OP_MoveGt;.   
fef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ff00: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
ff10: 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
ff20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
ff30: 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
ff40: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
ff50: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
ff60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ff70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ff80: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49  v, OP_Rewind, iI
ff90: 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
ffa0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
ffb0: 65 6e 65 72 61 74 65 20 74 68 65 20 74 68 65 20  enerate the the 
ffc0: 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  top of the loop.
ffd0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20    If there is a 
ffe0: 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20  termination.    
fff0: 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65    ** key we have
10000 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61   to test for tha
10010 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20  t key and abort 
10020 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
10030 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e  e.      ** loop.
10040 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10050 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
10060 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  );.      if( tes
10080 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
10090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
100a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
100b0 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
100c0 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
100d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
100e0 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49  Op(v, testOp, iI
100f0 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
10100 20 20 20 20 20 69 66 28 20 28 74 6f 70 45 71 20       if( (topEq 
10110 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62  && !bRev) || (!b
10120 74 6d 45 71 20 26 26 20 62 52 65 76 29 20 29 7b  tmEq && bRev) ){
10130 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10140 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
10150 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54  , -1, "+", P3_ST
10160 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
10170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10190 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49  v, OP_RowKey, iI
101a0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
101b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
101c0 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c  p(v, OP_IdxIsNul
101d0 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c 20 63 6f 6e  l, nNotNull, con
101e0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f  t);.      if( !o
101f0 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
10200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10210 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f  ddOp(v, OP_IdxRo
10220 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29  wid, iIdxCur, 0)
10230 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10240 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10250 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
10260 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10270 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
10280 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
10290 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
102a0 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  e loop..      */
102b0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
102c0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
102d0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
102e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
102f0 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
10300 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
10310 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
10320 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
10330 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
10340 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  Q ){.      /* Ca
10350 73 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20  se 4:  There is 
10360 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c  an index and all
10370 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
10380 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
10390 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
103a0 20 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69    refer to the i
103b0 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22  ndex using the "
103c0 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
103d0 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ators..      */.
103e0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
103f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
10400 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20   pLevel->nEq;.. 
10410 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10420 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
10430 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
10440 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
10450 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61  or IN.      ** a
10460 6e 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c  nd leave the val
10470 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
10480 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ms on the stack.
10490 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
104a0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
104b0 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
104c0 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
104d0 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20  dy, brk);..     
104e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
104f0 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77  ingle key that w
10500 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62  ill be used to b
10510 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65  oth start and te
10520 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a  rminate.      **
10530 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
10540 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64    */.      build
10550 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45  IndexProbe(v, nE
10560 71 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  q, brk, pIdx);. 
10570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10580 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
10590 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
105a0 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  em, 0);..      /
105b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
105c0 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74  (1) to move to t
105d0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
105e0 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
105f0 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a   table..      **
10600 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63   Then generate c
10610 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d  ode (2) that jum
10620 70 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65  ps to "brk" afte
10630 72 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  r the cursor is 
10640 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  past.      ** th
10650 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20  e last matching 
10660 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
10670 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20  able.  The code 
10680 28 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a  (1) is executed.
10690 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f        ** once to
106a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
106b0 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65  search, the code
106c0 20 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64   (2) is executed
106d0 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20   before each.   
106e0 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20     ** iteration 
106f0 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73  of the scan to s
10700 65 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68  ee if the scan h
10710 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a  as finished. */.
10720 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
10730 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61  {.        /* Sca
10740 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
10750 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  er */.        sq
10760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10770 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64  , OP_MoveLe, iId
10780 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
10790 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
107a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
107b0 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
107c0 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
107d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
107e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
107f0 4c 54 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  LT, iIdxCur, brk
10800 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
10810 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
10820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10830 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e        /* Scan in
10840 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64   the forward ord
10850 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  er */.        sq
10860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10870 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64  , OP_MoveGe, iId
10880 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  xCur, brk);.    
10890 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
108a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
108b0 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
108c0 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
108d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
108e0 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45  eOp3(v, OP_IdxGE
108f0 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20  , iIdxCur, brk, 
10900 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  "+", P3_STATIC);
10910 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
10920 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
10930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10940 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10950 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78   OP_RowKey, iIdx
10960 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Cur, 0);.      s
10970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10980 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c  v, OP_IdxIsNull,
10990 20 6e 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20   nEq, cont);.   
109a0 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
109b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
109c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
109d0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
109e0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
109f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a00 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
10a10 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
10a20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
10a30 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
10a40 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
10a50 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
10a60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  lse{.      /* Ca
10a70 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
10a80 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
10a90 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
10aa0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a  omplete.      **
10ab0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
10ac0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
10ad0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
10ae0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
10af0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
10b00 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
10b10 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   );.      pLevel
10b20 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
10b30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
10b40 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
10b50 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
10b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10b80 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d  Cur, brk);.    }
10b90 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
10ba0 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
10bb0 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20  et, iCur);..    
10bc0 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
10bd0 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
10be0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
10bf0 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
10c00 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  y.    ** compute
10c10 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
10c20 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
10c30 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
10c40 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d  r(pTerm=wc.a, j=
10c50 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  wc.nTerm; j>0; j
10c60 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
10c70 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
10c80 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
10c90 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
10ca0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
10cb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10cc0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
10cd0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
10ce0 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ady)!=0 ) contin
10cf0 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
10d00 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
10d10 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
10d20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
10d30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
10d40 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
10d50 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
10d60 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
10d70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
10d80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
10d90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10da0 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b  e, pE, cont, 1);
10db0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  .      pTerm->fl
10dc0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
10dd0 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  D;.    }..    /*
10de0 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
10df0 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
10e00 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
10e10 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
10e20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c  that.    ** at l
10e30 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
10e40 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
10e50 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
10e60 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
10e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
10e80 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
10e90 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
10ea0 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  top = sqlite3Vdb
10eb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
10ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ed0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10ee0 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  mInt, 1, pLevel-
10ef0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
10f00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
10f10 76 2c 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46  v, "# record LEF
10f20 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
10f30 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77       for(pTerm=w
10f40 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e  c.a, j=0; j<wc.n
10f50 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
10f60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10f70 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
10f80 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
10f90 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
10fa0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
10fb0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
10fc0 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
10fd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10fe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10ff0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
11000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11010 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
11020 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
11030 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  cont, 1);.      
11040 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
11050 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
11060 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11080 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
11090 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
110a0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
110b0 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
110c0 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
110d0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
110e0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
110f0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
11100 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
11110 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
11120 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
11130 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
11140 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
11150 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
11160 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
11170 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
11180 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
11190 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
111a0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
111b0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
111c0 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
111d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
111e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
111f0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
11200 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
11210 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
11220 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62  ->a[i];.    pTab
11230 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
11240 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
11250 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62  m];.    z = pTab
11260 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
11270 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
11280 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
11290 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20  >zName;.    n = 
112a0 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69  strlen(z);.    i
112b0 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
112c0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
112d0 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
112e0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
112f0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
11300 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
11310 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
11320 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
11330 50 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20  Plan], "{}");.  
11340 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
11350 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
11360 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26          strcpy(&
11370 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11380 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a  an[nQPlan], z);.
11390 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
113a0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
113b0 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
113c0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
113d0 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
113e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
113f0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
11400 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
11410 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
11420 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
11430 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
11440 61 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20  an], "* ");.    
11450 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20    nQPlan += 2;. 
11460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
11470 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a  vel->pIdx==0 ){.
11480 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
11490 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
114a0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29  [nQPlan], "{} ")
114b0 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
114c0 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 3;.    }else{.
114d0 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
114e0 28 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a  (pLevel->pIdx->z
114f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
11500 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
11510 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
11520 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20  _plan)-2 ){.    
11530 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
11540 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
11550 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e  QPlan], pLevel->
11560 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
11570 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
11580 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  n;.        sqlit
11590 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
115a0 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
115b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
115c0 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
115d0 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
115e0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
115f0 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
11600 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
11610 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
11620 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
11630 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
11640 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
11650 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
11660 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
11670 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
11680 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
11690 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
116a0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
116b0 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
116c0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
116d0 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
116e0 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
116f0 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d  ..  */.  pWInfo-
11700 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e  >iContinue = con
11710 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  t;.  whereClause
11720 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65  Clear(&wc);.  re
11730 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
11740 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11750 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
11760 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a  whereBeginNoMem:
11770 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
11780 65 61 72 28 26 77 63 29 3b 0a 20 20 73 71 6c 69  ear(&wc);.  sqli
11790 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a  teFree(pWInfo);.
117a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
117b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
117c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
117d0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
117e0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
117f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11800 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
11810 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
11820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
11830 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
11840 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  *pWInfo){.  Vdbe
11850 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50   *v = pWInfo->pP
11860 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
11870 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
11880 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72  el *pLevel;.  Sr
11890 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
118a0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
118b0 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  st;..  /* Genera
118c0 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
118d0 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
118e0 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d   for(i=pTabList-
118f0 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  >nSrc-1; i>=0; i
11900 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
11910 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
11920 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11930 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11940 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20  pLevel->cont);. 
11950 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
11960 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
11970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11980 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  ddOp(v, pLevel->
11990 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
119a0 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
119b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
119c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
119d0 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a  , pLevel->brk);.
119e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
119f0 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nIn ){.      int
11a00 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *a;.      int j
11a10 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
11a20 65 76 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c  evel->nIn, a=&pL
11a30 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a  evel->aInLoop[j*
11a40 33 2d 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  3-3]; j>0; j--, 
11a50 61 2d 3d 33 29 7b 0a 20 20 20 20 20 20 20 20 73  a-=3){.        s
11a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11a70 76 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  v, a[0], a[1], a
11a80 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
11a90 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11aa0 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b  Level->aInLoop);
11ab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11ac0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
11ad0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
11ae0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
11af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b00 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
11b10 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
11b20 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  oin, 0);.      s
11b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11b40 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
11b50 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
11b60 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  ursor, 0);.     
11b70 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
11b80 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
11b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ba0 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  dOp(v, OP_NullRo
11bb0 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
11bc0 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
11bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11be0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
11bf0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f  o, 0, pLevel->to
11c00 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
11c10 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11c20 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
11c30 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
11c40 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
11c50 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
11c60 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
11c70 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
11c80 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
11c90 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11ca0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
11cb0 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
11cc0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
11cd0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
11ce0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
11cf0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
11d00 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
11d10 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
11d20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
11d30 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
11d40 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
11d50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
11d60 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
11d70 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
11d80 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
11d90 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
11da0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
11db0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
11dc0 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e  if( pTab->isTran
11dd0 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70  sient || pTab->p
11de0 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
11df0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  e;.    if( (pLev
11e00 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
11e10 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
11e20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
11e30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11e40 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
11e50 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  iCursor, 0);.   
11e60 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
11e70 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20  l->pIdx!=0 ){.  
11e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11e90 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
11ea0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
11eb0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
11ec0 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72    /* Make cursor
11ed0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 66   substitutions f
11ee0 6f 72 20 63 61 73 65 73 20 77 68 65 72 65 20 77  or cases where w
11ef0 65 20 77 61 6e 74 20 74 6f 20 75 73 65 0a 20 20  e want to use.  
11f00 20 20 2a 2a 20 6a 75 73 74 20 74 68 65 20 69 6e    ** just the in
11f10 64 65 78 20 61 6e 64 20 6e 65 76 65 72 20 72 65  dex and never re
11f20 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
11f30 65 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  e..    ** .    *
11f40 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
11f50 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
11f60 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
11f70 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
11f80 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
11f90 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
11fa0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
11fb0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
11fc0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
11fd0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
11fe0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
11ff0 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
12000 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
12010 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
12020 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
12030 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
12040 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
12050 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
12060 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
12070 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
12080 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
12090 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
120a0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c 61 73 74    int i, j, last
120b0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
120c0 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  pOp;.      Index
120d0 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
120e0 3e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73  >pIdx;..      as
120f0 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
12100 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
12110 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
12120 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
12130 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
12140 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12150 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
12160 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(i=pWInfo->iTop
12170 3b 20 69 3c 6c 61 73 74 3b 20 69 2b 2b 2c 20 70  ; i<last; i++, p
12180 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
12190 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
121a0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
121b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
121c0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
121d0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
121e0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
121f0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
12200 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  r;.          for
12210 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
12220 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
12230 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
12240 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
12250 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
12260 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
12270 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
12280 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
122a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
122b0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
122c0 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
122d0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
122e0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
122f0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
12300 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
12310 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
12320 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
12330 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c  >opcode==OP_Null
12340 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
12350 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
12360 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
12370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12380 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
12390 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 73  cleanup.  */.  s
123a0 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f  qliteFree(pWInfo
123b0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.