System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7805a1b9c2e70cb32d9c9ba33b22f67dc8eed632:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 32 20   where.c,v 1.22 
0340: 32 30 30 36 2f 30 34 2f 31 31 20 31 38 3a 30 36  2006/04/11 18:06
0350: 3a 35 38 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :58 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 20 46 6f  X).#endif../* Fo
0520: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a  rward reference.
0530: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0540: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 57 68  t WhereClause Wh
0550: 65 72 65 43 6c 61 75 73 65 3b 0a 0a 2f 2a 0a 2a  ereClause;../*.*
0560: 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65  * The query gene
0570: 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72  rator uses an ar
0580: 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ray of instances
0590: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
05a0: 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74  re to.** help it
05b0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62   analyze the sub
05c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
05d0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
05e0: 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20    Each WHERE.** 
05f0: 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73  clause subexpres
0600: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
0610: 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  d from the other
0620: 73 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  s by an AND oper
0630: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ator..**.** All 
0640: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
0650: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
0660: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
0670: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
0680: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0690: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
06a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
06b0: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
06c0: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
06d0: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
06e0: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
06f0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
0700: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0710: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
0720: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
0730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
0740: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
0750: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
0760: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
0770: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
0780: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  and WhereTerm.le
0790: 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20  ftColumn record 
07a0: 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  the.** cursor nu
07b0: 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  mber and column 
07c0: 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57  number for X.  W
07d0: 68 65 72 65 54 65 72 6d 2e 6f 70 65 72 61 74 6f  hereTerm.operato
07e0: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
07f0: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0800: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0810: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0820: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0830: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0840: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0850: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
0860: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
0870: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
0880: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
0890: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08a0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08b0: 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 52  s..**.** prereqR
08c0: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
08d0: 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f  ll record sets o
08e0: 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  f cursor numbers
08f0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f  ,.** but they do
0900: 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   so indirectly. 
0910: 20 41 20 73 69 6e 67 6c 65 20 45 78 70 72 4d 61   A single ExprMa
0920: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20  skSet structure 
0930: 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75  translates.** cu
0940: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  rsor number into
0950: 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72   bits and the tr
0960: 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20  anslated bit is 
0970: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72  stored in the pr
0980: 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20  ereq.** fields. 
0990: 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e   The translation
09a0: 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65   is used in orde
09b0: 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68  r to maximize th
09c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62  e number of.** b
09d0: 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69  its that will fi
09e0: 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20  t in a Bitmask. 
09f0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
0a00: 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62   numbers might b
0a10: 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20  e.** spread out 
0a20: 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67  over the non-neg
0a30: 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20  ative integers. 
0a40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
0a50: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
0a60: 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20  ers might be 3, 
0a70: 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33  8, 9, 10, 20, 23
0a80: 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54  , 41, and 45.  T
0a90: 68 65 20 45 78 70 72 4d 61 73 6b 53 65 74 0a 2a  he ExprMaskSet.*
0aa0: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0ab0: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0ac0: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0ad0: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0ae0: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0af0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0b00: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0b10: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0b20: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0b30: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0b40: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0b50: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0b60: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0b70: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0b80: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0b90: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0ba0: 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  7..*/.typedef st
0bb0: 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 57  ruct WhereTerm W
0bc0: 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74  hereTerm;.struct
0bd0: 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45   WhereTerm {.  E
0be0: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
0bf0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
0c00: 72 20 74 6f 20 74 68 65 20 73 75 62 65 78 70 72  r to the subexpr
0c10: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ession */.  i16 
0c20: 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
0c30: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70      /* Disable p
0c40: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77  WC->a[iParent] w
0c50: 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69  hen this term di
0c60: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 31 36 20  sabled */.  i16 
0c70: 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20  leftCursor;     
0c80: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0c90: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
0ca0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
0cb0: 20 20 69 31 36 20 6c 65 66 74 43 6f 6c 75 6d 6e    i16 leftColumn
0cc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
0cd0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
0ce0: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0cf0: 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65 4f 70 65  >" */.  u16 eOpe
0d00: 72 61 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  rator;          
0d10: 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65  /* A WO_xx value
0d20: 20 64 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e   describing <op>
0d30: 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 3b 20   */.  u8 flags; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 42 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   Bit flags.  See
0d60: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
0d70: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
0d80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0d90: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
0da0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
0db0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
0dc0: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
0dd0: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
0de0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
0df0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0e00: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
0e10: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
0e20: 20 75 73 65 64 20 62 79 20 70 52 69 67 68 74 20   used by pRight 
0e30: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0e40: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  reqAll;      /* 
0e50: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
0e60: 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
0e70: 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  p */.};../*.** A
0e80: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
0e90: 20 57 68 65 72 65 54 65 72 6d 2e 66 6c 61 67 73   WhereTerm.flags
0ea0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d  .*/.#define TERM
0eb0: 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31  _DYNAMIC    0x01
0ec0: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61     /* Need to ca
0ed0: 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  ll sqlite3ExprDe
0ee0: 6c 65 74 65 28 70 45 78 70 72 29 20 2a 2f 0a 23  lete(pExpr) */.#
0ef0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54  define TERM_VIRT
0f00: 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a  UAL    0x02   /*
0f10: 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70   Added by the op
0f20: 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74  timizer.  Do not
0f30: 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   code */.#define
0f40: 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20   TERM_CODED     
0f50: 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20   0x04   /* This 
0f60: 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20  term is already 
0f70: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
0f80: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20   TERM_COPIED    
0f90: 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61   0x08   /* Has a
0fa0: 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e   child */.#defin
0fb0: 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20  e TERM_OR_OK    
0fc0: 20 20 30 78 31 30 20 20 20 2f 2a 20 55 73 65 64    0x10   /* Used
0fd0: 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73   during OR-claus
0fe0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
0ff0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1000: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1010: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f  ing structure ho
1020: 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  lds all informat
1030: 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57  ion about a.** W
1040: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f  HERE clause.  Mo
1050: 73 74 6c 79 20 74 68 69 73 20 69 73 20 61 20 63  stly this is a c
1060: 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65  ontainer for one
1070: 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65   or more WhereTe
1080: 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  rms..*/.struct W
1090: 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50  hereClause {.  P
10a0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10c0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
10d0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10f0: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a  umber of terms *
1100: 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20  /.  int nSlot;  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1120: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1130: 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68  s in a[] */.  Wh
1140: 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20  ereTerm *a;     
1150: 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61         /* Each a
1160: 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74  [] describes a t
1170: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1180: 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20 57 68 65   cluase */.  Whe
1190: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31  reTerm aStatic[1
11a0: 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0];   /* Initial
11b0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
11c0: 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  r a[] */.};../*.
11d0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
11e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
11f0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
1200: 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69  track of a mappi
1210: 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44  ng.** between VD
1220: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1230: 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68  s and bits of th
1240: 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68  e bitmasks in Wh
1250: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
1260: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
1270: 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c  umbers are small
1280: 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69   integers contai
1290: 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69  ned in .** SrcLi
12a0: 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20  st_item.iCursor 
12b0: 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20  and Expr.iTable 
12c0: 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79  fields.  For any
12d0: 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a   given WHERE .**
12e0: 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72   clause, the cur
12f0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
1300: 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  t not begin with
1310: 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68   0 and they migh
1320: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70  t.** contain gap
1330: 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69  s in the numberi
1340: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75  ng sequence.  Bu
1350: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
1360: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65  e maximum.** use
1370: 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20   of the bits in 
1380: 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54  our bitmasks.  T
1390: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70 72  his structure pr
13a0: 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67  ovides a mapping
13b0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61  .** from the spa
13c0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
13d0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
13e0: 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65 67  ive integers beg
13f0: 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30  inning.** with 0
1400: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78 70 72 4d  ..**.** If ExprM
1410: 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20  askSet.ix[A]==B 
1420: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68  it means that Th
1430: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1440: 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  Bitmask.** corre
1450: 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73  sponds VDBE curs
1460: 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68  or number B.  Th
1470: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1480: 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e  bitmask is 1<<A.
1490: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
14a0: 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45  le, if the WHERE
14b0: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
14c0: 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44  on used these VD
14d0: 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20  BE.** cursors:  
14e0: 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c  4, 5, 8, 29, 57,
14f0: 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20   73.  Then the  
1500: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
1510: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1520: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1530: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1540: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1550: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1560: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1570: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1580: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1590: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
15a0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
15b0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
15c0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
15d0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
15e0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
15f0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1600: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1610: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1620: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1630: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1640: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1650: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1660: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1670: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1680: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1690: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
16a0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
16b0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 74 79 70 65  no gaps..*/.type
16c0: 64 65 66 20 73 74 72 75 63 74 20 45 78 70 72 4d  def struct ExprM
16d0: 61 73 6b 53 65 74 20 45 78 70 72 4d 61 73 6b 53  askSet ExprMaskS
16e0: 65 74 3b 0a 73 74 72 75 63 74 20 45 78 70 72 4d  et;.struct ExprM
16f0: 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e  askSet {.  int n
1700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1720: 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63  er of assigned c
1730: 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a  ursor values */.
1740: 20 20 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66 28    int ix[sizeof(
1750: 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20 20  Bitmask)*8];    
1760: 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e  /* Cursor assign
1770: 65 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a  ed to each bit *
1780: 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74  /.};.../*.** Bit
1790: 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70  masks for the op
17a0: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64  erators that ind
17b0: 69 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  ices are able to
17c0: 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a   exploit.  An.**
17d0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
17e0: 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75  on of these valu
17f0: 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  es can be used w
1800: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  hen searching fo
1810: 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68  r.** terms in th
1820: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a  e where clause..
1830: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e  */.#define WO_IN
1840: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57       1.#define W
1850: 4f 5f 45 51 20 20 20 20 20 32 0a 23 64 65 66 69  O_EQ     2.#defi
1860: 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f  ne WO_LT     (WO
1870: 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45  _EQ<<(TK_LT-TK_E
1880: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c  Q)).#define WO_L
1890: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
18a0: 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_LE-TK_EQ)).#de
18b0: 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28  fine WO_GT     (
18c0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b  WO_EQ<<(TK_GT-TK
18d0: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
18e0: 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _GE     (WO_EQ<<
18f0: 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 0a  (TK_GE-TK_EQ))..
1900: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
1910: 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1920: 79 20 62 65 73 74 49 6e 64 65 78 28 29 0a 2a 2f  y bestIndex().*/
1930: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1940: 4f 57 49 44 5f 45 51 20 20 20 20 20 20 20 30 78  OWID_EQ       0x
1950: 30 30 30 31 20 20 20 2f 2a 20 72 6f 77 69 64 3d  0001   /* rowid=
1960: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
1970: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1980: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  e WHERE_ROWID_RA
1990: 4e 47 45 20 20 20 20 30 78 30 30 30 32 20 20 20  NGE    0x0002   
19a0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
19b0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
19c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
19d0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 20 20  _COLUMN_EQ      
19e0: 30 78 30 30 31 30 20 20 20 2f 2a 20 78 3d 45 58  0x0010   /* x=EX
19f0: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
1a00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1a10: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 20  E_COLUMN_RANGE  
1a20: 20 30 78 30 30 32 30 20 20 20 2f 2a 20 78 3c 45   0x0020   /* x<E
1a30: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
1a40: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1a50: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
1a60: 20 20 30 78 30 30 34 30 20 20 20 2f 2a 20 78 20    0x0040   /* x 
1a70: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1a80: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
1a90: 4d 49 54 20 20 20 20 20 20 30 78 30 31 30 30 20  MIT      0x0100 
1aa0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
1ab0: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
1ac0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
1ad0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
1ae0: 20 20 30 78 30 32 30 30 20 20 20 2f 2a 20 78 3e    0x0200   /* x>
1af0: 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20  EXPR or x>=EXPR 
1b00: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
1b10: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f  efine WHERE_IDX_
1b20: 4f 4e 4c 59 20 20 20 20 20 20 20 30 78 30 38 30  ONLY       0x080
1b30: 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  0   /* Use index
1b40: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
1b50: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
1b60: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
1b70: 20 20 20 30 78 31 30 30 30 20 20 20 2f 2a 20 4f     0x1000   /* O
1b80: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
1b90: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
1ba0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1bb0: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
1bc0: 20 20 20 30 78 32 30 30 30 20 20 20 2f 2a 20 53     0x2000   /* S
1bd0: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1be0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1bf0: 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20  WHERE_UNIQUE    
1c00: 20 20 20 20 20 30 78 34 30 30 30 20 20 20 2f 2a       0x4000   /*
1c10: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
1c20: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
1c30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1c40: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
1c50: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
1c60: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1c70: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
1c80: 75 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c 61  useInit(WhereCla
1c90: 75 73 65 20 2a 70 57 43 2c 20 50 61 72 73 65 20  use *pWC, Parse 
1ca0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 57 43 2d  *pParse){.  pWC-
1cb0: 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
1cc0: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d  ;.  pWC->nTerm =
1cd0: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74   0;.  pWC->nSlot
1ce0: 20 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57 43   = ARRAYSIZE(pWC
1cf0: 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57  ->aStatic);.  pW
1d00: 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61  C->a = pWC->aSta
1d10: 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  tic;.}../*.** De
1d20: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
1d30: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1d40: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
1d50: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
1d60: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
1d70: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
1d80: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
1d90: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
1da0: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
1db0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
1dc0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
1dd0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
1de0: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
1df0: 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d  *a;.  for(i=pWC-
1e00: 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d  >nTerm-1, a=pWC-
1e10: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61  >a; i>=0; i--, a
1e20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
1e30: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  flags & TERM_DYN
1e40: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
1e50: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1e60: 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  a->pExpr);.    }
1e70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
1e80: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
1e90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1ea0: 65 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  e(pWC->a);.  }.}
1eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
1ec0: 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  w entries to the
1ed0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1ee0: 75 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61 73  ucture.  Increas
1ef0: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  e the allocated.
1f00: 2a 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63 65  ** space as nece
1f10: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  ssary..**.** WAR
1f20: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
1f30: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
1f40: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
1f50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
1f60: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
1f70: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
1f80: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
1f90: 65 20 69 6e 76 61 6c 69 64 65 64 20 61 66 74 65  e invalided afte
1fa0: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
1fb0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
1fc0: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
1fd0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
1fe0: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
1ff0: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
2000: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
2010: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
2020: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
2030: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
2040: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 57 68  int flags){.  Wh
2050: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
2060: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28    int idx;.  if(
2070: 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43   pWC->nTerm>=pWC
2080: 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57  ->nSlot ){.    W
2090: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d  hereTerm *pOld =
20a0: 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57 43   pWC->a;.    pWC
20b0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
20c0: 6f 63 28 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  oc( sizeof(pWC->
20d0: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
20e0: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
20f0: 43 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  C->a==0 ) return
2100: 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   0;.    memcpy(p
2110: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
2120: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
2130: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
2140: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
2150: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
2160: 73 71 6c 69 74 65 46 72 65 65 28 70 4f 6c 64 29  sqliteFree(pOld)
2170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
2180: 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d  >nSlot *= 2;.  }
2190: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
21a0: 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54  >a[idx = pWC->nT
21b0: 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65  erm];.  pWC->nTe
21c0: 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  rm++;.  pTerm->p
21d0: 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72  Expr = p;.  pTer
21e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  m->flags = flags
21f0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
2200: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
2210: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
2220: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
2230: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2240: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
2250: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
2260: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
2270: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
2280: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
2290: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
22a0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
22b0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
22c0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
22d0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
22e0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
22f0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2300: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
2310: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
2320: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
2330: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
2340: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
2350: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
2360: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
2370: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
2380: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
2390: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
23a0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
23b0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
23c0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
23d0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
23e0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
23f0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
2400: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
2410: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
2420: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
2430: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
2440: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
2450: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
2460: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
2470: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
2480: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
2490: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
24a0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
24b0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
24c0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
24d0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
24e0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
24f0: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 61 72   array.  This ar
2500: 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65  ray grows as nee
2510: 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a  ded to contain.*
2520: 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * all terms of t
2530: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2550: 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65  whereSplit(Where
2560: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
2570: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70  r *pExpr, int op
2580: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
2590: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
25a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20  ( pExpr->op!=op 
25b0: 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
25c0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45  seInsert(pWC, pE
25d0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 0);.  }else
25e0: 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  {.    whereSplit
25f0: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65  (pWC, pExpr->pLe
2600: 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65  ft, op);.    whe
2610: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
2620: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b  pr->pRight, op);
2630: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
2640: 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72  itialize an expr
2650: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a  ession mask set.
2660: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
2670: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
2680: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
2690: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
26a0: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
26b0: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
26c0: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
26d0: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
26e0: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
26f0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
2700: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
2710: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
2720: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
2730: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
2740: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
2750: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
2760: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
2770: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
2780: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
2790: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (Bitmask)1)<<i;.
27a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
27c0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
27d0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
27e0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
27f0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
2800: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2810: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2820: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2830: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2840: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2850: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2860: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2870: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2880: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2890: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
28a0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
28b0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
28c0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
28d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
28e0: 74 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53  teMask(ExprMaskS
28f0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e  et *pMaskSet, in
2900: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73  t iCursor){.  as
2910: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
2920: 6e 20 3c 20 41 52 52 41 59 53 49 5a 45 28 70 4d  n < ARRAYSIZE(pM
2930: 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20  askSet->ix) );. 
2940: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d   pMaskSet->ix[pM
2950: 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69  askSet->n++] = i
2960: 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cursor;.}../*.**
2970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
2980: 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79  lks (recursively
2990: 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  ) an expression 
29a0: 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74  tree and generat
29b0: 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20  es.** a bitmask 
29c0: 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68  indicating which
29d0: 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64   tables are used
29e0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
29f0: 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a  ion.** tree..**.
2a00: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
2a10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
2a20: 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e  work, the callin
2a30: 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
2a40: 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73  have.** previous
2a50: 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74  ly invoked sqlit
2a60: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
2a70: 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72  es() on the expr
2a80: 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20  ession.  See.** 
2a90: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
2aa0: 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
2ab0: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
2ac0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2ad0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70  * The sqlite3Exp
2ae0: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2af0: 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66  routines looks f
2b00: 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  or column names 
2b10: 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69  and.** sets thei
2b20: 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f  r opcodes to TK_
2b30: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72  COLUMN and their
2b40: 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65   Expr.iTable fie
2b50: 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44  lds to.** the VD
2b60: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2b70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
2b80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2b90: 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e  t has to.** tran
2ba0: 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  slate the cursor
2bb0: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69   numbers into bi
2bc0: 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64  tmask values and
2bd0: 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62   OR all.** the b
2be0: 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72  itmasks together
2bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
2c00: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
2c10: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
2c20: 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  et*, ExprList*);
2c30: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2c40: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
2c50: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
2c60: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
2c70: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2c80: 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d  TableUsage(ExprM
2c90: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2ca0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
2cb0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2cc0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2cd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
2ce0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
2cf0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2d00: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2d10: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2d20: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2d30: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2d40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2d50: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
2d60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2d70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2d80: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73  p->pLeft);.  mas
2d90: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2db0: 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d  , p->pList);.  m
2dc0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
2dd0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2de0: 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74  kSet, p->pSelect
2df0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  );.  return mask
2e00: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2e10: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2e20: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2e30: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2e40: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2e50: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
2e60: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
2e70: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2e80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
2e90: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2ea0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2eb0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2ec0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2ed0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2ef0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2f00: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
2f10: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
2f20: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2f30: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2f40: 74 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69 66  tmask mask;.  if
2f50: 28 20 70 53 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  ( pS==0 ){.    m
2f60: 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ask = 0;.  }else
2f70: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 65 78 70  {.    mask = exp
2f80: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
2f90: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
2fa0: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
2fb0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2fc0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2fd0: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
2fe0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
2ff0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
3000: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
3010: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
3020: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
3030: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
3040: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
3050: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
3060: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
3070: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d 0a  ->pHaving);.  }.
3080: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
3090: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
30a0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
30b0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
30c0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
30d0: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
30e0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
30f0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
3100: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
3110: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
3120: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
3130: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
3140: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73  , and "IN"..*/.s
3150: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
3160: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
3170: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
3180: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
3190: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
31a0: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
31b0: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
31c0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
31d0: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
31e0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
31f0: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
3200: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
3210: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
3220: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 3b  Q && op<=TK_GE);
3230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
3240: 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79  wo objects of ty
3250: 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  pe T..*/.#define
3260: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
3270: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
3280: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
3290: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 69  mute a comparisi
32a0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
32b0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
32c0: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
32d0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
32e0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
32f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
3300: 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20 2a  prCommute(Expr *
3310: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
3320: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
3330: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
3340: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
3350: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
3360: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
3370: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
3380: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50 28  >pColl);.  SWAP(
3390: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
33a0: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
33b0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
33c0: 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op>=TK_GT ){.   
33d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
33e0: 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61  TK_GT+2 );.    a
33f0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
3400: 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _LE+2 );.    ass
3410: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
3420: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3430: 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20  TK_GT<TK_LE );. 
3440: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3450: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70  ->op>=TK_GT && p
3460: 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20  Expr->op<=TK_GE 
3470: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
3480: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54   = ((pExpr->op-T
3490: 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a  K_GT)^2)+TK_GT;.
34a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
34b0: 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78  nslate from TK_x
34c0: 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f  x operator to WO
34d0: 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a  _xx bitmask..*/.
34e0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72 61  static int opera
34f0: 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b  torMask(int op){
3500: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73 65  .  int c;.  asse
3510: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  rt( allowedOp(op
3520: 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  ) );.  if( op==T
3530: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20  K_IN ){.    c = 
3540: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_IN;.  }else{.
3550: 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28      c = WO_EQ<<(
3560: 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20  op-TK_EQ);.  }. 
3570: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3580: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
3590: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
35a0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
35b0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
35c0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
35d0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
35e0: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
35f0: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
3600: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
3610: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
3620: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
3630: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
3640: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
3650: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3660: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
3670: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
3680: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
3690: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
36a0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
36b0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
36c0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
36d0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
36e0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
36f0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
3700: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
3710: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
3720: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
3730: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3740: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
3750: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
3760: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
3770: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
3780: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
3790: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37a0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
37b0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
37c0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
37d0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
37e0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
37f0: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
3800: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3810: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
3820: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3830: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
3840: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
3850: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
3860: 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20 20  */.  u16 op,    
3870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3880: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
3890: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
38a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
38b0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
38c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
38d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
38e0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
38f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
3900: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
3910: 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70 54   int k;.  for(pT
3920: 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
3930: 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d  C->nTerm; k; k--
3940: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
3950: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
3960: 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20  ursor==iCur.    
3970: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
3980: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
3990: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
39a0: 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f  && pTerm->leftCo
39b0: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
39c0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
39d0: 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  eOperator & op)!
39e0: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
39f0: 69 66 28 20 69 43 75 72 3e 3d 30 20 26 26 20 70  if( iCur>=0 && p
3a00: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 45  Idx ){.        E
3a10: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
3a20: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3a30: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
3a40: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
3a50: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
3a60: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
3a70: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3a80: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
3a90: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
3aa0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
3ab0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
3ac0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
3ad0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
3ae0: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
3af0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3b00: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
3b10: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
3b20: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
3b30: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
3b40: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
3b50: 20 20 20 20 69 66 28 20 70 58 2d 3e 70 52 69 67      if( pX->pRig
3b60: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ht ){.          
3b70: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3b80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
3b90: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
3ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3bb0: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
3bc0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3bd0: 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
3be0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
3bf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3c10: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
3c20: 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d  nColumn && pIdx-
3c30: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
3c40: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  olumn; j++){}.  
3c50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
3c60: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
3c80: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3c90: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  l->zName, pIdx->
3ca0: 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e  azColl[j]) ) con
3cb0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
3cd0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
3ce0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
3cf0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3d00: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3d10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
3d20: 69 73 74 2a 2c 20 45 78 70 72 4d 61 73 6b 53 65  ist*, ExprMaskSe
3d30: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
3d40: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
3d50: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
3d60: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
3d70: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
3d80: 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69   .**.**.*/.stati
3d90: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
3da0: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
3db0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
3dc0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
3dd0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
3de0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
3df0: 20 20 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b     /* table mask
3e00: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
3e10: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
3e20: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
3e30: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
3e40: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
3e50: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
3e60: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
3e70: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
3e80: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 4d  yze(pTabList, pM
3e90: 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 29 3b  askSet, pWC, i);
3ea0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
3eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
3ec0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
3ed0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
3ee0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
3ef0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
3f00: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
3f10: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
3f20: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
3f30: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
3f40: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
3f50: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
3f60: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
3f70: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
3f80: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
3f90: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
3fa0: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
3fb0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
3fc0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
3fd0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
3fe0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
3ff0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
4000: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
4010: 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b(.  sqlite3 *db
4020: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ,      /* The da
4030: 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78 70 72  tabase */.  Expr
4040: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
4050: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
4060: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ssion */.  int *
4070: 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20  pnPattern,   /* 
4080: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
4090: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
40a0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e  aracters */.  in
40b0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 20  t *pisComplete  
40c0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
40d0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
40e0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
40f0: 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  aracter */.){.  
4100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4110: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
4120: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c 69 73  pLeft;.  ExprLis
4130: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
4140: 63 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 6e 6f  c, cnt;.  int no
4150: 43 61 73 65 3b 0a 20 20 63 68 61 72 20 77 63 5b  Case;.  char wc[
4160: 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  3];.  CollSeq *p
4170: 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21 73 71  Coll;..  if( !sq
4180: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
4190: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 26  ion(db, pExpr, &
41a0: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
41b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
41c0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
41d0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68  ->pList;.  pRigh
41e0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t = pList->a[0].
41f0: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69  pExpr;.  if( pRi
4200: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49  ght->op!=TK_STRI
4210: 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  NG ){.    return
4220: 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20   0;.  }.  pLeft 
4230: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
4240: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
4250: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4260: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4270: 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 70  .  }.  pColl = p
4280: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 69  Left->pColl;.  i
4290: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
42a0: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
42b0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20  DfltColl;.  }.  
42c0: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65  if( (pColl->type
42d0: 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  !=SQLITE_COLL_BI
42e0: 4e 41 52 59 20 7c 7c 20 6e 6f 43 61 73 65 29 20  NARY || noCase) 
42f0: 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d  &&.      (pColl-
4300: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
4310: 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 6e 6f  LL_NOCASE || !no
4320: 43 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Case) ){.    ret
4330: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
4340: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
4350: 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d 20 28  pRight);.  z = (
4360: 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d 3e 74  char *)pRight->t
4370: 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f 72 28 63 6e  oken.z;.  for(cn
4380: 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  t=0; (c=z[cnt])!
4390: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
43a0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
43b0: 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b 2b 29 7b 7d  =wc[2]; cnt++){}
43c0: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c  .  if( cnt==0 ||
43d0: 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d   255==(u8)z[cnt]
43e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
43f0: 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70  ;.  }.  *pisComp
4400: 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77  lete = z[cnt]==w
4410: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
4420: 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72  ==0;.  *pnPatter
4430: 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75 72  n = cnt;.  retur
4440: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
4450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
4460: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
4470: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
4480: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
4490: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
44a0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
44b0: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
44c0: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
44d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
44e0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
44f0: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
4500: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
4510: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
4520: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
4530: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
4540: 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20  pDerived->flags 
4550: 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20  |= pBase->flags 
4560: 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  & EP_FromJoin;. 
4570: 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68   pDerived->iRigh
4580: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61  tJoinTable = pBa
4590: 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  se->iRightJoinTa
45a0: 62 6c 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ble;.}.../*.** T
45b0: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
45c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
45d0: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
45e0: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
45f0: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
4600: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
4610: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
4620: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
4630: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
4640: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
4650: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
4660: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
4670: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
4680: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
4690: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
46a0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
46b0: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
46c0: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
46d0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
46e0: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
46f0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49  <op> <expr>".  I
4700: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4710: 20 69 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f   is of.** the fo
4720: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
4730: 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59  ere both X and Y
4740: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
4750: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  en the original.
4760: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
4770: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
4780: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 65 78 70   new virtual exp
4790: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  ression of the f
47a0: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58  orm.** "Y <op> X
47b0: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
47c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
47d0: 6e 64 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61  nd analyzed sepa
47e0: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
47f0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
4800: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
4810: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
4820: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
4830: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  se */.  ExprMask
4840: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
4850: 20 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73    /* table masks
4860: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
4870: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
4880: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
4890: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
48a0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
48b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
48c0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
48d0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
48e0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
48f0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
4900: 6d 5d 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m];.  Expr *pExp
4910: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
4920: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  ;.  Bitmask prer
4930: 65 71 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73  eqLeft;.  Bitmas
4940: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69  k prereqAll;.  i
4950: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69  nt nPattern;.  i
4960: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a  nt isComplete;..
4970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
4980: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
4990: 74 75 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65  turn;.  prereqLe
49a0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
49b0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
49c0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
49d0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
49e0: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
49f0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
4a00: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d  ==0 );.    pTerm
4a10: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
4a20: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4a30: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
4a40: 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20 20  pr->pList).     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 7c 20 65 78 70 72 53 65 6c 65 63       | exprSelec
4a70: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4a80: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 53 65  kSet, pExpr->pSe
4a90: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lect);.  }else{.
4aa0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
4ab0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
4ac0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4ad0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
4ae0: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
4af0: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
4b00: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
4b10: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
4b20: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
4b30: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4b40: 7b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  {.    prereqAll 
4b50: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
4b60: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
4b70: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
4b80: 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  }.  pTerm->prere
4b90: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
4ba0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  ;.  pTerm->leftC
4bb0: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54  ursor = -1;.  pT
4bc0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
4bd0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  1;.  pTerm->eOpe
4be0: 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28  rator = 0;.  if(
4bf0: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
4c00: 2d 3e 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  ->op) && (pTerm-
4c10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
4c20: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
4c30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
4c40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
4c50: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
4c60: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
4c70: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
4c80: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4c90: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
4ca0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
4cb0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
4cc0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c    pTerm->leftCol
4cd0: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
4ce0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72  lumn;.      pTer
4cf0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f  m->eOperator = o
4d00: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 45 78 70  peratorMask(pExp
4d10: 72 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  r->op);.    }.  
4d20: 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20    if( pRight && 
4d30: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
4d40: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57  OLUMN ){.      W
4d50: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a  hereTerm *pNew;.
4d60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
4d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
4d80: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
4d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
4da0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
4db0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
4dc0: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
4dd0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
4de0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
4df0: 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d  (pWC, pDup, TERM
4e00: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
4e10: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
4e20: 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20  if( idxNew==0 ) 
4e30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
4e40: 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69  pNew = &pWC->a[i
4e50: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20  dxNew];.        
4e60: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20  pNew->iParent = 
4e70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
4e80: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
4e90: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
4ea0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
4eb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54   = 1;.        pT
4ec0: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
4ed0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
4ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4ef0: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
4f00: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
4f10: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
4f20: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44    exprCommute(pD
4f30: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
4f40: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
4f50: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
4f60: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
4f70: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
4f80: 65 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ew->leftColumn =
4f90: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
4fa0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
4fb0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
4fc0: 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  qLeft;.      pNe
4fd0: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
4fe0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
4ff0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
5000: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
5010: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
5020: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
5030: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
5040: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
5050: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
5060: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
5070: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
5080: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
5090: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
50a0: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
50b0: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
50c0: 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  mplements..  */.
50d0: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
50e0: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
50f0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
5100: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
5110: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  >pList;.    int 
5120: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
5130: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
5140: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
5150: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
5160: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
5170: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
5180: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
5190: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
51a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
51b0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
51c0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
51d0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
51e0: 70 72 28 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74  pr(ops[i], sqlit
51f0: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 2d  e3ExprDup(pExpr-
5200: 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20  >pLeft),.       
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5230: 72 44 75 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  rDup(pList->a[i]
5240: 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20  .pExpr), 0);.   
5250: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
5260: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
5270: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
5280: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
5290: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65  YNAMIC);.      e
52a0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
52b0: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20   pMaskSet, pWC, 
52c0: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  idxNew);.      p
52d0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
52e0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
52f0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
5300: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
5310: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
5320: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
5330: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5340: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
5350: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5360: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5370: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
5380: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
5390: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
53a0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
53b0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e  * Attempt to con
53c0: 76 65 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  vert OR-connecte
53d0: 64 20 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20  d terms into an 
53e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74  IN operator so t
53f0: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  hat.  ** they ca
5400: 6e 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e  n make use of in
5410: 64 69 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  dices.  Example:
5420: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
5430: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
5440: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
5450: 3d 20 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a  = expr3.  **.  *
5460: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
5470: 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nto.  **.  **   
5480: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
5490: 78 70 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2a  xpr2,expr3).  **
54a0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d  .  ** This optim
54b0: 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ization must be 
54c0: 6f 6d 69 74 74 65 64 20 69 66 20 4f 4d 49 54 5f  omitted if OMIT_
54d0: 53 55 42 51 55 45 52 59 20 69 73 20 64 65 66 69  SUBQUERY is defi
54e0: 6e 65 64 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ned because.  **
54f0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f   the compiler fo
5500: 72 20 74 68 65 20 74 68 65 20 49 4e 20 6f 70 65  r the the IN ope
5510: 72 61 74 6f 72 20 69 73 20 70 61 72 74 20 6f 66  rator is part of
5520: 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 20 20   sub-queries..  
5530: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
5540: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
5550: 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20  {.    int ok;.  
5560: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
5570: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75  int iColumn, iCu
5580: 72 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43  rsor;.    WhereC
5590: 6c 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57  lause sOr;.    W
55a0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
55b0: 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  m;..    assert( 
55c0: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
55d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30  TERM_DYNAMIC)==0
55e0: 20 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   );.    whereCla
55f0: 75 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57  useInit(&sOr, pW
5600: 43 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20 20  C->pParse);.    
5610: 77 68 65 72 65 53 70 6c 69 74 28 26 73 4f 72 2c  whereSplit(&sOr,
5620: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
5630: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41      exprAnalyzeA
5640: 6c 6c 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ll(pSrc, pMaskSe
5650: 74 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73  t, &sOr);.    as
5660: 73 65 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e  sert( sOr.nTerm>
5670: 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  0 );.    j = 0;.
5680: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 43      do{.      iC
5690: 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d  olumn = sOr.a[j]
56a0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
56b0: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72     iCursor = sOr
56c0: 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72  .a[j].leftCursor
56d0: 3b 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75  ;.      ok = iCu
56e0: 72 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66  rsor>=0;.      f
56f0: 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31  or(i=sOr.nTerm-1
5700: 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b  , pOrTerm=sOr.a;
5710: 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d   i>=0 && ok; i--
5720: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
5730: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
5740: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
5750: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _EQ ){.         
5760: 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73   goto or_not_pos
5770: 73 69 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d  sible;.        }
5780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
5790: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
57a0: 3d 3d 69 43 75 72 73 6f 72 20 26 26 20 70 4f 72  ==iCursor && pOr
57b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
57c0: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
57d0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
57e0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  flags |= TERM_OR
57f0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
5800: 73 65 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d  se if( (pOrTerm-
5810: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
5820: 50 49 45 44 29 21 3d 30 20 7c 7c 0a 20 20 20 20  PIED)!=0 ||.    
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 28 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73  ((pOrTerm->flags
5850: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5860: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
5870: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 4f 72              (sOr
5880: 2e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  .a[pOrTerm->iPar
5890: 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52  ent].flags & TER
58a0: 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 29 20 29 7b 0a  M_OR_OK)!=0) ){.
58b0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
58c0: 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52  m->flags &= ~TER
58d0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
58e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
58f0: 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20    ok = 0;.      
5900: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5910: 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28  }while( !ok && (
5920: 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73  sOr.a[j++].flags
5930: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21   & TERM_COPIED)!
5940: 3d 30 20 26 26 20 6a 3c 73 4f 72 2e 6e 54 65 72  =0 && j<sOr.nTer
5950: 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20  m );.    if( ok 
5960: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  ){.      ExprLis
5970: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  t *pList = 0;.  
5980: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20      Expr *pNew, 
5990: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 66 6f 72  *pDup;.      for
59a0: 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20  (i=sOr.nTerm-1, 
59b0: 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69  pOrTerm=sOr.a; i
59c0: 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20  >=0 && ok; i--, 
59d0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
59e0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
59f0: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  ->flags & TERM_O
5a00: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
5a10: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75  nue;.        pDu
5a20: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
5a30: 75 70 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  up(pOrTerm->pExp
5a40: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
5a50: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
5a60: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5a70: 64 28 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30  d(pList, pDup, 0
5a80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5a90: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
5aa0: 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  xpr(TK_COLUMN, 0
5ab0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
5ac0: 66 28 20 70 44 75 70 20 29 7b 0a 20 20 20 20 20  f( pDup ){.     
5ad0: 20 20 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20     pDup->iTable 
5ae0: 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
5af0: 20 20 20 70 44 75 70 2d 3e 69 43 6f 6c 75 6d 6e     pDup->iColumn
5b00: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = iColumn;.    
5b10: 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20 3d    }.      pNew =
5b20: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
5b30: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
5b40: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
5b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
5b60: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
5b70: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
5b80: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
5b90: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
5ba0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
5bb0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
5bc0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
5bd0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
5be0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
5bf0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
5c00: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
5c10: 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43  c, pMaskSet, pWC
5c20: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
5c30: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
5c40: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
5c50: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5c60: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
5c70: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
5c80: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
5c90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5cb0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
5cc0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
5cd0: 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62   }.or_not_possib
5ce0: 6c 65 3a 0a 20 20 20 20 77 68 65 72 65 43 6c 61  le:.    whereCla
5cf0: 75 73 65 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a  useClear(&sOr);.
5d00: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5d10: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
5d20: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
5d30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5d40: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
5d50: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
5d60: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
5d70: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
5d80: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
5d90: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
5da0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
5db0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43  isLikeOrGlob(pWC
5dc0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  ->pParse->db, pE
5dd0: 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20  xpr, &nPattern, 
5de0: 26 69 73 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a  &isComplete) ){.
5df0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c      Expr *pLeft,
5e00: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78   *pRight;.    Ex
5e10: 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72  pr *pStr1, *pStr
5e20: 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  2;.    Expr *pNe
5e30: 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70  wExpr1, *pNewExp
5e40: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
5e50: 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20  ew1, idxNew2;.. 
5e60: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
5e70: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
5e80: 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20  xpr;.    pRight 
5e90: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
5ea0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
5eb0: 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33 45  pStr1 = sqlite3E
5ec0: 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30  xpr(TK_STRING, 0
5ed0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
5ee0: 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20   pStr1 ){.      
5ef0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
5f00: 28 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20  (&pStr1->token, 
5f10: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
5f20: 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f  .      pStr1->to
5f30: 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e  ken.n = nPattern
5f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72  ;.    }.    pStr
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
5f60: 75 70 28 70 53 74 72 31 29 3b 0a 20 20 20 20 69  up(pStr1);.    i
5f70: 66 28 20 70 53 74 72 32 20 29 7b 0a 20 20 20 20  f( pStr2 ){.    
5f80: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 32 2d    assert( pStr2-
5f90: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20  >token.dyn );.  
5fa0: 20 20 20 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74      ++*(u8*)&pSt
5fb0: 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74  r2->token.z[nPat
5fc0: 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  tern-1];.    }. 
5fd0: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
5fe0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 47 45  qlite3Expr(TK_GE
5ff0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
6000: 28 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20  (pLeft), pStr1, 
6010: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
6020: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
6030: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
6040: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
6050: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
6060: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
6070: 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20  pSrc, pMaskSet, 
6080: 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
6090: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
60a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4c 54  qlite3Expr(TK_LT
60b0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
60c0: 28 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c 20  (pLeft), pStr2, 
60d0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20  0);.    idxNew2 
60e0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
60f0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
6100: 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r2, TERM_VIRTUAL
6110: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
6120: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
6130: 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20  pSrc, pMaskSet, 
6140: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
6150: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
6160: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
6170: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
6180: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
6190: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
61a0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
61b0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
61c0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
61d0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
61e0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
61f0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
6200: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
6210: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
6220: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
6230: 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65  s routine decide
6240: 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65  s if pIdx can be
6250: 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79   used to satisfy
6260: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
6270: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20   clause.  If it 
6280: 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20  can, it returns 
6290: 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e  1.  If pIdx cann
62a0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  ot satisfy the.*
62b0: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
62c0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
62d0: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a  returns 0..**.**
62e0: 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20   pOrderBy is an 
62f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6300: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
6310: 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69  atement.  pTab i
6320: 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  s the.** left-mo
6330: 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  st table in the 
6340: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
6350: 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20  hat same SELECT 
6360: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a  statement and.**
6370: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
6380: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
6390: 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20  f "base".  pIdx 
63a0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70  is an index on p
63b0: 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f  Tab..**.** nEqCo
63c0: 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  l is the number 
63d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49  of columns of pI
63e0: 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64  dx that are used
63f0: 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   as equality.** 
6400: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e  constraints.  An
6410: 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d  y of these colum
6420: 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  ns may be missin
6430: 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  g from the ORDER
6440: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e   BY.** clause an
6450: 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20  d the match can 
6460: 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65  still be a succe
6470: 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65  ss..**.** All te
6480: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6490: 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61   BY that match a
64a0: 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
64b0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a   must be either.
64c0: 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20  ** ASC or DESC. 
64d0: 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f   (Terms of the O
64e0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70  RDER BY clause p
64f0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
6500: 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78   UNIQUE.** index
6510: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
6520: 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e  satisfy this con
6530: 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a  straint.)  The *
6540: 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a  pbRev value is.*
6550: 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  * set to 1 if th
6560: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6570: 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e  e is all DESC an
6580: 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30  d it is set to 0
6590: 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52   if.** the ORDER
65a0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
65b0: 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63  l ASC..*/.static
65c0: 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e   int isSortingIn
65d0: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
65e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
65f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6600: 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
6610: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx,            /
6620: 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61  * The index we a
6630: 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20  re testing */.  
6640: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
6650: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
6660: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
6670: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
6680: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
6690: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
66a0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
66b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
66c0: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
66d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
66e0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
66f0: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
6700: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
6710: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
6720: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
6730: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
6740: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
6750: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
6760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6770: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
6780: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
6790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
67a0: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
67b0: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
67c0: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
67d0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
6800: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
6810: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6820: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
6830: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
6840: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6850: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
6860: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
6880: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
6890: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
68a0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
68b0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
68c0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
68d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
68e0: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
68f0: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
6900: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
6910: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
6920: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
6930: 65 72 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  erm && i<pIdx->n
6940: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6950: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
6960: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
6970: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
6980: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
6990: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
69a0: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
69b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
69c0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
69d0: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
69e0: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
69f0: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
6a00: 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20  */..    pExpr = 
6a10: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
6a20: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
6a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
6a40: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
6a50: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  e ){.      /* Ca
6a60: 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64  n not use an ind
6a70: 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68  ex sort on anyth
6a80: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
6a90: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  a column in the.
6aa0: 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f        ** left-mo
6ab0: 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  st table of the 
6ac0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
6ad0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6ae0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
6af0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6b00: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
6b10: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
6b20: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
6b30: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6b40: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
6b50: 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn!=pIdx->aiColu
6b60: 6d 6e 5b 69 5d 20 7c 7c 20 0a 20 20 20 20 20 20  mn[i] || .      
6b70: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
6b80: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
6b90: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20  Idx->azColl[i]) 
6ba0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  ){.      /* Term
6bb0: 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20   j of the ORDER 
6bc0: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
6bd0: 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  ot match column 
6be0: 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  i of the index *
6bf0: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45  /.      if( i<nE
6c00: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  qCol ){.        
6c10: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6c20: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f  olumn that is co
6c30: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
6c40: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
6c50: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  n.        ** ORD
6c60: 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74  ER BY term, that
6c70: 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67   is OK.  Just ig
6c80: 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  nore that column
6c90: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
6ca0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6cb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6cc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6cd0: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
6ce0: 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d  olumn fails to m
6cf0: 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20  atch and is not 
6d00: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
6d10: 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  =.        ** the
6d20: 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  n the index cann
6d30: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
6d40: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
6d50: 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
6d60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
6d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6d80: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
6d90: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
6da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
6db0: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
6dc0: 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74  0 || pTerm->sort
6dd0: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
6de0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
6df0: 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 30 20 7c  ortOrder[i]==0 |
6e00: 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
6e10: 65 72 5b 69 5d 3d 3d 31 20 29 3b 0a 20 20 20 20  er[i]==1 );.    
6e20: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20  termSortOrder = 
6e30: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6e40: 5b 69 5d 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72  [i] ^ pTerm->sor
6e50: 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20  tOrder;.    if( 
6e60: 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i>nEqCol ){.    
6e70: 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72    if( termSortOr
6e80: 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29  der!=sortOrder )
6e90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
6ea0: 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ices can only be
6eb0: 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44   used if all ORD
6ec0: 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74  ER BY terms past
6ed0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
6ee0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6ef0: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74  ints are all eit
6f00: 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e  her DESC or ASC.
6f10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
6f20: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
6f40: 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53  ortOrder = termS
6f50: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6f60: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65      j++;.    pTe
6f70: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
6f80: 54 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  The index can be
6f90: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
6fa0: 67 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f  g if all terms o
6fb0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6fc0: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 72 65 20 63  lause.  ** are c
6fd0: 6f 76 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  overed..  */.  i
6fe0: 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20  f( j>=nTerm ){. 
6ff0: 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74     *pbRev = sort
7000: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 20 20 72 65  Order!=0;.    re
7010: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
7020: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7030: 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20   Check table to 
7040: 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52  see if the ORDER
7050: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f   BY clause in pO
7060: 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61  rderBy can be sa
7070: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f  tisfied.** by so
7080: 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f  rting in order o
7090: 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e  f ROWID.  Return
70a0: 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20   true if so and 
70b0: 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65  set *pbRev to be
70c0: 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76  .** true for rev
70d0: 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66  erse ROWID and f
70e0: 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64  alse for forward
70f0: 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f   ROWID order..*/
7100: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
7110: 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69  ableByRowid(.  i
7120: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
7130: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
7140: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
7150: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
7160: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
7170: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
7180: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
7190: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  se */.  int *pbR
71a0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
71b0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
71c0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
71d0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
71e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
71f0: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
7200: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
7210: 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20  Expr>0 );.  p = 
7220: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
7230: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4f 72 64  Expr;.  if( pOrd
7240: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  erBy->nExpr==1 &
7250: 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  & p->op==TK_COLU
7260: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
7270: 3d 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  =base.          
7280: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  && p->iColumn==-
7290: 31 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  1 ){.    *pbRev 
72a0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
72b0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
72c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
72d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
72e0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
72f0: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
7300: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
7310: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
7320: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
7330: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
7340: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
7350: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
7360: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
7370: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
7380: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 73 20  ming operatings 
7390: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
73a0: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
73b0: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
73c0: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
73d0: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
73e0: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
73f0: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
7400: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
7410: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
7420: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
7430: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
7440: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
7450: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
7460: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
7470: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
7480: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
7490: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
74a0: 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63  est index for ac
74b0: 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
74c0: 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74  ular table.  Ret
74d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
74e0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66   to the index, f
74f0: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
7500: 62 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78  be how the index
7510: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c   should be used,
7520: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
7530: 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
7540: 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20  raints, and the 
7550: 22 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20  "cost" for this 
7560: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
7570: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64   lowest cost ind
7580: 65 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f  ex wins.  The co
7590: 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  st is an estimat
75a0: 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20  e of the amount 
75b0: 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69  of.** CPU and di
75c0: 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70  sk I/O need to p
75d0: 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
75e0: 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c  st using the sel
75f0: 65 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20  ected index..** 
7600: 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
7610: 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
7620: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
7630: 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
7640: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
7650: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
7660: 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
7670: 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
7680: 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
7690: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
76a0: 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
76b0: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
76c0: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
76d0: 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
76e0: 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
76f0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
7700: 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
7710: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
7720: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
7730: 65 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  e bestIndex(.  P
7740: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7760: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7770: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
7780: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
7790: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
77a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
77b0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
77c0: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
77d0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
77e0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
77f0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
7800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7810: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
7820: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
7830: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
7840: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
7850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
7860: 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
7870: 20 20 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65    Index **ppInde
7880: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
7890: 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70   Make *ppIndex p
78a0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74  oint to the best
78b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
78c0: 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
78d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66          /* Put f
78e0: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
78f0: 74 68 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a  this choice in *
7900: 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20  pFlags */.  int 
7910: 2a 70 6e 45 71 20 20 20 20 20 20 20 20 20 20 20  *pnEq           
7920: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74          /* Put t
7930: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
7940: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
7950: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57  s here */.){.  W
7960: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
7970: 0a 20 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64  .  Index *bestId
7980: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  x = 0;         /
7990: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 67 69 76  * Index that giv
79a0: 65 73 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  es the lowest co
79b0: 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c  st */.  double l
79c0: 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20  owestCost;      
79d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
79e0: 6f 66 20 75 73 69 6e 67 20 62 65 73 74 49 64 78  of using bestIdx
79f0: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c   */.  int bestFl
7a00: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
7a10: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
7a20: 69 61 74 65 64 20 77 69 74 68 20 62 65 73 74 49  iated with bestI
7a30: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  dx */.  int best
7a40: 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
7a50: 20 20 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75      /* Best valu
7a60: 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69  e for nEq */.  i
7a70: 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
7a80: 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
7a90: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
7aa0: 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
7ab0: 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
7ac0: 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
7ad0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
7ae0: 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
7af0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76  ing */.  int rev
7b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7b20: 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
7b30: 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  order */.  int f
7b40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7b50: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
7b60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7b70: 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20  pProbe */.  int 
7b80: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
7b90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ba0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
7bb0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 64  nstraints */.  d
7bc0: 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
7bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7be0: 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
7bf0: 62 65 20 2a 2f 0a 0a 20 20 54 52 41 43 45 28 28  be */..  TRACE((
7c00: 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d  "bestIndex: tbl=
7c10: 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e  %s notReady=%x\n
7c20: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
7c30: 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29  Name, notReady))
7c40: 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ;.  lowestCost =
7c50: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
7c60: 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63  .  pProbe = pSrc
7c70: 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
7c80: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
7c90: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  le has no indice
7ca0: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
7cb0: 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  no terms in the 
7cc0: 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73  where.  ** claus
7cd0: 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  e that refer to 
7ce0: 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20  the ROWID, then 
7cf0: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  we will never be
7d00: 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a   able to do.  **
7d10: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
7d20: 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c  than a full tabl
7d30: 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74  e scan on this t
7d40: 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20  able.  We might 
7d50: 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74  as.  ** well put
7d60: 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65   it first in the
7d70: 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68   join order.  Th
7d80: 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20  at way, perhaps 
7d90: 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72  it can be.  ** r
7da0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68  eferenced by oth
7db0: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
7dc0: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
7dd0: 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20  ( pProbe==0 &&. 
7de0: 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43      findTerm(pWC
7df0: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
7e00: 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54  O_EQ|WO_IN|WO_LT
7e10: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
7e20: 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20  GE,0)==0 &&.    
7e30: 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c   (pOrderBy==0 ||
7e40: 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69   !sortableByRowi
7e50: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
7e60: 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20  , &rev)) ){.    
7e70: 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  *pFlags = 0;.   
7e80: 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20   *ppIndex = 0;. 
7e90: 20 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20     *pnEq = 0;.  
7ea0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
7eb0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
7ec0: 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f  r a rowid=EXPR o
7ed0: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
7ee0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
7ef0: 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  /.  pTerm = find
7f00: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
7f10: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
7f20: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
7f30: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
7f40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
7f50: 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b     *ppIndex = 0;
7f60: 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d  .    bestFlags =
7f70: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b   WHERE_ROWID_EQ;
7f80: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
7f90: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
7fa0: 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  Q ){.      /* Ro
7fb0: 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20  wid== is always 
7fc0: 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20  the best pick.  
7fd0: 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e  Look no further.
7fe0: 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20    Because only. 
7ff0: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
8000: 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65   row is generate
8010: 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77  d, output is alw
8020: 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ays in sorted or
8030: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46  der */.      *pF
8040: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
8050: 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e  ID_EQ | WHERE_UN
8060: 49 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45  IQUE;.      *pnE
8070: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 54 52 41  q = 1;.      TRA
8080: 43 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73  CE(("... best is
8090: 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20   rowid\n"));.   
80a0: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
80b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45     }else if( (pE
80c0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
80d0: 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b  pr)->pList!=0 ){
80e0: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  .      /* Rowid 
80f0: 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20  IN (LIST): cost 
8100: 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e  is NlogN where N
8110: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
8120: 66 20 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20  f list.      ** 
8130: 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20  elements.  */.  
8140: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
8150: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
8160: 45 78 70 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65  Expr;.      lowe
8170: 73 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67  stCost *= estLog
8180: 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b 0a 20 20  (lowestCost);.  
8190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
81a0: 2a 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45  * Rowid IN (SELE
81b0: 43 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f  CT): cost is Nlo
81c0: 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  gN where N is th
81d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
81e0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
81f0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69   result of the i
8200: 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65  nner select.  We
8210: 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
8220: 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20 2a  estimate.      *
8230: 2a 20 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20  * that value so 
8240: 6d 61 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73  make a wild gues
8250: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65  s. */.      lowe
8260: 73 74 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20  stCost = 200;.  
8270: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
8280: 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73  ... rowid IN cos
8290: 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65  t: %.9g\n", lowe
82a0: 73 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20  stCost));.  }.. 
82b0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
82c0: 20 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65   cost of a table
82d0: 20 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f   scan.  If we do
82e0: 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61   not know how ma
82f0: 6e 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  ny.  ** entries 
8300: 61 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  are in the table
8310: 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20  , use 1 million 
8320: 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f  as a guess..  */
8330: 0a 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65  .  cost = pProbe
8340: 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   ? pProbe->aiRow
8350: 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30  Est[0] : 1000000
8360: 3b 0a 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20  ;.  TRACE(("... 
8370: 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20  table scan base 
8380: 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63  cost: %.9g\n", c
8390: 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d  ost));.  flags =
83a0: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
83b0: 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  GE;..  /* Check 
83c0: 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
83d0: 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f  on a range of ro
83e0: 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20  wids in a table 
83f0: 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  scan..  */.  pTe
8400: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
8410: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
8420: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
8430: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
8440: 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
8450: 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54  ){.    if( findT
8460: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
8470: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
8480: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a  LT|WO_LE, 0) ){.
8490: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
84a0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
84b0: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
84c0: 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20    /* Guess that 
84d0: 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69  rowid<EXPR elimi
84e0: 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73  nates two-thirds
84f0: 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   or rows */.    
8500: 7d 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65  }.    if( findTe
8510: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
8520: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
8530: 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20  T|WO_GE, 0) ){. 
8540: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8550: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
8560: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20       cost /= 3; 
8570: 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
8580: 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e  owid>EXPR elimin
8590: 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
85a0: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d  of rows */.    }
85b0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e  .    TRACE(("...
85c0: 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64   rowid range red
85d0: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
85e0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
85f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73  }else{.    flags
8600: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
8610: 49 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  If the table sca
8620: 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73  n does not satis
8630: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
8640: 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65  clause, increase
8650: 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62  .  ** the cost b
8660: 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72  y NlogN to cover
8670: 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20   the expense of 
8680: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  sorting. */.  if
8690: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
86a0: 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79    if( sortableBy
86b0: 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
86c0: 65 72 42 79 2c 20 26 72 65 76 29 20 29 7b 0a 20  erBy, &rev) ){. 
86d0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
86e0: 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52  ERE_ORDERBY|WHER
86f0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20  E_ROWID_RANGE;. 
8700: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
8710: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8720: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
8730: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8740: 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  e{.      cost +=
8750: 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
8760: 74 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  t);.      TRACE(
8770: 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
8780: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
8790: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
87a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
87b0: 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74   cost<lowestCost
87c0: 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f   ){.    lowestCo
87d0: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62  st = cost;.    b
87e0: 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  estFlags = flags
87f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
8800: 20 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a   at each index..
8810: 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72    */.  for(; pPr
8820: 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
8830: 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
8840: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8860: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8870: 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c      double inMul
8880: 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20  tiplier = 1;..  
8890: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e    TRACE(("... in
88a0: 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f  dex %s:\n", pPro
88b0: 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  be->zName));..  
88c0: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
88d0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
88e0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68   in the index th
88f0: 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65 64  at are satisfied
8900: 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50  .    ** by x=EXP
8910: 52 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  R constraints or
8920: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73   x IN (...) cons
8930: 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  traints..    */.
8940: 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20      flags = 0;. 
8950: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
8960: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  robe->nColumn; i
8970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
8980: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
8990: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  umn[i];.      pT
89a0: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
89b0: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
89c0: 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
89d0: 49 4e 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  IN, pProbe);.   
89e0: 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
89f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
8a00: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
8a10: 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
8a20: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
8a30: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
8a40: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
8a50: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
8a60: 72 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  r;.        flags
8a70: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
8a80: 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
8a90: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21   pExpr->pSelect!
8aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8ab0: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20  inMultiplier *= 
8ac0: 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  100;.        }el
8ad0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
8ae0: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist!=0 ){.      
8af0: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
8b00: 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   *= pExpr->pList
8b10: 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20  ->nExpr + 1;.   
8b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8b30: 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20     }.    cost = 
8b40: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
8b50: 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69  [i] * inMultipli
8b60: 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75  er * estLog(inMu
8b70: 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e  ltiplier);.    n
8b80: 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20  Eq = i;.    if( 
8b90: 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
8ba0: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61  =OE_None && (fla
8bb0: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
8bc0: 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  N_IN)==0.       
8bd0: 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65    && nEq==pProbe
8be0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
8bf0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
8c00: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  E_UNIQUE;.    }.
8c10: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e      TRACE(("....
8c20: 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74  .. nEq=%d inMult
8c30: 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c  =%.9g cost=%.9g\
8c40: 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69  n", nEq, inMulti
8c50: 70 6c 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a  plier, cost));..
8c60: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
8c70: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
8c80: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  s.    */.    if(
8c90: 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
8ca0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  lumn ){.      in
8cb0: 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
8cc0: 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
8cd0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
8ce0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
8cf0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
8d00: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
8d10: 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  _GE, pProbe);.  
8d20: 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
8d30: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
8d40: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
8d50: 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66  ANGE;.        if
8d60: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
8d70: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
8d80: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
8d90: 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
8da0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
8db0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
8dc0: 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d           cost /=
8dd0: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
8de0: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
8df0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
8e00: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
8e10: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20  |WO_GE, pProbe) 
8e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
8e30: 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
8e40: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
8e50: 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20   cost /= 3;.    
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52      }.        TR
8e70: 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e  ACE(("...... ran
8e80: 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ge reduces cost 
8e90: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
8ea0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
8eb0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
8ec0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73  e additional cos
8ed0: 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20  t of sorting if 
8ee0: 74 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72  that is a factor
8ef0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
8f00: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
8f10: 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
8f20: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
8f30: 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
8f40: 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78    isSortingIndex
8f50: 28 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 69  (pParse,pProbe,i
8f60: 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71  Cur,pOrderBy,nEq
8f70: 2c 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20  ,&rev) ){.      
8f80: 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29    if( flags==0 )
8f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
8fa0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
8fb0: 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
8fc0: 7d 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  }.        flags 
8fd0: 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
8fe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
8ff0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  v ){.          f
9000: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
9010: 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d  VERSE;.        }
9020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9030: 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f        cost += co
9040: 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b  st*estLog(cost);
9050: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
9060: 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20  "...... orderby 
9070: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
9080: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
9090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
90a0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
90b0: 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20  o see if we can 
90c0: 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73  get away with us
90d0: 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
90e0: 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ex without.    *
90f0: 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
9100: 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
9110: 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
9120: 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20  then halve the. 
9130: 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68     ** cost of th
9140: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  is index..    */
9150: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
9160: 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  & pSrc->colUsed 
9170: 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  < (((Bitmask)1)<
9180: 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
9190: 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
91a0: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  Src->colUsed;.  
91b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
91c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f   for(j=0; j<pPro
91d0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  be->nColumn; j++
91e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
91f0: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
9200: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
9210: 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20  if( x<BMS-1 ){. 
9220: 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28           m &= ~(
9230: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29  ((Bitmask)1)<<x)
9240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9250: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d    }.      if( m=
9260: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
9270: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
9280: 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63  _ONLY;.        c
9290: 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  ost /= 2;.      
92a0: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
92b0: 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65   idx-only reduce
92c0: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
92d0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
92e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
92f0: 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68   If this index h
9300: 61 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20  as achieved the 
9310: 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66  lowest cost so f
9320: 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e  ar, then use it.
9330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9340: 63 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73  cost < lowestCos
9350: 74 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49  t ){.      bestI
9360: 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  dx = pProbe;.   
9370: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
9380: 63 6f 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  cost;.      asse
9390: 72 74 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a  rt( flags!=0 );.
93a0: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
93b0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62  = flags;.      b
93c0: 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  estNEq = nEq;.  
93d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
93e0: 70 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65  port the best re
93f0: 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49  sult.  */.  *ppI
9400: 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a  ndex = bestIdx;.
9410: 20 20 54 52 41 43 45 28 28 22 62 65 73 74 20 69    TRACE(("best i
9420: 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74  ndex is %s, cost
9430: 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c  =%.9g, flags=%x,
9440: 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
9450: 20 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65      bestIdx ? be
9460: 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22  stIdx->zName : "
9470: 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43  (none)", lowestC
9480: 6f 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20  ost, bestFlags, 
9490: 62 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46  bestNEq));.  *pF
94a0: 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73  lags = bestFlags
94b0: 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74  ;.  *pnEq = best
94c0: 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f  NEq;.  return lo
94d0: 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a  westCost;.}.../*
94e0: 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
94f0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
9500: 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
9510: 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
9520: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
9530: 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
9540: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
9550: 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
9560: 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
9570: 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
9580: 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
9590: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
95a0: 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
95b0: 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
95c0: 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
95d0: 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
95e0: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
95f0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
9600: 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
9610: 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
9620: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
9630: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
9640: 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
9650: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
9660: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
9670: 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
9680: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
9690: 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
96a0: 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
96b0: 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
96c0: 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
96d0: 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
96e0: 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
96f0: 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
9700: 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
9710: 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
9720: 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
9730: 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
9740: 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
9750: 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
9760: 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
9770: 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
9780: 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
9790: 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
97a0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
97b0: 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
97c0: 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
97d0: 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
97e0: 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
97f0: 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
9800: 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
9810: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
9820: 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
9830: 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
9840: 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
9850: 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
9860: 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
9870: 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
9880: 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
9890: 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
98a0: 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
98b0: 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
98c0: 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
98d0: 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
98e0: 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
98f0: 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
9900: 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
9910: 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
9920: 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
9930: 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
9940: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
9950: 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
9960: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
9970: 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
9980: 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
9990: 20 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67   && (pTerm->flag
99a0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
99b0: 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
99c0: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
99d0: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
99e0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
99f0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
9a00: 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
9a10: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
9a20: 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
9a30: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
9a40: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
9a50: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
9a60: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
9a70: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
9a80: 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
9a90: 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
9aa0: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
9ab0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
9ac0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9ad0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ae0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
9af0: 61 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62  at builds a prob
9b00: 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20  e for an index. 
9b10: 20 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20   Details:.**.** 
9b20: 20 20 20 2a 20 20 43 68 65 63 6b 20 74 68 65 20     *  Check the 
9b30: 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72  top nColumn entr
9b40: 69 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ies on the stack
9b50: 2e 20 20 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20  .  If any.**    
9b60: 20 20 20 6f 66 20 74 68 6f 73 65 20 65 6e 74 72     of those entr
9b70: 69 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75  ies are NULL, ju
9b80: 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
9b90: 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20  o brk,.**       
9ba0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 6f 6f  which is the loo
9bb0: 70 20 65 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f  p exit, since no
9bc0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c   index entry wil
9bd0: 6c 20 6d 61 74 63 68 0a 2a 2a 20 20 20 20 20 20  l match.**      
9be0: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
9bf0: 74 68 65 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e  the key is NULL.
9c00: 20 50 6f 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45   Pop (nColumn+nE
9c10: 78 74 72 61 29 20 0a 2a 2a 20 20 20 20 20 20 20  xtra) .**       
9c20: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
9c30: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  e stack..**.**  
9c40: 20 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61    *  Construct a
9c50: 20 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f   probe entry fro
9c60: 6d 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d  m the top nColum
9c70: 6e 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  n entries in.** 
9c80: 20 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20        the stack 
9c90: 77 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20  with affinities 
9ca0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9cb0: 69 6e 64 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20  index pIdx. .** 
9cc0: 20 20 20 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75        Only nColu
9cd0: 6d 6e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  mn elements are 
9ce0: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
9cf0: 73 74 61 63 6b 20 69 6e 20 74 68 69 73 20 63 61  stack in this ca
9d00: 73 65 0a 2a 2a 20 20 20 20 20 20 20 28 62 79 20  se.**       (by 
9d10: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a  OP_MakeRecord)..
9d20: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
9d30: 64 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62  d buildIndexProb
9d40: 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 0a 20  e(.  Vdbe *v, . 
9d50: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20   int nColumn, . 
9d60: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20   int nExtra, .  
9d70: 69 6e 74 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65  int brk, .  Inde
9d80: 78 20 2a 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c  x *pIdx.){.  sql
9d90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9da0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43   OP_NotNull, -nC
9db0: 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64  olumn, sqlite3Vd
9dc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9dd0: 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +3);.  sqlite3Vd
9de0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
9df0: 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72  p, nColumn+nExtr
9e00: 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  a, 0);.  sqlite3
9e10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e20: 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20  Goto, 0, brk);. 
9e30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9e40: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
9e50: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
9e60: 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  .  sqlite3IndexA
9e70: 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
9e80: 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  dx);.}.../*.** G
9e90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
9ea0: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
9eb0: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
9ec0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
9ed0: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
9ee0: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
9ef0: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
9f00: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
9f10: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
9f20: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
9f30: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
9f40: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
9f50: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e  raint is left on
9f60: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
9f70: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
9f80: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
9f90: 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
9fa0: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
9fb0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
9fc0: 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
9fd0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
9fe0: 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
9ff0: 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
a000: 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
a010: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
a020: 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
a030: 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
a040: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
a050: 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f X..*/.static v
a060: 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79  oid codeEquality
a070: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
a080: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
a090: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
a0a0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
a0b0: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
a0c0: 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
a0d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
a0e0: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
a0f0: 20 62 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20   brk,           
a100: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a110: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f   abandon the loo
a120: 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  p */.  WhereLeve
a130: 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68  l *pLevel  /* Wh
a140: 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  en level of the 
a150: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
a160: 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
a170: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
a180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
a190: 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f   if( pX->op!=TK_
a1a0: 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  IN ){.    assert
a1b0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  ( pX->op==TK_EQ 
a1c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
a1d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a1e0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e  X->pRight);.#ifn
a1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a200: 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
a210: 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  {.    int iTab;.
a220: 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20      int *aIn;.  
a230: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a240: 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20  se->pVdbe;..    
a250: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
a260: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 29  lect(pParse, pX)
a270: 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  ;.    iTab = pX-
a280: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
a290: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a2a0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
a2b0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64 62 65  , brk);.    Vdbe
a2c0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25  Comment((v, "# %
a2d0: 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e  .*s", pX->span.n
a2e0: 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a  , pX->span.z));.
a2f0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b      pLevel->nIn+
a300: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 61  +;.    sqliteRea
a310: 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69 64  llocOrFree((void
a320: 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  **)&pLevel->aInL
a330: 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
a360: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  vel->aInLoop[0])
a370: 2a 33 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b  *3*pLevel->nIn);
a380: 0a 20 20 20 20 61 49 6e 20 3d 20 70 4c 65 76 65  .    aIn = pLeve
a390: 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20  l->aInLoop;.    
a3a0: 69 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20 20  if( aIn ){.     
a3b0: 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   aIn += pLevel->
a3c0: 6e 49 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20  nIn*3 - 3;.     
a3d0: 20 61 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78   aIn[0] = OP_Nex
a3e0: 74 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20  t;.      aIn[1] 
a3f0: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49  = iTab;.      aI
a400: 6e 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  n[2] = sqlite3Vd
a410: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
a420: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a  lumn, iTab, 0);.
a430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a440: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30   pLevel->nIn = 0
a450: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a460: 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
a470: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
a480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a490: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
a4a0: 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
a4b0: 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
a4c0: 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
a4d0: 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65  ndex.  The value
a4e0: 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
a4f0: 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f  aints are left o
a500: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  n the stack..**.
a510: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
a520: 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
a530: 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
a540: 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
a550: 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
a560: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a570: 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
a580: 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
a590: 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
a5a0: 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
a5b0: 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
a5c0: 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
a5d0: 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
a5e0: 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
a5f0: 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
a600: 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
a610: 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
a620: 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
a630: 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
a640: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
a650: 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
a660: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
a670: 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
a680: 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
a690: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
a6a0: 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c   and b will be l
a6b0: 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  eft.** on the st
a6c0: 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64  ack - a is the d
a6d0: 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68 65  eepest and b the
a6e0: 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a   shallowest..**.
a6f0: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
a700: 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
a710: 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
a720: 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
a730: 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
a740: 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
a750: 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
a760: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
a770: 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
a780: 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
a790: 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
a7a0: 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
a7b0: 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a  em memory cell..
a7c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a7d0: 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
a7e0: 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
a7f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
a800: 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64   puts.** the add
a810: 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d  ress of that mem
a820: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76  ory cell in pLev
a830: 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63  el->iMem.  The c
a840: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
a850: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
a860: 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e  ill use pLevel->
a870: 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68  iMem to store th
a880: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
a890: 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
a8a0: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
a8b0: 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
a8c0: 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
a8d0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
a8e0: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
a8f0: 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
a900: 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
a910: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
a920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
a930: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
a940: 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
a950: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
a960: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a970: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
a980: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
a990: 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
a9a0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
a9b0: 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
a9c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
a9d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
a9e0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
a9f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
aa00: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
aa10: 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
aa20: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
aa30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20  ed */.  int brk 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa50: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e   Jump here to en
aa60: 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  d the loop */.){
aa70: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65  .  int nEq = pLe
aa80: 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20  vel->nEq;       
aa90: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
aaa0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
aab0: 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
aac0: 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d  /.  int termsInM
aad0: 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  em = 0;         
aae0: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74    /* If true, st
aaf0: 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d  ore value in mem
ab00: 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64  [] cells */.  Vd
ab10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ab20: 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
ab30: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
ab40: 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
ab50: 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
ab60: 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
ab70: 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20  >pIdx;   /* The 
ab80: 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
ab90: 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
aba0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
abb0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
abc0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
abd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
abe0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
abf0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
ac00: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
ac10: 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
ac20: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ac50: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
ac60: 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
ac70: 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
ac80: 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
ac90: 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57  ate them..  ** W
aca0: 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74  e always need at
acb0: 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20   least one used 
acc0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f  to store the loo
acd0: 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a  p terminator.  *
ace0: 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  * value.  If the
acf0: 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74  re are IN operat
ad00: 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f  ors we'll need o
ad10: 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f  ne for each == o
ad20: 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72  r.  ** IN constr
ad30: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65  aint..  */.  pLe
ad40: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
ad50: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66  se->nMem++;.  if
ad60: 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
ad70: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
ad80: 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  N ){.    pParse-
ad90: 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d  >nMem += pLevel-
ada0: 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49  >nEq;.    termsI
adb0: 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  nMem = 1;.  }.. 
adc0: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
add0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
ade0: 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  aints.  */.  for
adf0: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
ae00: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
ae10: 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
ae20: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
ae30: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
ae40: 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
ae50: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
ae60: 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_IN, pIdx);.   
ae70: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
ae80: 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
ae90: 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
aea0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
aeb0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71 75  0 );.    codeEqu
aec0: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
aed0: 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
aee0: 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 74  evel);.    if( t
aef0: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
af00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
af20: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
af30: 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  +j+1, 1);.    }.
af40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
af50: 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =nEq );..  /* Ma
af60: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
af70: 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
af80: 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70  s are on the top
af90: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20   of the stack.  
afa0: 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e  */.  if( termsIn
afb0: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  Mem ){.    for(j
afc0: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
afd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
afe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
aff0: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
b000: 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20  Mem+j+1, 0);.   
b010: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65   }.  }.}..#if de
b020: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
b030: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  T)./*.** The fol
b040: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
b050: 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73  holds a text des
b060: 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72  cription of quer
b070: 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64  y plan generated
b080: 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20  .** by the most 
b090: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
b0a0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
b0b0: 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ().  Each call t
b0c0: 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20  o WhereBegin.** 
b0d0: 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
b0e0: 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69  revious.  This i
b0f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
b100: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
b110: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f  nd.** analysis o
b120: 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  nly..*/.char sql
b130: 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
b140: 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54  BMS*2*40];  /* T
b150: 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ext of the join 
b160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51  */.static int nQ
b170: 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Plan = 0;       
b180: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
b190: 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65  ree slow in _que
b1a0: 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65  ry_plan[] */..#e
b1b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
b1c0: 45 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  EST */..../*.** 
b1d0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
b1e0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
b1f0: 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
b200: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
b210: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
b220: 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
b230: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
b240: 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
b250: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
b260: 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
b270: 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
b280: 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
b290: 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
b2a0: 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
b2b0: 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
b2c0: 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
b2d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
b2e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
b2f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
b300: 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
b310: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
b320: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
b330: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
b340: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
b350: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
b360: 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
b370: 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
b380: 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
b390: 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
b3a0: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
b3b0: 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
b3c0: 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
b3d0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
b3e0: 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
b3f0: 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
b400: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
b410: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
b420: 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
b430: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
b440: 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
b450: 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
b460: 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
b470: 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
b480: 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
b490: 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
b4a0: 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
b4b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
b4c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
b4d0: 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
b4e0: 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
b4f0: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
b500: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
b510: 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
b520: 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
b530: 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
b540: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
b550: 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
b560: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
b570: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
b580: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
b590: 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
b5a0: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
b5b0: 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
b5e0: 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
b5f0: 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
b610: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
b620: 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
b630: 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
b640: 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
b650: 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
b660: 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
b670: 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
b680: 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
b690: 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
b6a0: 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
b6b0: 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
b6c0: 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
b6d0: 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
b6e0: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
b6f0: 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
b700: 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
b710: 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
b720: 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
b730: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
b740: 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
b750: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
b760: 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
b770: 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
b780: 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
b790: 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
b7a0: 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
b7b0: 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
b7c0: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
b7d0: 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
b7e0: 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
b7f0: 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
b800: 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
b810: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b820: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
b830: 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
b840: 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
b850: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
b860: 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
b870: 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
b880: 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
b890: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
b8a0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
b8b0: 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
b8c0: 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
b8d0: 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
b8e0: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
b8f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
b900: 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
b910: 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
b920: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
b930: 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
b940: 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
b950: 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
b960: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
b970: 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
b980: 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
b990: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
b9a0: 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
b9b0: 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
b9c0: 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
b9d0: 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
b9e0: 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
b9f0: 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
ba00: 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
ba10: 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
ba20: 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
ba30: 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
ba40: 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
ba50: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ba60: 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
ba70: 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
ba80: 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
ba90: 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
baa0: 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
bab0: 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
bac0: 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
bad0: 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
bae0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
baf0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
bb00: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
bb10: 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
bb20: 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
bb30: 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
bb40: 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
bb50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
bb60: 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
bb70: 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
bb80: 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
bb90: 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
bba0: 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
bbb0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
bbc0: 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
bbd0: 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
bbe0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
bbf0: 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
bc00: 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
bc10: 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
bc20: 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
bc30: 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
bc40: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
bc50: 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
bc60: 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
bc70: 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
bc80: 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
bc90: 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
bca0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
bcb0: 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
bcc0: 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
bcd0: 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
bce0: 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
bcf0: 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
bd00: 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
bd10: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
bd20: 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
bd30: 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
bd40: 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
bd50: 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
bd60: 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
bd70: 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
bd80: 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
bd90: 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
bda0: 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
bdb0: 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
bdc0: 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
bdd0: 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
bde0: 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
bdf0: 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
be00: 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
be10: 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
be20: 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
be30: 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70  ESSING.**.** *pp
be40: 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
be50: 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
be60: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61  R BY clause of a
be70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
be80: 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  t,.** if there i
be90: 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
bea0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
beb0: 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
bec0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
bed0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
bee0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
bef0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
bf00: 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c  ppOrderBy is NUL
bf10: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  L..**.** If an i
bf20: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
bf30: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74   so that the nat
bf40: 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65  ural output orde
bf50: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  r of the table.*
bf60: 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63  * scan is correc
bf70: 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  t for the ORDER 
bf80: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
bf90: 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73  that index is us
bfa0: 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64  ed and.** *ppOrd
bfb0: 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e  erBy is set to N
bfc0: 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e  ULL.  This is an
bfd0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68   optimization th
bfe0: 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a  at prevents an.*
bff0: 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  * unnecessary so
c000: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
c010: 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78   set if an index
c020: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
c030: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
c040: 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
c050: 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
c060: 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
c070: 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
c080: 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
c090: 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
c0a0: 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
c0b0: 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f  r, then the *ppO
c0c0: 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e  rderBy is unchan
c0d0: 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ged..*/.WhereInf
c0e0: 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
c0f0: 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
c100: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
c110: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
c120: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
c130: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
c140: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
c150: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
c160: 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
c170: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
c180: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
c190: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
c1a0: 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f  t **ppOrderBy  /
c1b0: 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
c1c0: 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
c1d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c200: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
c210: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
c220: 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
c230: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
c240: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
c250: 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
c260: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
c270: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
c280: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
c290: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63   */.  int brk, c
c2a0: 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ont = 0;        
c2b0: 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73   /* Addresses us
c2c0: 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ed during code g
c2d0: 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  eneration */.  B
c2e0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
c2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
c300: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
c310: 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
c320: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
c330: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
c340: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
c350: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
c360: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
c370: 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20  askSet maskSet; 
c380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c390: 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
c3a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c3b0: 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20  e wc;           
c3c0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
c3d0: 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20  ause is divided 
c3e0: 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73  into these terms
c3f0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
c400: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
c410: 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
c420: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
c430: 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
c440: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
c450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
c460: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
c470: 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
c480: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
c4b0: 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
c4c0: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
c4d0: 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
c4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
c4f0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
c500: 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61  f all wc.a[].fla
c510: 67 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  gs */..  /* The 
c520: 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
c530: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
c540: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
c550: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
c560: 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
c570: 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69  itmask .  */.  i
c580: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
c590: 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
c5a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c5b0: 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
c5c0: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
c5d0: 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
c5e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
c5f0: 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
c600: 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
c610: 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
c620: 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
c630: 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
c640: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
c650: 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
c660: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
c670: 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74  MaskSet(&maskSet
c680: 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
c690: 49 6e 69 74 28 26 77 63 2c 20 70 50 61 72 73 65  Init(&wc, pParse
c6a0: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
c6b0: 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  &wc, pWhere, TK_
c6c0: 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
c6d0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
c6e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
c6f0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
c700: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
c710: 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
c720: 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70   value..  */.  p
c730: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  WInfo = sqliteMa
c740: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65  lloc( sizeof(Whe
c750: 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69  reInfo) + pTabLi
c760: 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28  st->nSrc*sizeof(
c770: 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
c780: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
c790: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
c7a0: 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
c7b0: 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49  NoMem;.  }.  pWI
c7c0: 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
c7d0: 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
c7e0: 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
c7f0: 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
c800: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
c810: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c820: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
c830: 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
c840: 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
c850: 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
c860: 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
c870: 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
c880: 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
c890: 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
c8a0: 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
c8b0: 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61  ( pWhere && (pTa
c8c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c  bList->nSrc==0 |
c8d0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
c8e0: 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29 29  onstant(pWhere))
c8f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c900: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
c910: 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
c920: 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20  o->iBreak, 1);. 
c930: 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
c940: 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65   }..  /* Analyze
c950: 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
c960: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
c970: 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
c980: 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
c990: 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
c9a0: 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
c9b0: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
c9c0: 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
c9d0: 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
c9e0: 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
c9f0: 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
ca00: 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
ca10: 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
ca20: 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
ca30: 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
ca40: 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
ca50: 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
ca60: 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ssed..  */.  for
ca70: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
ca80: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
ca90: 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61    createMask(&ma
caa0: 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
cab0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
cac0: 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a    }.  exprAnalyz
cad0: 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
cae0: 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20  maskSet, &wc);. 
caf0: 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
cb00: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
cb10: 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
cb20: 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  nNoMem;.  }..  /
cb30: 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74  * Chose the best
cb40: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
cb50: 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
cb60: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
cb70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
cb80: 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68  loop fills in th
cb90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
cba0: 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ds:.  **.  **   
cbb0: 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78  pWInfo->a[].pIdx
cbc0: 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20        The index 
cbd0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
cbe0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f  level of the loo
cbf0: 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  p..  **   pWInfo
cc00: 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20  ->a[].flags     
cc10: 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20  WHERE_xxx flags 
cc20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
cc30: 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  pIdx.  **   pWIn
cc40: 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20  fo->a[].nEq     
cc50: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
cc60: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
cc70: 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49  aints.  **   pWI
cc80: 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20  nfo->a[].iFrom  
cc90: 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20     When term of 
cca0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ccb0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
ccc0: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
ccd0: 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
cce0: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
ccf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
cd00: 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
cd10: 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
cd20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
cd30: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
cd40: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
cd50: 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f  p also figures o
cd60: 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f  ut the nesting o
cd70: 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  rder of tables i
cd80: 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20  n the FROM.  ** 
cd90: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e  clause..  */.  n
cda0: 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
cdb0: 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65  ask)0;.  pTabIte
cdc0: 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
cdd0: 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  .  pLevel = pWIn
cde0: 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67  fo->a;.  andFlag
cdf0: 73 20 3d 20 7e 30 3b 0a 20 20 54 52 41 43 45 28  s = ~0;.  TRACE(
ce00: 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
ce10: 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
ce20: 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
ce30: 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
ce40: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
ce50: 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
ce60: 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
ce70: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
ce80: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
ce90: 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
cea0: 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
ceb0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ced0: 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64  lags asssociated
cee0: 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
cef0: 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf10: 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
cf20: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
cf30: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  */.    double co
cf40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
cf50: 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66     /* The cost f
cf60: 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
cf70: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
cf80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
cf90: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
cfa0: 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
cfb0: 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
cfc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
cfd0: 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
cfe0: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
cff0: 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73     int bestFlags
d000: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
d010: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
d020: 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
d030: 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71  .    int bestNEq
d040: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d050: 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74   /* nEq associat
d060: 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
d070: 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  .    double lowe
d080: 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
d090: 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20   /* Cost of the 
d0a0: 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
d0b0: 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20   bestJ = 0;     
d0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d0d0: 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
d0e0: 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d100: 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
d110: 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
d120: 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
d130: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d140: 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69   /* True when fi
d150: 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65  rst table is see
d160: 6e 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74  n */..    lowest
d170: 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
d180: 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a  G_DBL;.    for(j
d190: 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d  =iFrom, pTabItem
d1a0: 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
d1b0: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
d1c0: 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65  rc; j++, pTabIte
d1d0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
d1e0: 6f 6e 63 65 20 26 26 20 0a 20 20 20 20 20 20 20  once && .       
d1f0: 20 20 20 28 28 70 54 61 62 49 74 65 6d 2d 3e 6a     ((pTabItem->j
d200: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
d210: 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
d220: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
d230: 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  j>0 && (pTabItem
d240: 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  [-1].jointype & 
d250: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
d260: 53 29 29 21 3d 30 29 29 0a 20 20 20 20 20 20 29  S))!=0)).      )
d270: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
d280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
d290: 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
d2a0: 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
d2b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
d2c0: 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
d2d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d2e0: 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
d2f0: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
d300: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d310: 7d 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62  }.      cost = b
d320: 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
d330: 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
d340: 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
d370: 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
d380: 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
d3a0: 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45  Idx, &flags, &nE
d3b0: 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  q);.      if( co
d3c0: 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b  st<lowestCost ){
d3d0: 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
d3e0: 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73  1;.        lowes
d3f0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
d400: 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
d410: 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  dx;.        best
d420: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
d430: 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d         bestNEq =
d440: 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65   nEq;.        be
d450: 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  stJ = j;.      }
d460: 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
d470: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
d480: 20 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64   choose table %d
d490: 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c   for loop %d\n",
d4a0: 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20   bestJ,.        
d4b0: 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
d4c0: 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28  ->a));.    if( (
d4d0: 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52  bestFlags & WHER
d4e0: 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
d4f0: 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42  .      *ppOrderB
d500: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
d510: 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
d520: 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
d530: 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74  el->flags = best
d540: 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
d550: 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b  l->pIdx = pBest;
d560: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  .    pLevel->nEq
d570: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20   = bestNEq;.    
d580: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
d590: 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
d5a0: 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  >nIn = 0;.    if
d5b0: 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
d5c0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
d5d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d5e0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
d5f0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
d600: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
d610: 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
d620: 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
d630: 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
d640: 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
d650: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
d660: 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20  m = bestJ;.  }. 
d670: 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74   TRACE(("*** Opt
d680: 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
d690: 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ***\n"));..  /* 
d6a0: 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
d6b0: 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
d6c0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
d6d0: 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
d6e0: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
d6f0: 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
d700: 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
d710: 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
d720: 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
d730: 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
d740: 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
d750: 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
d760: 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
d770: 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
d780: 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
d790: 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
d7a0: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
d7b0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
d7c0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
d7d0: 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
d7e0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
d7f0: 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70  fier Goto */.  p
d800: 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
d810: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  a;.  for(i=0, pL
d820: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
d830: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
d840: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
d850: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
d860: 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
d870: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49  to open */.    I
d880: 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20  ndex *pIx;      
d890: 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
d8a0: 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69 66   access pTab (if
d8b0: 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74   any) */.    int
d8c0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
d8d0: 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
d8e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
d8f0: 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
d900: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70   int iIdxCur = p
d910: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
d920: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d930: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
d940: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
d950: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
d960: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
d970: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
d980: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
d990: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
d9a0: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
d9b0: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
d9c0: 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45 20  3MPrintf("TABLE 
d9d0: 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
d9e0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
d9f0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
da00: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
da10: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
da20: 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
da30: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
da40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
da50: 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
da60: 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
da70: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
da80: 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57 49  e3MPrintf("%z WI
da90: 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d  TH INDEX %s", zM
daa0: 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b  sg, pIx->zName);
dab0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dac0: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
dad0: 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
dae0: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
daf0: 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  GE) ){.        z
db00: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
db10: 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20 50  intf("%z USING P
db20: 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
db30: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
db40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
db50: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
db60: 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
db70: 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d  , zMsg, P3_DYNAM
db80: 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
db90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
dba0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
dbb0: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
dbc0: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
dbd0: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
dbe0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
dbf0: 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
dc00: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
dc10: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
dc20: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
dc30: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
dc40: 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d  ansient || pTab-
dc50: 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
dc60: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
dc70: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
dc80: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
dc90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dca0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
dcb0: 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
dcc0: 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
dcd0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
dce0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
dcf0: 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d  Col<(sizeof(Bitm
dd00: 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20  ask)*8) ){.     
dd10: 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
dd20: 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
dd30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
dd40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
dd50: 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
dd60: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
dd70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
dd80: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
dd90: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
dda0: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   n);.        ass
ddb0: 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
ddc0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
ddd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
dde0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
ddf0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
de00: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
de10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
de20: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
de30: 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
de40: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28  iCursor;.    if(
de50: 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
de60: 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
de70: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
de80: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
de90: 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
dea0: 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
deb0: 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
dec0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
ded0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
def0: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
df00: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
df10: 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49  t((v, "# %s", pI
df20: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
df30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
df40: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
df50: 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74   iIdxCur, pIx->t
df60: 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
df70: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
df80: 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46  )pKey, P3_KEYINF
df90: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
dfa0: 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  }.    if( (pLeve
dfb0: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
dfc0: 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  _IDX_ONLY)!=0 ){
dfd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dfe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
dff0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64  tNumColumns, iId
e000: 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75  xCur, pIx->nColu
e010: 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  mn+1);.    }.   
e020: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
e030: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
e040: 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
e050: 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
e060: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e070: 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  dr(v);..  /* Gen
e080: 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
e090: 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
e0a0: 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
e0b0: 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
e0c0: 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
e0d0: 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
e0e0: 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
e0f0: 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
e100: 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
e110: 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
e120: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
e130: 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
e140: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
e150: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
e160: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
e170: 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75  t j;.    int iCu
e180: 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
e190: 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56  ursor;  /* The V
e1a0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
e1b0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
e1c0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
e1d0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
e1e0: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
e1f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
e200: 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
e210: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
e220: 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
e230: 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65     int omitTable
e240: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
e250: 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
e260: 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  x only */.    in
e270: 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
e280: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
e290: 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
e2a0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
e2b0: 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
e2c0: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
e2d0: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
e2e0: 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
e2f0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
e300: 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
e310: 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
e320: 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
e330: 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70  r;.    bRev = (p
e340: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e350: 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
e360: 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20  ;.    omitTable 
e370: 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
e380: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
e390: 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  Y)!=0;..    /* C
e3a0: 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
e3b0: 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
e3c0: 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
e3d0: 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  ructions.    ** 
e3e0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e3f0: 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62  loop.  Jump to b
e400: 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
e410: 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  of a loop..    *
e420: 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
e430: 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
e440: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
e450: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
e460: 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a    ** loop..    *
e470: 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76  /.    brk = pLev
e480: 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65  el->brk = sqlite
e490: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
e4a0: 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c  );.    cont = pL
e4b0: 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c  evel->cont = sql
e4c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
e4d0: 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  l(v);..    /* If
e4e0: 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
e4f0: 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
e500: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
e510: 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20  llocate and.    
e520: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
e530: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
e540: 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
e550: 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
e560: 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66  ny.    ** row of
e570: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
e580: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20  of the join..   
e590: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
e5a0: 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
e5b0: 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69  pTabItem[-1].joi
e5c0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
e5d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
e5e0: 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29   !pParse->nMem )
e5f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
e600: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
e610: 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73  LeftJoin = pPars
e620: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
e630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e640: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
e650: 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
e660: 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
e670: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
e680: 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
e690: 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
e6a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e6b0: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
e6c0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
e6d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
e6e0: 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
e6f0: 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
e700: 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
e710: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   an.      **    
e720: 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
e730: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
e740: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
e750: 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20  d.  Or.      ** 
e760: 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
e770: 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
e780: 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
e790: 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
e7a0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
e7b0: 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20  onstruct..      
e7c0: 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  */.      pTerm =
e7d0: 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
e7e0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
e7f0: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
e800: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
e810: 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
e820: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e830: 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
e840: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
e850: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
e860: 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73  iCur );.      as
e870: 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
e880: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
e890: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
e8a0: 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c  rse, pTerm, brk,
e8b0: 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
e8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e8d0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e8e0: 2c 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  , 1, brk);.     
e8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e900: 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  p(v, OP_NotExist
e910: 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  s, iCur, brk);. 
e920: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e930: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
e940: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
e950: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
e960: 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
e970: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
e980: 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
e990: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
e9a0: 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
e9b0: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
e9c0: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
e9d0: 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
e9e0: 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
e9f0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
ea00: 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
ea10: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
ea20: 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
ea30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
ea40: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
ea50: 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
ea60: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
ea70: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
ea80: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
ea90: 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64       pEnd = find
eaa0: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
eab0: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
eac0: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
ead0: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
eae0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
eaf0: 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   pStart;.       
eb00: 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
eb10: 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
eb20: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
eb30: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
eb40: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
eb50: 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
eb60: 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
eb70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eb80: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
eb90: 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
eba0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
ebb0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
ebc0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ebd0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
ebe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ebf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ec00: 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f  _ForceInt, pX->o
ec10: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e  p==TK_LE || pX->
ec20: 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b  op==TK_GT, brk);
ec30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ec40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65  VdbeAddOp(v, bRe
ec50: 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20  v ? OP_MoveLt : 
ec60: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
ec70: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56   brk);.        V
ec80: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ec90: 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64  pk"));.        d
eca0: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
ecb0: 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
ecc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ecd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ece0: 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  p(v, bRev ? OP_L
ecf0: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
ed00: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
ed10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ed20: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45  End ){.        E
ed30: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
ed40: 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
ed50: 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
ed60: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
ed70: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
ed80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
ed90: 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ur );.        sq
eda0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
edb0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
edc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
edd0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
ede0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
edf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee00: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
ee10: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
ee20: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
ee30: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
ee40: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
ee50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
ee60: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
ee70: 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
ee80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee90: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
eea0: 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
eeb0: 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Gt;.        }.  
eec0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
eed0: 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
eee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
eef0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
ef00: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ef10: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
ef20: 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
ef30: 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
ef40: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
ef50: 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
ef60: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
ef70: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  ;.      if( test
ef80: 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
ef90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
efa0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
efb0: 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  wid, iCur, 0);. 
efc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
efd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
efe0: 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
eff0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
f000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f010: 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c  p(v, testOp, SQL
f020: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
f030: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
f040: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
f050: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
f060: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
f070: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
f080: 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c   3: The WHERE cl
f090: 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72  ause term that r
f0a0: 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67  efers to the rig
f0b0: 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ht-most.      **
f0c0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
f0d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
f0e0: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
f0f0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
f100: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
f110: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e   the index is on
f120: 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65   (x,y,z) and the
f130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
f140: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
f150: 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78           form "x
f160: 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65  =5 AND y<10" the
f170: 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75  n this case is u
f180: 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20  sed.  Only the. 
f190: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f1a0: 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
f1b0: 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
f1c0: 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
f1d0: 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  t must.      ** 
f1e0: 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
f1f0: 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
f200: 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
f210: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
f220: 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
f230: 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
f240: 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
f250: 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a  E clause.      *
f260: 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
f270: 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
f280: 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
f290: 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
f2a0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
f2b0: 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
f2c0: 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
f2d0: 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
f2e0: 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  R BY..      */. 
f2f0: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
f300: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
f310: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20  pLevel->nEq;.   
f320: 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20     int topEq=0; 
f330: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f340: 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73  f top limit uses
f350: 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74   ==. False is st
f360: 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20  rictly < */.    
f370: 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20    int btmEq=0;  
f380: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f390: 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20   btm limit uses 
f3a0: 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72  ==. False if str
f3b0: 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20  ictly > */.     
f3c0: 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f   int topOp, btmO
f3d0: 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72  p;   /* Operator
f3e0: 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e  s for the top an
f3f0: 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20  d bottom search 
f400: 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20  bounds */.      
f410: 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20  int testOp;.    
f420: 20 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20    int nNotNull; 
f430: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f440: 6f 66 20 72 6f 77 73 20 6f 66 20 69 6e 64 65 78  of rows of index
f450: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6e 6f   that must be no
f460: 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  n-NULL */.      
f470: 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28  int topLimit = (
f480: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
f490: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
f4a0: 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  !=0;.      int b
f4b0: 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  tmLimit = (pLeve
f4c0: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
f4d0: 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _BTM_LIMIT)!=0;.
f4e0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
f4f0: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
f500: 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
f510: 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
f520: 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a  = or IN.      **
f530: 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76   and level the v
f540: 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
f550: 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63  erms on the stac
f560: 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
f570: 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74    codeAllEqualit
f580: 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
f590: 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52  Level, &wc, notR
f5a0: 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20  eady, brk);..   
f5b0: 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20     /* Duplicate 
f5c0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
f5d0: 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65  m values because
f5e0: 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62   they will all b
f5f0: 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  e.      ** used 
f600: 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d  twice: once to m
f610: 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ake the terminat
f620: 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65  ion key and once
f630: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20   to make the.   
f640: 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e     ** start key.
f650: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f660: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
f670: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  j++){.        sq
f680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f690: 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c  , OP_Dup, nEq-1,
f6a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
f6b0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
f6c0: 74 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f  t what compariso
f6d0: 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75  n operators to u
f6e0: 73 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62  se for top and b
f6f0: 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ottom .      ** 
f700: 73 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46  search bounds. F
f710: 6f 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  or an ascending 
f720: 69 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f  index, the botto
f730: 6d 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f  m bound is a > o
f740: 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70  r >=.      ** op
f750: 65 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74  erator and the t
f760: 6f 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20  op bound is a < 
f770: 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20  or <= operator. 
f780: 20 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e   For a descendin
f790: 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78  g.      ** index
f7a0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61   the operators a
f7b0: 72 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20  re reversed..   
f7c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74     */.      nNot
f7d0: 4e 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70  Null = nEq + top
f7e0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28  Limit;.      if(
f7f0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
f800: 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
f810: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20  O_ASC ){.       
f820: 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   topOp = WO_LT|W
f830: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74  O_LE;.        bt
f840: 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47  mOp = WO_GT|WO_G
f850: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
f860: 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20          topOp = 
f870: 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20  WO_GT|WO_GE;.   
f880: 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f       btmOp = WO_
f890: 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20  LT|WO_LE;.      
f8a0: 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c    SWAP(int, topL
f8b0: 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b  imit, btmLimit);
f8c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f8d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
f8e0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e  termination key.
f8f0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65    This is the ke
f900: 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20  y value that.   
f910: 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74     ** will end t
f920: 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72  he search.  Ther
f930: 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74  e is no terminat
f940: 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65  ion key if there
f950: 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f  .      ** are no
f960: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
f970: 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74  and no "X<..." t
f980: 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  erm..      **.  
f990: 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
f9a0: 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65  04: On a reverse
f9b0: 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65  -order scan, the
f9c0: 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d   so-called "term
f9d0: 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a  ination".      *
f9e0: 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68  * key computed h
f9f0: 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20  ere really ends 
fa00: 75 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61  up being the sta
fa10: 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  rt key..      */
fa20: 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69  .      if( topLi
fa30: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45  mit ){.        E
fa40: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
fa50: 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
fa60: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
fa70: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
fa80: 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
fa90: 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70  k, notReady, top
faa0: 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  Op, pIdx);.     
fab0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
fac0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
fad0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
fae0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
faf0: 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
fb00: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
fb10: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
fb20: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fb30: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
fb40: 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d  .        topEq =
fb50: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fb60: 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
fb70: 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  );.        disab
fb80: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
fb90: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74  Term);.        t
fba0: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45  estOp = OP_IdxGE
fbb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fbc0: 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
fbd0: 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45  nEq>0 ? OP_IdxGE
fbe0: 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   : OP_Noop;.    
fbf0: 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20      topEq = 1;. 
fc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fc10: 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
fc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
fc30: 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70  nCol = nEq + top
fc40: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
fc50: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
fc60: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
fc70: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
fc80: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e  Probe(v, nCol, n
fc90: 45 71 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a  Eq, brk, pIdx);.
fca0: 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76          if( bRev
fcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
fcc0: 74 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f  t op = topEq ? O
fcd0: 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f  P_MoveLe : OP_Mo
fce0: 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veLt;.          
fcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd00: 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
fd10: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d   brk);.        }
fd20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fd30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd40: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
fd50: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
fd60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
fd70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
fd80: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  v ){.        sql
fd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fda0: 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75   OP_Last, iIdxCu
fdb0: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
fdc0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
fdd0: 61 74 65 20 74 68 65 20 73 74 61 72 74 20 6b 65  ate the start ke
fde0: 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
fdf0: 6b 65 79 20 74 68 61 74 20 64 65 66 69 6e 65 73  key that defines
fe00: 20 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20   the lower.     
fe10: 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65   ** bound on the
fe20: 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20   search.  There 
fe30: 69 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20  is no start key 
fe40: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
fe50: 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74        ** equalit
fe60: 79 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74  y terms and if t
fe70: 68 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e  here is no "X>..
fe80: 2e 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20  ." term.  In.   
fe90: 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c     ** that case,
fea0: 20 67 65 6e 65 72 61 74 65 20 61 20 22 52 65 77   generate a "Rew
feb0: 69 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  ind" instruction
fec0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
fed0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20  .      ** start 
fee0: 6b 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20  key search..    
fef0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30    **.      ** 20
ff00: 30 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68  02-Dec-04: In th
ff10: 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 76 65  e case of a reve
ff20: 72 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68  rse-order search
ff30: 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a  , the so-called.
ff40: 20 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22        ** "start"
ff50: 20 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73   key really ends
ff60: 20 75 70 20 62 65 69 6e 67 20 75 73 65 64 20 61   up being used a
ff70: 73 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  s the terminatio
ff80: 6e 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  n key..      */.
ff90: 20 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d        if( btmLim
ffa0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
ffb0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
ffc0: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
ffd0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
ffe0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
fff0: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
10000 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f  , notReady, btmO
10010 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  p, pIdx);.      
10020 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
10030 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58  =0 );.        pX
10040 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
10050 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10060 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
10070 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
10080 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10090 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
100a0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
100b0 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20          btmEq = 
100c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
100d0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
100e0 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
100f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
10100 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
10110 65 7b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71  e{.        btmEq
10120 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10130 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c      if( nEq>0 ||
10140 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20   btmLimit ){.   
10150 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
10160 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a  nEq + btmLimit;.
10170 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64          buildInd
10180 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c  exProbe(v, nCol,
10190 20 30 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a   0, brk, pIdx);.
101a0 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76          if( bRev
101b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c   ){.          pL
101c0 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
101d0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
101e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
101f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10200 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
10210 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
10220 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f      testOp = OP_
10230 49 64 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d  IdxLT;.        }
10240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10250 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f  int op = btmEq ?
10260 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f   OP_MoveGe : OP_
10270 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20  MoveGt;.        
10280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10290 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  Op(v, op, iIdxCu
102a0 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
102b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
102c0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
102d0 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e     testOp = OP_N
102e0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oop;.      }else
102f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10300 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10310 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
10320 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
10330 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
10340 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f  te the the top o
10350 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
10360 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69  there is a termi
10370 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
10380 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74  key we have to t
10390 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79  est for that key
103a0 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68   and abort at th
103b0 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20  e top of the.   
103c0 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
103d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74    */.      start
103e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
103f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
10400 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
10410 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
10420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10430 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10440 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
10450 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10460 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10470 20 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72   testOp, iIdxCur
10480 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
10490 69 66 28 20 28 74 6f 70 45 71 20 26 26 20 21 62  if( (topEq && !b
104a0 52 65 76 29 20 7c 7c 20 28 21 62 74 6d 45 71 20  Rev) || (!btmEq 
104b0 26 26 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20  && bRev) ){.    
104c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
104d0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
104e0 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29   "+", P3_STATIC)
104f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10500 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10510 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10520 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72  _RowKey, iIdxCur
10530 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10540 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10550 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e  OP_IdxIsNull, nN
10560 6f 74 4e 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20  otNull, cont);. 
10570 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61       if( !omitTa
10580 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
10590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
105a0 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
105b0 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
105c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
105d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
105e0 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  Ge, iCur, 0);.  
105f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10600 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
10610 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
10620 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
10630 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
10640 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
10650 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
10660 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
10670 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
10680 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
10690 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
106a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
106b0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
106c0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a  RE_COLUMN_EQ ){.
106d0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a        /* Case 4:
106e0 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e    There is an in
106f0 64 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d  dex and all term
10700 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
10710 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20 20 20  lause that.     
10720 20 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65 66   **          ref
10730 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  er to the index 
10740 75 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f  using the "==" o
10750 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
10760 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10770 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
10780 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
10790 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20 20 20 20  el->nEq;..      
107a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
107b0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
107c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
107d0 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
107e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65  .      ** and le
107f0 61 76 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ave the values o
10800 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e  f those terms on
10810 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
10820 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41    */.      codeA
10830 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
10840 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
10850 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62  &wc, notReady, b
10860 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  rk);..      /* G
10870 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65  enerate a single
10880 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62   key that will b
10890 65 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20 73  e used to both s
108a0 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61  tart and termina
108b0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
108c0 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a  search.      */.
108d0 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
108e0 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 30 2c  Probe(v, nEq, 0,
108f0 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
10900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10910 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
10920 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
10930 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
10940 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 31  Generate code (1
10950 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65  ) to move to the
10960 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
10970 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
10980 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
10990 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f 64  hen generate cod
109a0 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70 73  e (2) that jumps
109b0 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72 20   to "brk" after 
109c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 61  the cursor is pa
109d0 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  st.      ** the 
109e0 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c  last matching el
109f0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
10a00 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28 31  le.  The code (1
10a10 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20 20  ) is executed.  
10a20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69      ** once to i
10a30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 65  nitialize the se
10a40 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20 28  arch, the code (
10a50 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20 62  2) is executed b
10a60 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20 20  efore each.     
10a70 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66   ** iteration of
10a80 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65 65   the scan to see
10a90 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61 73   if the scan has
10aa0 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20   finished. */.  
10ab0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
10ac0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
10ad0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
10ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
10af0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10b00 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43  OP_MoveLe, iIdxC
10b10 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
10b20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
10b30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10b40 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
10b50 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
10b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10b70 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54  ddOp(v, OP_IdxLT
10b80 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
10b90 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
10ba0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
10bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10bc0 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74      /* Scan in t
10bd0 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
10be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
10bf0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10c00 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43  OP_MoveGe, iIdxC
10c10 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
10c20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
10c30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10c40 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
10c50 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
10c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10c70 70 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20  p3(v, OP_IdxGE, 
10c80 69 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b  iIdxCur, brk, "+
10c90 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
10ca0 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f         pLevel->o
10cb0 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
10cc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10cd0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10ce0 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75  P_RowKey, iIdxCu
10cf0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
10d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10d10 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e   OP_IdxIsNull, n
10d20 45 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  Eq, cont);.     
10d30 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
10d40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10d50 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10d60 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
10d70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
10d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d90 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
10da0 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
10db0 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
10dc0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
10dd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
10de0 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73   start;.    }els
10df0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  e{.      /* Case
10e00 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   5:  There is no
10e10 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
10e20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
10e30 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20  plete.      **  
10e40 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
10e50 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
10e60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10e70 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
10e80 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  le==0 );.      a
10e90 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29  ssert( bRev==0 )
10ea0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
10eb0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
10ec0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
10ed0 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
10ee0 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
10ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10f00 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
10f10 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  r, brk);.    }. 
10f20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
10f30 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
10f40 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a  , iCur);..    /*
10f50 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
10f60 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
10f70 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
10f80 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
10f90 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
10fa0 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
10fb0 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
10fc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
10fd0 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63  pTerm=wc.a, j=wc
10fe0 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  .nTerm; j>0; j--
10ff0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
11000 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
11010 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
11020 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
11030 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
11040 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11050 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
11060 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
11070 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
11080 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54 65  ;.      pE = pTe
11090 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
110a0 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
110b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
110c0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
110d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
110e0 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
110f0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
11100 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
11110 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11120 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11130 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20   pE, cont, 1);. 
11140 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
11150 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
11160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
11170 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
11180 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
11190 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
111a0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
111b0 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61  at.    ** at lea
111c0 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
111d0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
111e0 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
111f0 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20  ft table.  .    
11200 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
11210 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
11220 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f        pLevel->to
11230 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
11240 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
11250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11260 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
11270 6e 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  nt, 1, pLevel->i
11280 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
11290 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
112a0 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20   "# record LEFT 
112b0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
112c0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
112d0 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65  a, j=0; j<wc.nTe
112e0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
112f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11300 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
11310 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
11320 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
11330 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
11340 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
11350 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
11360 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
11380 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
11390 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
113a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
113b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f  pTerm->pExpr, co
113c0 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  nt, 1);.        
113d0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
113e0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
113f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
11400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
11410 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
11420 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
11430 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
11440 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
11450 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
11460 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
11470 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
11480 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
11490 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
114a0 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
114b0 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
114c0 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
114d0 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
114e0 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
114f0 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
11500 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
11510 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
11520 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
11530 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
11540 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
11550 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
11560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
11570 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
11580 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
11590 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
115a0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
115b0 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
115c0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
115d0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
115e0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
115f0 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
11600 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
11610 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
11620 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Name;.    n = st
11630 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
11640 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
11650 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
11660 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
11670 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
11680 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
11690 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
116a0 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
116b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
116c0 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20  an], "{}");.    
116d0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
116e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
116f0 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
11700 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11710 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20  [nQPlan], z);.  
11720 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
11730 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
11740 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
11750 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
11760 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ' ';.    }.    i
11770 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
11780 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
11790 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
117a0 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 73  ANGE) ){.      s
117b0 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
117c0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
117d0 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20 20  ], "* ");.      
117e0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
117f0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
11800 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  l->pIdx==0 ){.  
11810 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
11820 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
11830 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a  QPlan], "{} ");.
11840 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
11850 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
11860 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70      n = strlen(p
11870 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
11880 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
11890 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
118a0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
118b0 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
118c0 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
118d0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
118e0 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49  lan], pLevel->pI
118f0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
11900 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
11910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11920 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
11930 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
11940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11950 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
11960 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
11970 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
11980 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
11990 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
119a0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
119b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
119c0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
119d0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
119e0 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
119f0 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
11a00 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
11a10 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
11a20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
11a30 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
11a40 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
11a50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
11a60 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
11a70 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
11a80 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69    */.  pWInfo->i
11a90 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b  Continue = cont;
11aa0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
11ab0 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75  ear(&wc);.  retu
11ac0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
11ad0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
11ae0 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
11af0 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20  ereBeginNoMem:. 
11b00 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
11b10 72 28 26 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  r(&wc);.  sqlite
11b20 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
11b30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11b40 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
11b50 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
11b60 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
11b70 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
11b80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
11b90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11ba0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
11bb0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
11bc0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
11bd0 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
11be0 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
11bf0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
11c00 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
11c10 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
11c20 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
11c30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
11c40 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
11c50 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
11c60 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
11c70 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
11c80 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
11c90 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
11ca0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
11cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11cc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
11cd0 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
11ce0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
11cf0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
11d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d10 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
11d20 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
11d30 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
11d40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11d50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11d60 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
11d70 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49    if( pLevel->nI
11d80 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  n ){.      int *
11d90 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  a;.      int j;.
11da0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
11db0 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76  el->nIn, a=&pLev
11dc0 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d  el->aInLoop[j*3-
11dd0 33 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d  3]; j>0; j--, a-
11de0 3d 33 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  =3){.        sql
11df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11e00 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32   a[0], a[1], a[2
11e10 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
11e20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65    sqliteFree(pLe
11e30 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  vel->aInLoop);. 
11e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
11e50 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
11e60 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
11e70 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
11e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11e90 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
11ea0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
11eb0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
11ec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11ed0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
11ee0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
11ef0 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  sor, 0);.      i
11f00 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  f( pLevel->iIdxC
11f10 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ur>=0 ){.       
11f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f30 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  p(v, OP_NullRow,
11f40 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
11f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11f70 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
11f80 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29   0, pLevel->top)
11f90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11fa0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11fb0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
11fc0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
11fd0 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
11fe0 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
11ff0 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
12000 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
12010 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
12020 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12030 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
12040 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
12050 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
12060 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
12070 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
12080 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
12090 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
120a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
120b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
120c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
120d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
120e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
120f0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
12100 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
12110 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12120 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
12130 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
12140 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
12150 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
12160 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  ent || pTab->pSe
12170 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
12180 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
12190 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
121a0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
121b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
121c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
121d0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
121e0 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d  ursor, 0);.    }
121f0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
12200 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
12210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12220 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12230 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
12240 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
12250 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20 73  /* Make cursor s
12260 75 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f 72  ubstitutions for
12270 20 63 61 73 65 73 20 77 68 65 72 65 20 77 65 20   cases where we 
12280 77 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20 20  want to use.    
12290 2a 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ** just the inde
122a0 78 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66 65  x and never refe
122b0 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 2e  rence the table.
122c0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
122d0 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
122e0 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
122f0 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
12300 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
12310 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
12320 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
12330 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
12340 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
12350 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
12360 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
12370 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
12380 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
12390 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
123a0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
123b0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
123c0 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
123d0 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
123e0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
123f0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
12400 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
12410 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
12420 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
12430 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
12440 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
12450 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
12460 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
12470 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
12480 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
12490 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
124a0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
124b0 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
124c0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
124d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
124e0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
124f0 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
12500 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
12510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12520 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
12530 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
12540 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
12550 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
12560 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
12570 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
12580 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
12590 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
125a0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
125b0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
125c0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
125d0 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
125e0 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
125f0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
12600 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
12610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12630 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
12640 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
12650 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
12660 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
12670 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
12680 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
12690 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
126a0 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
126b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
126c0 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f  pcode==OP_NullRo
126d0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
126e0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
126f0 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Noop;.        }.
12700 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12710 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
12720 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 73 71 6c  eanup.  */.  sql
12730 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  iteFree(pWInfo);
12740 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.